刚入手这道题目的时候,一脸懵逼。但是擦好看源代码,发现有提示。
进入查看源代码
截图中已经看出了一些障碍,题目过滤了好多sql语句,一开始我尝试sql注入,但是发现没有任何作用,当我看到那些过滤掉的sql语句关键字的时候,就看看有哪些没有过滤掉的,发现or,and,group by这些函数没有被过滤掉。
尝试 'or 1=1#
这里我只在uname里面输入了,然后把后面的注释了。
出现了一颗赛艇。观察源代码。
然后只差一步,但是却卡住。根据上面过滤发现,limit 可以使用,但是不能使用,()。没办法,百度,发现有一个很好用的函数offset。例如:
select * from user limit 2 offset 0
这段代码表示从表的第一行开始,返回两行。
于是尝试使用。
' or 1=1 limit 1 offset 0#
' or 1=1 limit 1 offset 1#
' or 1=1 limit 1 offset 2#
当offset 2的时候,返回的变成一颗赛艇,而0跟1都是 亦可赛艇。
证明表为两行。
又卡住了,百度得到 group by with rollup。实际操作得到,利用该语句,可以在查询的最后一行多出来一个空值。
再加上源代码中提供了一个 == 。NULL跟空字符串是相等的,所以可以使:if($key['pwd'] == $_POST['pwd'])
成立,继而可以得出flag。
所以整个pyload如下:
' or 1=1 group by pwd with rollup limit 1 offset 2#