数据是互联网宝贵的资源,攻击者为获取数据库中的重要数据信息常采用SQL注入攻击方式对数据库进行破坏。
SQL注入攻击允许攻击者通过构造特殊的SQL语句绕过身份验证,进而提权、修改或删除重要数据,甚至使数据库停止服务,实现对数据库的绝对访问。SQL注入攻击具有原理简单、使用方便、攻击获益大、攻击门槛低等特性,使得其从发现至今尚未断绝。
一、SQL注入攻击原理
SQL注入产生的实质是因为恶意代码被伪装成正常的输入数据,与正常请求拼接在一起,提交到服务器的数据库解析执行。在构造动态字符串的过程中,转义字符处理不当、数据类型处理错误、查询语句设计不合理、查询错误、处理错误以及对多个查询请求处理不当等均可能导致SQL注入攻击的发生。
图一 SQL注入攻击流程
二、SQL注入攻击分类
(一)重言式注入
通过注入总是返回真的语句,可以绕过数据库的身份验证。例如:SELECT * FROM 用户表 WHERE 用户名 = N OR 1 = 1;将代码注入特定字段后,通过使用行尾注释来使后面的代码合法。
(二)报错注入
可以通过注入非法或逻辑上不正确的请求来获取数据,例如注入参数、资料类型、表格名称等,这不一定是枚举技术的攻击。目标是故意输入构造不良的语句,以使数据库响应其错误消息中的表名和其他信息。攻击者故意执行不正确的查询,从中找到易受攻击的内容。
(三)联合查询
通过“UNION”关键字连接2条甚至多条SQL查询语句,然后把查询到的结果进行拼接,从而获取敏感数据。
(四)堆叠注入
使用查询分隔符(如“;”)在原始查询后附加额外语句,达到破坏数据库的目的。
(五)盲注
盲注是通过查询数据库中的真假问题来执行的,当攻击者知道数据库容易被注入时,会发生这种情况,但错误消息不会返回给攻击者。因为有很多猜测和反复试验,这种攻击需要很长时间才能完成,可以分为布尔盲注和时间盲注。
(六)编码替换
该攻击不属于某种特定的攻击类型,它可以与其他攻击类型联合使用,旨在避开后端的防御和过滤机制。
(七)二阶SQL注入
二阶SQL注入攻击是将SQL注入过程分为两个阶段,其中的攻击载荷由于Web应用程序的条件限制无法立即执行,需要首先由存储阶段通过相关命令如INSERT把攻击载荷存入数据库,之后再由触发阶段通过相关请求如UPDATE和SELECT命令检索先前存入数据库中的攻击载荷,实现语句拼接构造SQL注入在Web服务器中解析执行。
图二 二阶SQL注入攻击流程
三、SQL注入攻击防御技术
(一)编码阶段的防御技术
主要是在开发阶段对开发者的编码习惯进行约束,尽量减少注入漏洞的产生,来减少攻击者利用这些漏洞进行SQL注入攻击的可能。
1. 输入检查
网页在提交数据时可以通过编码设置过滤用户输入,严格控制用户输入数据,在一定程度上可以防御部分SQLIA注入攻击。但是,多数浏览器自带的查看网页源码功能可以使攻击者轻松获得网页源代码,将限制输入部分进行修改后,依然可以将非法数据提交给服务器。因此,Web服务器也应对接收数据进行相应的验证。
2.错误消息自定义
Web应用程序中的回显常会包含数据库类型、 版本等敏感信息。通过自定义数据库返回的错误信息,弱化语句执行与页面响应报文之间的逻辑关系,使注入者无法进行下一步的推理攻击。但该方法在正常用户使用系统时会有损用户体验。
3.参数化查询
避免使用拼接语句最好的方法就是使用参数化语句,参数化查询将SQL语句整体变成1个函数,使用占位符作为函数的变量,可以保证SQL语句语义的不变性,不会对攻击载荷中的关键字编码等进行解析。
4.使用安全函数
通过利用安全函数来过滤、转义不受信任的用户输入,可以是程序中自带的安全函数,也可以是开发时程序员自定义的安全函数。利用该方法可以提高SQL注入攻击的攻击难度,从而降低攻击发生的风险。
(二)基于规则匹配的防御技术
从SQL注入的攻击原理分析可知,SQL注入攻击改变了原有 SQL语句的结构特征, 通过创建规则集并识别检测违反规则的行为,能够有效防御已知的SQL注入攻击。匹配方法根据规则集对象的不同分为正则表达式匹配、模式匹配、语法树特征匹配以及随机化方法等。
(三)基于机器学习的防御技术
虽然SQL注入攻击的形式多种多样,但是攻击者在进行攻击时的步骤和行为是类似的,使用的攻击语句也存在一定的规律。因此,可以将合法和非法语句的识别转换为一个二分类问题,已有利用机器学习进行SQL注入攻击检测的研究。
四、总结
SQL注入是已知较早的数据库攻击形式之一,并是长期的主要攻击手段。本文简单介绍了SQL注入攻击的原理、分类和防御技术,这些技术在防御SQL注入攻击方面都有着不错的表现。面对层出不穷的新型高级SQL注入攻击,需投入更多的人力物力开展针对SQL注入攻击检测与防御的相关研究。