登陆框select绕过

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=(ord(left(database(),1))/**/regexp/**/0x67)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时 是区分大小写的
    反之

0x03 本地搭建测试