作者 | 陈峻
审校 | 重楼
引言
近年来,随着人们使用Web应用的与日俱增,各种与在线交易和通信相关的大量个人数据被存储在其后端的数据库中。对于那些由数据库驱动的Web应用而言,SQL注入攻击是一种相当严重的安全风险。攻击者可以通过利用系统漏洞,绕过应用防火墙,未经授权地访问到底层数据库,并窃取各种敏感的数据信息。因此,我们需要制定一套针对SQL注入攻击的有效应对措施,来提高Web应用的整体安全态势。
基本概念
作为一种典型的攻击形式,SQL注入(简称SQLi)通常会使用恶意SQL代码,来操纵后端数据库,获取机密信息和数据库管理员权限,进而盗取用户列表、以及破坏整个数据库。目前,根据访问后端数据的方法和潜在危害,我们可以将SQL注入分为:
- 向字符串或字符参数直接注入,如:SELECT * from table where example = 'Example'
- 对数字参数予以注入,如:SELECT * from table where id = 123而根据数据库管理系统(DBMS)和注入条件的漏洞类型,我们又可以将SQL注入分为:经典的带内SQLi、盲猜式的推理SQLi、以及险招式的带外SQLi。其中:
带内SQLi
当攻击者可以使用同一通信通道,实施攻击并收集攻击结果时,这种攻击就被称为带内SQL注入。作为一种最流行、最直接的攻击,带内SQL注入又包括:基于错误的SQL注入和基于联合的SQL注入两种最常见的形式。
- 基于错误的SQL注入使用数据库服务器的错误信息,来收集有关数据库结构的信息。毕竟,在Web应用的实时运行过程中,各种错误会被记录到安全文件中,那么攻击者便可以通过枚举来遍历整个数据库。
- 基于联合的SQL注入是将两到多个SELECT查询的结果合并为一个结果,然后作为HTTP响应的一部分予以发送。
推理SQLi
与带内SQL注入相比,推理SQL注入的攻击时间更长。攻击者可以通过发送有效负载、分析Web应用的响应、以及数据库服务器的相应行为,来重新创建数据库结构。由于无法获取Web应用传递的数据,因此攻击者无法查看到类似带内攻击的结果。而且,由于攻击者需要逐个字符地枚举数据库,因此在攻击大型数据库时,其效率比较低下。
目前,推理SQL注入也包含:基于盲布尔的SQL注入和基于盲时间的SQL注入两种形式。
- 基于盲布尔的SQL注入旨在让Web应用根据查询,返回的“真”或“假”不同的答案。
- 盲时间的SQL注入通过查询,使得数据库在响应前等待指定的时间(以秒为单位)。那么根据HTTP响应是有延迟、还是能即时给出,攻击者就能确定查询结果是“真”还是“假”。
带外SQLi
由于依赖的是在Web应用数据库服务器上已启用的功能,因此带外SQL注入并不常见。
应对措施
通常,Web应用防火墙(简称WAF)可以通过筛选和监控Web应用与互联网之间的HTTP流量,以及时发现跨站伪造、跨站脚本、文件包含和SQL注入等常见攻击。在OSI模型中,WAF工作在第七层。作为一种反向代理,它往往被安装在Web应用的前端,从而在客户端请求到达服务器之前形成一道中间件式的屏障。和其他防火墙类似,WAF也需要通过一系列规则与策略的集合,来过滤恶意请求,进而防范应用漏洞被利用。目前,经常被部署到Web应用系统中的WAF类型包括:软件型WAF、硬件型WAF、云WAF、以及Web应用内置的WAF服务。
上图展示的是WAF防范SQL注入的逻辑过程。可见,WAF强大之处在于,它可以快速、方便地执行策略,并按需变更规则,从而对各种攻击性请求做出更快的反应。
攻击检测
那么,WAF到底是遵循一个什么样的流程来对攻击进行检测的呢?下面我们以一个典型的软件型WAF为例,来深入探究。
- 首先,在接收到用户提交的数据请求后,WAF会根据既有的白名单进行合法性检查。如果已被涵括在白名单之内,它直接转发给后端的Web服务器予以响应处理;如果落入了黑名单,则立即拒绝数据请求的通过;而如果既不在白名单、也不在黑名单(也就是我们常说的“灰名单”)内,则要进行数据包的解析。
- 解析后的数据包会被拿去与我们前面提到的规则策略进行匹配,如果符合规则,则可以交给后端的Web服务器予以响应处理;如果不符合,则被判定为恶意攻击,进而执行相应的警告、阻断、以及留下记录,以便后续分析之用。
- 作为一个闭环,安全团队需要从WAF的记录中,获取诸如:攻击源的IP地址、攻击目标的URL等实用信息,以便进行后续的安全分析或策略调整。
WAF绕过
我们常说“道高一尺,魔高一丈”,针对WAF在产品设计和部署配置上的参差不齐,SQL注入攻击者时常会运用各种手段来绕过WAF,达到攻击目的。例如,由于不同的WAF产品会自定义不同的警告页面,因此攻击者可以根据不同的页面信息,来辨别出Web应用使用了哪一款WAF,从而制定出相应的能够绕过WAF的数据请求特征。下面便是该领域的一些典型威胁与漏洞:
- 参数篡改:攻击者使用那些对于目标Web应用根本不存在的参数,从安全性较低的数据库中获取异常信息。
- 参数化查询:攻击者频繁地使用多种参数化查询方式,增加SQL注入漏洞被利用的可能性。
- 页面扩展的可见性:根据显示页面扩展出的可见信息,攻击者可以猜测出Web应用可能用到的技术与组件。
- SQL版本泄露:攻击者可以通过定位SQL的版本,去查找并利用相应类型的SQL漏洞。
- 可猜测的表名/列名:典型且常用的表名或列名,往往是攻击者执行漏洞查找的突破口。
- 空字节编码:攻击者可以通过在其提供的数据中添加URL编码的空字节字符,来绕过WAF过滤器的完整性检查。
- 信任凭据截获:攻击者可以通过截获安全性较低的Web应用的用户凭据,达到曲线注入的效果。
此外,常见的WAF绕过方法还有:关键字替换,特殊符号与编码,利用注释,重复参数污染,缓冲区溢出,以及利用多种绕过技术打“组合拳”,通过未经授权地访问Web应用的系统文件,进而改变预期运行逻辑。
小结
综上所述,针对Web应用的SQL注入攻击与应对,好似一个永无止境的“猫鼠游戏”。我们只有通过持续检测,持续跟踪,持续调整,持续更新,以及持续引入新的防御技术,才能更加灵活地应对SQL注入、远程代码执行(RCE)、以及跨站点脚本(XSS)等复杂多变的攻击,才能在这场安全竞赛中占得先机。
作者介绍
陈峻(Julian Chen),51CTO社区编辑,具有十多年的IT项目实施经验,善于对内外部资源与风险实施管控,专注传播网络与信息安全知识与经验。