0x01 冗长的前奏:
来源于两道CTF题目,引发自闭中的一点点思考。
想中止这一切菜鸡的挣扎。
(顺便分享一篇大佬的SQL注入文章https://blog.youkuaiyun.com/nzjdsds/article/details/86767711)
0x02 CTF中的强行时间盲注
2-1题目情况:
2-2题目思路
先尝试常规方法
admin' and '1'='1 提示密码错误
admin' andd '1'='1 提示数据库操作失败
说明是字符型,没有过滤空格、单引号,我们的语句是生效的。
但发现or if sleep benchmark会被替换成QWQ~卖萌,就没法任意的登录了
(过滤or的坑还在于,information_shcema中有 or )
通过fuzz,测试得出|竖线也会被替换成QWQ~
尝试绕过(利用可能删除SQL语句中的尖括号,重拼接敏感单词)
发现写成 o<a>r 会变成 or
自动删去<a> ,规则是完整尖括号,中间字母开头,例如<abcdefgh12345>都会整个删掉,<1abc>则不删。
原理大概是,为了防止html标签进入数据库,在出库显示的时候,直接html注入,或者xss了,所以做的过滤。
即使成功拼接出了or,还提示数据库错误,无法万能密码登录
想想语句,大概是 select * from user where username='xxx' and password='xxx'
这样的语句,只好盲注,但发现sleep()不能用。
2-3 不用sleep的延时注入
rpad函数
主要MySQL、Oracle中
rpad(str1,length,str2)
如select rpad('abc',10,'z');
abc只有3位,要用7位'z'去凑齐10位length
结果如下:
此函数也有从头截断功能,若需要从abcdef中截取abc,只需要Length为3
第一个参数也可以是数字
那么用这个函数怎么造成延时呢?
1' ^( (ascii(substr(user(),1,1))-99) and (concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),