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 * from 表 where 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
</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
这里面一般是他的配置文件
在mybaits中,like位置容易出现注入
锁定一处
跟进
在UserMapperEx.java中发现进行了参数绑定
跟进
发现会调用countUser方法
首先这里实在service层,那么他一定会被Contraller层调用,直接跟进调用
发现存在注入
inxedu
mybatis的sql orm
sql注入可能存在点
deleteArticleByIds方法,来自ArticleService接口
在这里又调用
然后继续跟进红框的代码
上面的意思就是哦按段是否为空,然后进行遍历,继续跟进,这是在service层,下个就要走到Contraller
路由在delete下,获取articelId参数然后赋值给aridarry参数,然后传到deletexxxxxx方法然就是我们跟进的入口,就形成了sql注入
原文始发于微信公众号(T大4的小圈圈):【Java代码审计】sql注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论