Fork me on GitHub

因缺思汀的绕过

访问解题链接去访问题目,可以进行答题。根据web题一般解题思路去解答此题。看源码,请求,响应等。提交与题目要求一致的内容即可返回flag。然后提交正确的flag即可得分。web题主要考察SQL注入,XSS等相关知识。涉及方向较多。此题主要涉及源码审计,MySQL相关的知识。

 

flag格式 CTF{}

解题链接: http://ctf5.shiyanbar.com/web/pcat/index.php

1.查看源代码

2.打开链接http://ctf5.shiyanbar.com/web/pcat/source.txt,出现PHP代码

可以得知数据库中的记录就只有一条,这部分逻辑大概就是通过提交的uname查询出结果,如果结果只有一条则继续,如果查询结果中的pwd字段和post过去的key值相同,则给出flag。
这时就要用到注入的一个小技巧,我们使用group by pwd with rollup 来在查询结果后加一行,并且这一行pwd字段的值为NULL
在mysql官方文档中是这样描述rollup函数的:

 在GROUP BY子句中使用WITH ROLLUP会在数据库中加入一行用来计算总数。
再结合limit和offset就可以写出一个payload
即:输入的用户名为:' or 1=1 group by pwd with rollup limit 1 offset 2 #
#注释
SELECT * FROM interest where uname=' ' or 1=1 
group by pwd with rollup  (在数据库中添加一行使得pwd=NULL)
limit 1 (只查询一行)
offset 2  (从第二行开始查询)

 

注意三点:《1》,关键字被过滤;《2》,单行输出,所以用limit,因为逗号被过滤,所以不用limit 0,1检验行数,在这里等同于 limit 1 offset 0,检验发现只有两行:1' or 1 limit 1 offset 1# 。《3》使pwd为空,有数据的情况下怎么搞出一条空的数据?---那就伪造一条:group by with rollup 是把所有信息在最下面整合汇总一条的功能,并且可指定字段汇总为空!!所以执行:1' or 1=1 group by pwd with rollup limit 1 offset 2# 即可得到flag
此时密码只要为空即可查询成功

 

 

posted @ 2018-11-30 19:36  Jaxjones  阅读(316)  评论(0编辑  收藏  举报