SQL 注入与防御-第十章:确认并从 SQL 注入攻击中恢复
一、简介
SQL 注入是黑客常用攻击手段,会对组织机构声誉、经济等造成严重损害。许多机构存在 SQL 注入漏洞,可能是新应用忽视安全测试或开发生命周期缺乏安全整合所致。当黑客发现并利用漏洞时,需计算机取证专家调查、检验并响应,以遏制攻击或恢复,降低商业影响。
二、调查可疑的 SQL 注入攻击
(一)取证的合理实践
过去十余年,虽安全意识和计算机取证经验有进步,但仍有调查及证据无法被法律程序采用。若要在法庭用证据,收集和管理须有严格规则与指导原则:
- 由接受过计算机取证培训且获机构授权的人处理调查。
- 调查期间收集的所有文件都应镜像,创建副本用于分析,确保需要时原始镜像可用。
- 对新建的每份文件镜像生成哈希,源文件及日志服务器日志文件也需如此。为刚创建的镜像文件(副本)也创建哈希,用如
dcfldd
的专业工具创建镜像,它能验证文件未受污染,还能为原始文件和新建镜像文件分别生成哈希并验证匹配。 - 调查期间,用文档记录所有操作,包括连接数据库服务器完成的操作:保留连接时间和所用数据库语境记录;保留所有 RDBMS 执行命令记录;将标准输出(
stdout
)从数据库客户端控制台重定向到文本文件(主流 RDBMS 客户端重定向命令见表 10 - 1)。 - 确保所有证据写入无毒存储介质,并存放在安全地方(如储物柜或保险箱)。
- 维护监管链(Chain of Custody)文档,跟踪收集的所有证据,从被防护时间到在执行案某个调查期间的移动、存放位置和所有者。
(二)分析数字化证据
数字化证据(digital artifact)范围很广,包括操作系统中 Web 服务器的日志文件、内存中的信息及 RDBMS 内核中的信息等。调查 SQL 注入攻击时,Web 服务器日志、数据库执行计划、事务日志(transaction log)和数据库对象的时间戳(timestamp)是最有效的证据。
1. Web 服务器日志文件
Web 服务器作为交互层,接收用户输入并传递给后台应用程序,通常维护持久日志文件,记录页面请求历史和请求处理后的输出状态。系统管理员可定制日志记录信息,主流 Web 服务器产品默认启用基本信息日志记录。表 10 - 2 列出了对调查 SQL 注入攻击最有用的 Web 服务器日志属性,这些信息对分析日志文件中的数据至关重要。默认情况下,Web 服务器以文本文件方式存储日志数据,因大 Web 服务器日志文件(含大量兆字节数据),用日志分析工具(如 Microsoft 开发的 Log Parser,支持 IIS 和 Apache 日志文件格式)分析更高效,能快速精确用 SQL 分析庞大日志文件。可通过分析 Web 服务器日志,查找 Web 请求带宽利用率异常偏高的日志文件,还可分析页面每天命中次数、某天某个 IP 命中次数等,识别可疑访问(如含恶意 SQL 注入语法的查询参数)。
2. 数据库执行计划
数据库执行计划是 RDBMS 生成的执行步骤列表,说明 RDBMS 访问或修改信息时效率最高的方式。查询第一次到数据库服务器时,服务器会解析、分析查询,确定需访问的表、使用的索引(若存在)及连接(join)或合并(merge)结果集等,分析结果存在存储结构中即执行计划。执行期间,数据库内部组件可共享这些计划,相同计划可存储在内存区域(执行计划缓存),接收类似查询时,可用缓存的执行计划。数据库执行计划能提供接收到的实际查询语句(包括攻击中攻击者终止的代码),而 Web 服务器和防火墙日志可能忽略这些数据。不同 RDBMS 对执行计划的缓存机制不同,较高版本的 Microsoft SQL Server 和 Oracle RDBMS 用这种机制,MySQL 和 PostgreSQL 没有保护敏感信息缓存的机制,会将敏感信息记录在普通日志文件和二进制日志文件中,调查期间收集的所有信息都必须加密处理。可通过执行计划查询的副本分析,识别应用程序中被攻击的 Web 页面和可执行文件、攻击的时间和源 IP 地址等,确认攻击企图是否成功。
3. 事务日志
事务日志(transaction log)由子元素组成,包括子句、查询和语句,语句包含一个或多个数据库操作,分数据操作语言(DML,作用于表内数据)和数据定义语言(DDL,作用于数据库结构)。事务日志用于记录事务开始及恢复所需信息,若数据库将信息写入硬盘失败,可利用恢复信息将数据回到一致状态。事务日志中的信息会用于实际数据页写入磁盘,虽写入非实时,但速度快。几乎所有操作(无论归类为 DML 还是 DDL)都可归结为 INSERT
、UPDATE
和 DELETE
操作,需要写入、更新或删除磁盘上的信息时,用这 3 种操作实现。攻击者执行修改表数据的 SQL 语句时,相应事务会在事务日志中留下痕迹,即使攻击者执行 SELECT
语句,若 RDBMS 在返回结果前对中间结果排序,也会在事务日志中创建与临时表创建和加载相关的条目。事务日志分析是深入且内容广泛的主题,重点介绍支持调查取证的关键事务:
- 可疑攻击时间段内执行的
INSERT
、UPDATE
和DELETE
语句,该信息可用于标识调查时间段内执行的活动及相关事件的其他痕迹。 - 数据库用户执行的非标准数据库操作(如普通从数据库读取信息的应用程序用户账号突然执行
INSERT
、UPDATE
和DELETE
语句)。
三、不同数据库的恢复与调查要点
(一)Microsoft SQL Server
默认情况下,事务日志功能启用且无法禁用,可使用原生的 fn_dblog
函数访问事务日志。可通过查询事务日志,获取如 Spid
(分配给执行事务日志记录连接的唯一标识符)、Transaction ID
(用于分组相关事务的唯一标识)、Login_or_User
(执行事务的数据库服务器登录账号或数据库用户账号)、Transaction Type
(执行事务的类型描述)、Begin Time
(执行事务的时间)等信息,识别可疑操作(如用 EXEC
命令将数据 INSERT
到表中)。
(二)Oracle
事务(归档)日志默认启用,测试系统也无法禁用。可通过查询返回已执行的 INSERT
、UPDATE
和 DELETE
操作列表,例如:
SELECT OPERATION, SQL_REDO, SQL_UNDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'WEBRPT' AND SEG_NAME = 'SYNGRSS' AND (