您的位置:

如何通过盲注攻击进行数据库注入

在网络安全领域中,“注入攻击”一直都是一个非常重要的话题。可以通过恶意注入攻击从正常的应用程序或网站中窃取数据,或者更具破坏性地篡改或删除数据。在这里,我们将重点关注“盲注攻击”以及如何使用它来进行数据库注入。盲注攻击是一种注入攻击,它是通过构造一个特定的查询方法对数据库进行操作,从而泄漏敏感信息或篡改数据,而在这个过程中并不会抛出两个SQL语句不一样的异常错误。

一、盲注攻击概述

1、什么是盲注攻击?

盲注攻击又称为布尔盲注式攻击,在一定程度上是一种黑客攻击技术。在直接披露数据库版本和表名的经典SQL注入技术难以实现时,盲注便可派上用场。

2、盲注攻击原理理解

盲注攻击能够成功的核心原理就是对于’ if a then b else c’ 这种条件语句进行猜测,如果条件成立,会返回真,如果条件不成立,则会返回假。在SQL注入过程中,黑客通过类似的方法,来进行猜测和判断。黑客常常向数据库发出一些条件语句,而数据库则会根据传入的条件判断结果进行返回。因此,攻击者可以通过构建条件语句,来获取一些敏感性数据或进行数据库的篡改。

3、盲注攻击特点

盲注攻击的特点就是不需要对目标进行过多的说明。可以说,盲注阶段披露的信息很少,信息比较难以获取。相比于其他的攻击方式,盲注攻击更加隐匿。

二、盲注攻击常见方式

1、bool盲注

bool盲注式是盲注攻击中经典的一种方式。正如其名,它是基于布尔类型函数运算的注入方式。攻击者通过在网站表单输入已经构造好的语句,如果返回页面对语句的判断结果是true,则表示存在该语句,否则表示没有该语句。

2、time盲注

time盲注是基于数据查询时间差的注入方式。在判断查询结果时,如果查询结果与预期的结果一致,那么查询的时间差应该是相同的。攻击者通过发送构造的延时函数,判断SQL查询的时间差,从而得出信息是否正确。

3、error-based注入

error-based注入是扫描器内置的一种检查SQL注入方式。它的基础是对查询效果和错误提示信息的对比分析。关键在于抛出各种错误的提示信息。

三、盲注攻击绕过技巧

1、闭合字符漏洞注入

闭合字符是指一个输入框由于少输入了引号等特殊字符,导致引号或其他正则符被丢失,从而产生注入。黑客可通过此方式很容易的进行一些字符串的盲注,获取数据或进行数据库篡改。

例如JavaScript中拼接SQL语句,前提是要有闭合字符。而当输入一些字符导致自身未闭合的情况下,JS就会将其认为是SQL语句的拼接,从而产生注入。


2、宽字符编码注入

宽字符编码漏洞注入,是对编码方式的一种攻击方式,在网站开发和维护中广泛存在。黑客可以通过一些方法构造代码,来绕过验证码和过滤器,进行数据篡改等操作。

例如,MySQL中GB2312的编码是一个双字节的字符编码,如果黑客将数据提交到PHP上,此时会出现SQL注入漏洞。这是因为PHP默认是UTF-8编码,而MySQL是GB2312编码,黑客通过修改编码方式,就可以达到绕过SQL语句的目的。


四、盲注攻击防范措施

1、参数化查询

参数化查询就是在运行 SQL 之前,将 SQL 中所有的参数全部传入,或者在运行 SQL 之后,将 SQL 计划(执行计划)与参数一起绑定。参数化查询可以有效地避免 SQL 注入攻击,因为在 SQL 执行计划中,参数都是字符串,而没有 SQL 成分了。


$insert = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
$insert->bind_param('ss', $username, $password);
$insert->execute();

2、过滤用户输入

过滤用户输入可以有效地防止有恶意用户在表单中输入特殊字符以执行 SQL 注入攻击。在编写代码时,可以使用 PHP 内置的函数(如`htmlspecialchars()`和`filter_input()`)对用户输入进行过滤,然后在将输入传递给数据库之前对其进行验证。


$username = htmlspecialchars($_POST["username"]);
$password = htmlspecialchars($_POST["password"]);

//使用PDO类
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR);
$stmt->execute();

五、总结

作为一名程序开发人员或安全工程师,如何保证自己的网站应用程序的安全性,避免注入攻击是非常重要的。使用盲注攻击可以非常快速地从受攻击的网站上获取敏感信息或者篡改数据库信息。因此,我们需要加强安全意识,并结合各种技术手段,从不同的层面上保证自己的网站做到足够的安全性。