【Java代码审计】sql注入

admin 2024年2月28日18:56:07评论19 views字数 2226阅读7分25秒阅读模式


Java中数据库交互

JDBC

statement对象

  • 主要用于静态sql语句中

  • 每执行一次都会进行一次编译效率很低

string name = "tom";string sqlstring = "select * from 表 where stu_name = '"+name+"'";Connection conn = open();ResultSet rs = null;Statement stmt = conn.createStatement();rs = stmt.executeQuery(sqlstring);system.out.println(stmt);while (rs.next()){    system.out.print("student_id:" + rs.getInt("student_id") + "t"    + "student_name:" + rs.getString("student_name") + "t"    + "student_age:" + rs.getString("student_age") + "t"    + "student_tale:" + rs.getString("student_tale") + "t")}

如果这里第二行的name可控,那就是sql注入,下面的while只是为了规范化输出

preparedStatement对象

他是参数化查询,预编译

String sql = "select * fromwhere name = ?";Connection conn = open();PreparedStatement pstmt = (PreparedStatement) conn.PreparedStatement(sql);pstmt.setString(1,"tom");pstmt.executeQuery();


Mybaits

Mybatis获取值的方式有两种,分别是${} 和 #{}

在Mybatis里面一般会采用#{}来进行取值,但是也会有特殊情况

like注入

select id="findlike" resultType="com.test.domain.User" parameterType="string">        select * from user where name like   '%#{name}%'    </select>

正确代码

select id="findlike" resultType="com.test.domain.User" parameterType="string">        select * from user where name like   '%${name}%'    </select>

需要使用${}的方式进行取值。

或者是

<select id="findlike" resultType="com.test.domain.User" parameterType="string">        select * from user where name like  #{name}    </select>

测试类:

public void findlike(){        List<User> ming = userDao.findlike("'%'+xiao+'%'");        for (User user1 : ming) {            System.out.println(user1);        }
}

另外还有种写法

<select id="findlike" resultType="com.test.domain.User" parameterType="string">        select * from user where name like concat('%',#{name},'%')    </select>

这里在前面进行加入两个%,再进行传入这样的方式也不会报错,但是使用

#直接拼接%就会报错。

like不能直接使用预编译,如果在没处理好参数的情况下进行传入,也是会产生sql注入的

in后注入

Select * from news where id in (#{id}),

也是拼接使用预编译这样的代码也会报错。

正确写法

Select * from news where id in (${id})

order by 注入

Select * from news where title ='#{titlename}' order by #{time} asc

执行会报错

正确写法

Select * from news where title ='#{titlename}' order by ${time} asc

group by也一样

审计实战

华夏erp

因为这次是为了审计sql注入,我们重点放在sql的orm框架下,他全局采用的mybatis的sql orm

【Java代码审计】sql注入

这里面一般是他的配置文件


【Java代码审计】sql注入

在mybaits中,like位置容易出现注入

【Java代码审计】sql注入

锁定一处

跟进

【Java代码审计】sql注入

在UserMapperEx.java中发现进行了参数绑定

【Java代码审计】sql注入

跟进


【Java代码审计】sql注入

发现会调用countUser方法

【Java代码审计】sql注入

首先这里实在service层,那么他一定会被Contraller层调用,直接跟进调用

【Java代码审计】sql注入

发现存在注入


inxedu

mybatis的sql orm

【Java代码审计】sql注入

sql注入可能存在点


【Java代码审计】sql注入

deleteArticleByIds方法,来自ArticleService接口

【Java代码审计】sql注入

在这里又调用

【Java代码审计】sql注入

然后继续跟进红框的代码

【Java代码审计】sql注入

上面的意思就是哦按段是否为空,然后进行遍历,继续跟进,这是在service层,下个就要走到Contraller

【Java代码审计】sql注入

路由在delete下,获取articelId参数然后赋值给aridarry参数,然后传到deletexxxxxx方法然就是我们跟进的入口,就形成了sql注入


原文始发于微信公众号(T大4的小圈圈):【Java代码审计】sql注入

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月28日18:56:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Java代码审计】sql注入http://cn-sec.com/archives/2534102.html

发表评论

匿名网友 填写信息