详解SQL报错盲注

  • Post category:http

以下是详解SQL报错盲注的完整攻略:

1. 什么是SQL报错盲注

SQL报错盲注是一种“错误抛出型”的SQL注入攻击方式,利用注入语句执行时可能出现的错误信息来判断注入的情况。攻击者通过构造恶意SQL语句,使数据库出现异常或错误,从而获得关键信息,如数据库名称、表名、列名、数据等,从而进行后续攻击。

常见的注入方式包括根据程序返回的错误信息推断注入点、判断绕过技巧(比如字符转义)是否有效、使用外部工具配合手工判断等。

2. SQL报错盲注实现原理

URL参数中注入恶意的SQL语句,绕过输入的过滤和限制,即可操作目标数据库,可能获得敏感信息,实现攻击。具体原理如下:

(1)在URL中构造恶意的SQL语句,例如:

http://example.com/user.php?username=admin';SELECT IF(ASCII(SUBSTRING(database(),1,1))=100,1,1))#

(2)当上述语句被执行时,报错信息如下:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';SELECT IF(ASCII(SUBSTRING(database(),1,1))=100,1,1))#' at line 1

(3)攻击者可以通过解析SQL语法错误得到需要的信息,如是否存在高质量的错误?SQL查询是否执行成功?执行结果中输出的信息是否到达目标?

3. 实现SQL报错盲注

SQL报错注入的具体实现步骤如下:

(1)确定注入点

通过手动或者工具扫描目标网站的URL和表单输入框,寻找是否存在注入点。

(2)测试注入点

构造SQL语句进行测试,比如:

' or '1'='1

如果返回结果正常,则说明存在注入点。

(3)构造恶意SQL语句

根据返回结果构造恶意SQL语句,比如:

' or IF(SUBSTRING(database(),1,1)=115,SLEEP(5),1)=1#

(4)获取错误提示信息

如果存在注入点,执行恶意SQL语句,通过错误提示信息获取注入结果。

4. SQL报错注入的防御方法

以下是一些防御SQL注入的方法:

(1)对用户输入进行过滤处理,对非法字符或者定制化的词汇进行拦截,避免SQL注入。

(2)使用参数化查询或预编译语句。参数化查询可以避免开发人员直接在SQL语句中拼接代码。

(3)限制数据库用户权限。分配最小合法权限,限制查询、写入和删除等操作。

(4)使用检测工具。使用第三方工具对代码和服务器进行扫描和检测,统计出潜在的漏洞方便维护。

5. 示例说明

下面给出两个示例说明:

示例一

(1)URL地址:http://example.com/user.php?id=1

(2)构造payload:http://example.com/user.php?id=1′ and 1=2 union select 1,2,database(),4,5#

(3)执行payload后,返回错误信息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit 0,1' at line 1

根据报错信息可以推断出payload没有成功执行,因此可以根据payload不断修改,直到成功为止。

示例二

(1)URL地址:http://example.com/detail.php?id=1

(2)构造payload:http://example.com/detail.php?id=-1′ union select database(),2,3#

(3)执行payload后,返回错误信息:

Unknown column 'database' in 'field list'

根据报错信息可以推断出payload已经成功执行,数据库名称为“information_schema”。

以上就是详解SQL报错盲注的完整攻略,希望对您有所帮助。