0x00 原理
思路来自美团杯2021,本来说出题人已经把select通过正则过滤了,就不该总是往用select进行查询那方面想-》 select id from users where username='admin' and password='admin'
0x01 绕过方法
首先我们测出or没被过滤,and被过滤,||没被过滤,异或没被过滤,但是select被过滤了,如果纠结于用盲注,那么就必须要用到select。
然后题目还过滤了单引号,可以用到之前那篇随笔我提到的方法。通过 username=admin\ 去注释掉查询语句中的单引号进行绕过,然后再到密码栏插入payload。
一开始我采用的payload: username=admin&password=|| 1=1 通过这种判断 得到了 页面的提示 no flag here,但是感觉提示的不是很明白。
之后构造了 username=admin&password=1 得到了数据库名的第一个字符是g 最后一个字符是p ,然后 测得数据库有3个字符。
但其实仔细一想这样不行, 因为 select 根本没法用,后面如果要查表 或者 查列都必须用到select。 所以必须换种思路。
0x02 技巧
- 如果是密码框,而且过滤了if,可通过case when...then...else...end替换
如果没过滤的话,猜测密码列就是 password ,所以可在那构造判断,原payload是or//if(password//regexp//0x67,1,0) ,因为前面的用户名是错的,所以是0,实际上是0 or if(password regexp 0x67,1,0) ,
语句逻辑为 如果password列中有0x67转成的字符就返回1,否则返回0
实验:
通过这样构造 查询到了匹配成功时的id, 但是 这样的话 不管 是否匹配 都有查询结果,所以页面可能显示是一样的 难以判断。
所以我们需要改成延时盲注
如果过滤了if 和 逗号 需要改成
or//case//when//password//regexp//binary//0x67//then//sleep(3)//else//112//end;
语句逻辑为 如果 密码匹配到了某个十六进制,实际上就是匹配到了某个确切的字符 就 休眠3秒,通过这种方式判断密码列中的flag,且区分大小写。
binary 是为了防止 出现大小写相同匹配
使用了binary时 是区分大小写的
反之