JAVA代码审计之SQL注入
-
三种不同框架类型的SQL
-
JDBC--sql注入
-
Hibernate--sql注入
-
Mybatis、iBatis-- sql注入
-
SQL注入手工审计方法
-
步骤1:全局搜索“+”,找到存在+ 拼接的sql语句,查看参数是否有过滤,一般在DAO层
-
追溯上层函数,直到,doPost(HttpServletRequest request,HttpServletResponse response)
-
查看整个流程中,有没有过滤非法字符串,如果没有,则存在sql注入
-
找到页面publick class LoginServlet extends HttpServlet{ doPost}
-
在web.xml中搜索LoginServlet,里面配置着每个servlet 的路由信息。
-
<servlet-mapping>
-
<servlet-name>loginServlet</servlet-name>
-
<url-pattern>/login</url-pattern>
-
<servlet-mapping>
-
在前端代码中找到login 函数被谁调用
-
本地调试:
-
运行代码,开启后端服务,在doPost函数打断点,多打几个
-
找到页面,当前是登录页面,点击登录,bp截取请求包,点击forword
-
查看代码中断点前后信息
-
SQL注入-JDBC不安全全的
-
statment 不能防止ssql注入
-
“+”号直接拼接 参数(要溯源参数user对象是否有过滤)
-
payload:
-
USER_name1111'or'1'='1'#
-
select * from t_user where userName = ' ''1111'or'1'='1'# " ' and password=' "1111‘
-
# 号后面的信息都给注释掉了
-
修复方案,使用PreparedStatement预处理
-
JDBC--SQL注入遇到like
-
预处理遇到like
-
111' or '%' =’
-
t_grade and gradeName like '%111' or '%'='%'
-
正确写法
-
遇到like的正确写法
-
当SQL注入--JDBC遇到in
-
预处理遇到in 不正确的处理方法
-
正确写法
-
-
Mybatis、iBatis链接方式--sql注入
-
Mybatis直接拼接--${参数}
-
Statmdent不能防止sql注入
-
使用#{}预处理
-
PreparedStatement预处理
-
SQL注入--Mybatis--like防注入
-
MySQL
-
select * from_t_user where name like contact('%',#{name},'%')
-
Oracle
-
select * from t_user where name like'%'||#{name}||'%'
-
Sql Server
-
select * from t_user where name like '%'+#{name} +'%'
-
SQL注入--Mybatis--in 防注入
-