朱振南 金京犬
关键词:SQL注入漏洞;SQL注入攻击;SQL注入检测;SQL注入防御
0 引言
OWASP TOP 10(Open Web Application SecurityProject) 对Web应用程序最常见、最危险的十大安全漏洞进行了综合总结,在2013年版、2017年版和2021 年版中,SQL注入攻击分别被列为第1、1、3位。这份榜单的高排位充分说明了SQL注入攻势的严重性和普遍性。SQL注入漏洞作为一种典型的Web安全高危漏洞,攻击者能够利用未经授权的SQL查询执行恶意操作。这种漏洞的后果包括严重的数据泄露、数据篡改、系统瘫痪以及用户身份盗用等风险。全球范围内,SQL注入攻击已经导致了巨大的经济损失和隐私泄露。所以,针对检测和防御SQL注入攻击研究已成为网络安全研究领域的重要课题。
1 SQL 注入关键词
在SQL注入攻击中,攻击者可以通过在用户输入中插入特殊的SQL代码,来改变原始查询的意图,执行未经授权的操作,获取敏感数据或对数据库进行恶意操作。SQL注入攻击中常见的用于构造恶意SQL 语句的关键词[1]如表1所示。
2 SQL 注入攻击原理
SQL注入攻击[2]是通过向Web应用程序传递恶意构造的SQL查询,来绕过应用程序的输入验证,从而执行非授权的数据库操作。下面以一个简单的例子来说明一下SQL注入攻击原理。
假设有网站的搜索功能,用户可以将自己感兴趣的关键词输入搜索框进行搜索。Search功能的实现,使用了如下 SQL 查询语句:
3 SQL 注入实现方式
攻击者通过在网站的输入字段中插入恶意的SQL代码,从而绕过应用程序的安全驗证,对数据库进行非法操作,常见的SQL注入方式有以下几种。
3.1 堆叠查询注入
攻击者通过在一个SQL查询中嵌入多个查询语句,以执行额外的恶意操作,这种注入方式可以利用数据库的批处理功能,执行多个SQL语句。假定有用户登录功能,用户通过输入用户名和密码的方式进行登录校验。攻击者可以构造恶意的输入,例如在用户名字段中输入 ′ OR 1=1; DROP TABLE users; --。当这个输入被拼接到SQL查询中时,它会变成:
SELECT * FROM users WHERE username = ′′ OR1=1; DROP TABLE users; --′ AND password = ′输入的密码′;
这个恶意的输入利用了堆叠查询注入的特性,将两个SQL语句合并在一起。第一个语句是一个无条件成立的条件,使得查询的结果集不为空;第二个语句是一个危险的操作,删除了users表。因此,这个注入攻击成功地删除了users表。
3.2 基于联合查询的注入
攻击者通过构造恶意的SQL语句,利用UNION关键字,将恶意查询与原始查询的结果合并后进行攻击。如在搜索框中输入‘UNION SELECT username,password FROM users; --。当这一输入被拼接到SQL 查询中时,它会变成:
SELECT * FROM 表名称 WHERE name LIKE‘ % 关键字% UNION SELECT username, password FROMusers; --′;
这个恶意的输入利用了联合查询注入的特性,将原来的查询结果与攻击者构造的查询结果合并在一起。这样,攻击者就能获得users表格中的用户名和密码等敏感资料。
3.3 基于函数报错的注入
攻击者通过updatexml()、extractvalue()、floor()等函数运行的时候,构造一些报错点,可以展示出数据库在执行时产生错误信息,从而从报错信息中获取设定信息。假设有一个用户注册的功能,攻击者构造恶意的输入:
Admin01or updatexml(1, concat(0x7e, database()),0) or。当这个输入被拼接到SQL 查询中时,它会变成:
INSERT INTO users (字段1, 字段2,……,字段n)VALUES ‘( admin01or updatexml(1, concat(0x7e, data?base()),0) or,字段2,……,字段n);
这个恶意的输入利用了错误的注入特性,使得SQL语句执行时产生错误,从而绕过了正常的注册流程,并获取到了当前网站的所使用的数据库名。
3.4 基于真假盲注的注入
开发者在后台使用了错误消息屏蔽方法屏蔽了报错,此时无法根据报错信息来进行注入的判断,在这种情况下,攻击者利用盲注获取设定的信息,真假盲注注入是利用数据库的布尔逻辑判断结果来获取敏感信息。攻击者在用户登录框中输入 ′ OR 1=1AND ′A′=′A。当这个输入被拼接到SQL查询中时,它会变成:
SELECT * FROM users WHERE username = ′′ OR1=1 AND ′A′=′A′ AND password = ′输入密码′;
这个恶意的输入利用了布尔逻辑判断的特性,使得整个条件永远成立。所以,通过这种注入攻击,绕过登录验证,无论用户输入的密码是否正确。
3.5 基于时间盲注的注入
攻击者通过构造恶意的SQL语句,利用数据库的时间延迟函数来判断注入是否成功,从而获取敏感信息。攻击者在搜索框中构造恶意输入′OR SLEEP(5);--。当它被拼接到原SQL查询中时,它会变成:
SELECT * FROM 表名称WHERE name LIKE ′% 关键字%′ OR SLEEP(5); --′;
这个恶意的输入利用了时间延迟函数SLEEP()的特性,使得查询语句执行时会暂停5秒钟,攻击者通过观察所查询的反应时间来判断是否注入成功。
3.6 基于存储过程的注入
基于存储过程的注入[3]是攻击者通过构造恶意的SQL语句,利用数据库中的存储过程进行额外的恶意运算。攻击者能够通过存储过程执行系统命令或访问敏感数据。假设有一个用户注册的功能,攻击者在注册用户名字段中输入 ′; DROP TABLE users; --。当这个输入被拼接到SQL查询中时,它会变成:
这个恶意的输入利用了存储过程的执行方式,将恶意的 SQL 语句作为参数传递给存储过程。这样,攻击者成功地执行了危险的操作,删除了users表。
3.7 基于函数的注入
基于函数的注入[4] 是攻击者通过构造恶意的SQL 语句,利用数据库中的函数来执行额外的恶意操作。攻击者能够执行系统命令,或利用数据库功能访问敏感资料。攻击者在搜索框中构造恶意的输入′;SELECT @@VERSION; --。当这个输入被拼接到SQL查询中时,它会变成:
SELECT * FROM products WHERE name LIKE ′% 关键字%′; SELECT @@VERSION; --′
这个恶意的输入利用了数据库函数@@VERSION,返回数据库的版本信息。通过这个注入攻击,攻击者可以获取到数据库的版本信息,从而了解数据库的漏洞和安全弱点。
3.8 基于批量的注入
基于批量的注入[5]是攻击者通过构造恶意的SQL 语句,将多个注入语句一次性提交给服务器,以提高注入成功的概率。攻击者在注册框中输入大量的恶意语句,例如 ′ OR 1=1; SELECT * FROM users; --。当这个输入被拼接到SQL查询中时,它会变成:
INSERT INTO users (username, password)VALUES (′′ OR 1=1; SELECT * FROM users; --′, ′輸入的密码′), (′恶意用户名1′, ′恶意密码1′), (′恶意用户名2′, ′恶意密码2′), ...;
这个恶意的输入利用了批量插入的特性,将恶意的SQL语句与正常的插入语句一起提交给服务器。这样,攻击者可以一次性插入大量的恶意数据,并且获取到users表中的所有数据。
4 SQL 注入攻击实践案例
网络安全实践中,探索发现某网站“忘记密码”页面存在SQL注入漏洞,利用时间盲注成功绕过了网站绑定的指定邮箱,并获取了敏感信息,攻击过程如下。
Step1:测试是否存在注入漏洞。通过测试语句1′ or sleep(5)#, 发先页面5s后才加载完成,证明数据库执行了休眠5s的操作,存在时间盲注。
Step2:确定查询字段个数。通过数据库order by 语句确定字段个数,构造paylaod: admin′ order by 10# 不报错,而admin′ order by 11# 报错,可确定从表中读取了10个字段值。
Step3:查询数据库版本信息。通过union联合查询的注入可以判断回显字段: 1′ union select 1,2,3,4,5,6,7,8,9,10#。于是把payload改为 1′ union select 1,ver?sion(),3,4,5,6,7,8,9,10#。
5 SQL 注入攻击检测技术
SQL注入攻击对全球经济造成了巨大损失,并导致大量隐私数据被泄露。为了应对这一威胁,针对SQL注入攻击行为检测技术研究也是层出不穷,主要有基于规则的检测、基于机器学习的检测、基于行为分析的检测[6-7],三种检测技术的优缺点如表2所示。
5.1 基于规则的检测技术
基于规则的侦测技术是最早被提出并被广泛应用的SQL注入攻击侦测方法之一。该方法通过事先定义一系列规则,检测输入的SQL语句中是否包含可能引发注入攻击的恶意代码。该方法的优点是简单易行,但缺点是规则的编写和维护较为烦琐,并且无法检测未知的攻击模式。恶意行为是否存在,可以通过这种基于预定规则的检测技术进行检测。在SQL 注入攻击的情况下,定义一些常见的SQL注入关键字,如“DROP”“DELETE”“SELECT”“UPDATE”等。然后,通过输入SQL查询,在查询包含任何关键词的前提下,判断为SQL注入攻击。
5.2 基于机器学习的检测技术
基于机器学习的检测技术通过训练机器学习模型,将正常的SQL语句和恶意的 SQL 语句进行区分,从而能够自动学习和识别恶意行为的模式。常用的机器学习算法包括决策树、支持向量机、神经网络等。这种方法的优点是可以对未知的攻击方式进行侦测,并且具有很高的侦测精确度。然而,基于机器学习的检测方法需要大量的训练数据和计算资源,并且容易受到攻击者的对抗性样本攻击。
5.3 基于行为分析的检测技术
基于行为分析的SQL注入攻击检测技术是近年来的研究热点之一。该方法通过对数据库系统中的SQL查询语句进行分析,检测异常的行为模式。常用的行为分析方法包括序列模式挖掘、聚类分析、关联规则挖掘等。该方法的优点是可以检测复杂的注入攻击模式,并且对于未知的攻击具有一定的适应性。然而,基于行为分析的方法需要对数据库系统进行深入的分析和建模,且对系统性能有一定的影响。在实际应用中,使用序列模式挖掘算法来检测异常的查询序列模式,通过监控数据库系统的查询日志,并分析查询的模式和频率来检测异常行为,循环中不断地获取最新的查询日志,以提高检测性能。
5.4 其他检测技术
除了上述三种主要的检测技术,还有一些其他的检测方法被提出。例如,基于模型检测的方法通过对SQL语句的语法和语义进行分析,检测可能引发注入攻击的漏洞。基于正则表达式的方法通过定义一系列正则表达式模式,检测输入的SQL语句中是否包含恶意的代码。
6 结束语
SQL注入漏洞是一种常见且易于利用的漏洞,对数据库系统和应用程序的安全构成了严重威胁。本文重点研究了SQL注入攻击技术,下一步将针对SQL 注入攻击检测技术[8]进行深入研究,研究方向包括异常检测和自适应防御系统、云环境下的SQL注入攻击防御,以及物联网和大数据环境下的SQL注入攻击研究。