前言
这道题考察的就是SQL注入,其中过滤了一些关键词,自己没做出来的主要原因是对于注入类型的判断还有注入的姿势仍然不够熟练,并不是题目很难。
WP
进入环境后首先我们发现这是一个Post传id的注入,我们要进行注入的表和列都已经给我们了。经过尝试,发现输入1和2的时候存在有意义内容的回显。
再经过一系列的尝试,发现过滤了很多东西,空格也被过滤了。这时候我在判断注入类型那里出现了问题。我以为是字符型注入。
其实我们输入注入id=2/2
,会发现回显的是id=1的内容,因此判断为数字型注入。
接下来就是如何注入了。这里我经过尝试,发现了和网上的WP稍微有些不同的绕过方法。
因为空格被过滤,但是括号没有被过滤,而且经过尝试,发现各种函数也没有被过滤。因此正常的绕过方式是这样:
if(ascii(substr((select flag from flag),1,1))=102,1,2)
利用if语句,实现布尔注入。利用括号来绕过空格的过滤。经过测试,用TAB或者%09%0a%0d之类这样的绕过方式也可以成功绕过空格。
但是我一开始考虑了其他的问题。这题应该是用正则表达式判断来进行过滤的,正则表达的函数很大可能是strpos这样的,如果传数组进入呢?
发现报错了:
原来用的stripos函数。这时候想到stripos函数的一个漏洞。如果没有找到的话返回的是false,如果找到了但是是在字符串的首位,返回的是0。如果后端用了弱类型比较的话,0==false,这样后面就可以使用被过滤的某一个字符串了。
进行尝试,首先id=1union
:
SQL Injection Checked.
再试试id=union1union
:
bool(false)
说明确实存在这种漏洞。
因此可以可以在输入的参数的第一个位置放上空格,这样就可以绕过空格的过滤,这样注入起来更简单。
if(ascii(substr((select flag from flag),1,1))=102,1,2)
不过后来看了源码,其实用不是弱类型比较,而是if判断:
if(stripos($sql,$blackitem)){return False;}
但是同样存在这样的漏洞。
如果这个题目把括号,tab,以及各种可以充当空格的都给过滤了的话,就只能用这种方法来绕过空格的过滤。不过我在网上找了一些WP,都没有用这个方法的,说明这个stripos在这题的漏洞并没有被发现。
接下来就是写脚本了,我这里就不放了,网上各种脚本都有。