SQL注入整型报错注入
什么是整型报错注入?
1、整型
我们遇到的GET型注入的URL一般为“.php?id=x”,这个x一般为数字形式,但是在解析过程中并非如此。下面我们来看一种PHP文件中关联MySQL的语句:
$id = $_GET['id'];
$id = addslashes($id);
$query = 'select name,age,email from information where id = "'.$id.'" limit 0,1';
可以看出,$id实际上是以字符串的形式被解析的,因此需要加入闭合字符,使自己的查询语句可以执行。以上面的一段代码为例,为我们构建以下URL:
.php?id=1 and 1=2 union select 1,2,database() %23
那么服务器的查询语句就会变成:
select name,age,email from information where id = "'. 1 and 1=2 union select 1,2,database() #.'" limit 0,1;
我们的查询语句就会变成查询的字段值。因此,我们需要闭合字符来隔开字段值和查询语句。
但是,在一种条件下,我们不需要使用闭合字符。我们先来看PHP语句:
$id = $_GET['id'];
$id = addslashes($id);
$query = 'select name,age,email from information where id = $id limit 0,1';
可以看到,在这条语句中,$id是以整形数字的形式解析的,因此不需要闭合字符。我们输入URL:
.php?id=1 and 1=2 union select 1,2,database() %23
那么服务器的查询语句就会变成:
select name,age,email from information where id = 1 and 1=2 union select 1,2,database() # limit 0,1;
可以直接查询数据库数据。
简而言之,基于整型的SQL注入即存在SQL注入漏洞的URL参数为整数类型,而不是字符,因此不需要闭合字符。
图2 闭合字符错误
2、报错
联合查询可以把我们想要的数据展示在网页上,替代网页上原有的数据内容;而今天我们要讨论的是,网页上没有展示查询结果的地方,也就是说select语句执行结果不能出现在网页上,我们需要让执行结果出现在其它地方,出现在哪呢?出现在报错语句中。
数据库返回到页面上的唯一信息就是MySQL错误。因此,我们需要以一种方式处理我们的查询,以便通过错误获取数据库信息。查询条件必须是正确的,能被后端数据库解释执行,且需产生一个逻辑错误,让数据库信息伴随错误字符串返回。这种注入方法一般是在页面没有显示位、但用echo mysql_error()输出了错误信息的时候使用,它的特点是注入速度快,但是语句较复杂。不能用group_concat()一次性列出所有数据,只能用limit依次猜解。
3、报错函数
updatexml()
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,这一项可以输入一个十六进制形式的字符,如“0x23”等。
第二个参数:XPath_string是Xpath格式的字符串,报错注入时需要写入错误的格式来显示错误的信息。
第三个参数:new_value,String格式,替换查找到的符合条件的数据,在注入中可以加入任意字符。
该函数的作用是改变文档中符合条件的节点的值,改变XML_document中符合XPATH_string的值。
而我们的注入语句为:
Select updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1);
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
ERROR 1105 (HY000): XPATH syntax error: '~5.5.40~'
extractvalue()
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,这一项可以输入一个十六进制形式的字符,如“0x23”等。
第二个参数:XPath_string是Xpath格式的字符串,报错注入时需要写入错误的格式来显示错误的信息。
该函数的作用是从目标XML中返回包含所查询值的字符串。
而我们的注入语句为:
Select extractvalue(1, concat(0x5c,(select user())));
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出
ERROR 1105 (HY000): XPATH syntax error: 'root@localhost'
'root@localhost'是当前的用户,也就是user()的值。
exp()
exp()函数返回e(自然对数的底)的X次方的值。
我们先来看payload:select EXP(~(SELECT * from(select user())a));
当向exp()传递一个大于709的值时,函数exp()就会引起一个溢出错误。
~是一个位运算符,它的作用是按位取反。将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
我们通过子查询与按位求反,造成一个报错,并借由此注出数据。
原文始发于微信公众号(学安全在路上):【web渗透基础练习】SQL整型报错注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论