介绍
结构化查询语言 (SQL) 用于查询、操作和管理数据库系统,例如 Microsoft SQL Server、Oracle 或 MySQL。SQL 的一般用法在所有支持它的数据库系统中都是一致的;然而每个系统都有其特有的复杂性。
数据库系统通常用于为多种类型的 Web 应用程序提供后端功能。为了支持 Web 应用程序,用户提供的数据通常用于动态构建直接与数据库交互的 SQL 语句。SQL注入攻击是一种通过将攻击者提供的SQL语句直接提交到后端数据库来颠覆应用程序的初衷的攻击。根据 Web 应用程序以及它在构建 SQL 语句之前处理攻击者提供的数据的方式,成功的 SQL 注入攻击可能会产生深远的影响。可能的安全后果包括绕过身份验证、信息泄露以及向应用程序用户分发恶意代码。
SQL注入解释
SQL 注入攻击涉及通过使用攻击者提供的数据来更改 Web 应用程序中使用的 SQL 语句。Web 应用程序中输入验证不足和 SQL 语句构造不当可能会使它们遭受 SQL 注入攻击。SQL 注入是一种非常普遍且具有潜在破坏性的攻击,以至于 开放 Web 应用程序安全项目 (OWASP) 将其列为 Web 应用程序的头号威胁。
成功的 SQL 注入攻击的后果
尽管成功的 SQL 注入攻击的影响因目标应用程序以及该应用程序处理用户提供的数据的方式而异,但 SQL 注入通常可用于执行以下类型的攻击:
- 身份验证绕过: 此攻击允许攻击者在不提供有效用户名和密码的情况下,可能具有管理权限登录到应用程序。
- 信息泄露: 此攻击允许攻击者直接或间接获取数据库中的敏感信息。
- 数据完整性受损: 这种攻击涉及数据库内容的更改。攻击者可以使用此攻击来破坏网页,或更可能将恶意内容插入到其他无害的网页中。 该技术已通过SANS Internet Storm Center 的SQL 注入大规模攻击中描述的攻击得到证明 。
- 数据可用性受损: 此攻击允许攻击者删除信息,意图造成损害或删除数据库中的日志或审核信息。
- 远程命令执行: 通过数据库执行命令可能会让攻击者破坏主机操作系统。这些攻击通常利用现有的预定义存储过程来执行主机操作系统命令。这种攻击最常见的形式是使用 Microsoft SQL Server 安装中常见的 xp_cmdshell 存储过程,或者利用在 Oracle 数据库上创建外部过程调用的功能。
用于绕过身份验证的 SQL 注入示例
SQL 注入的多种可能用途之一涉及绕过应用程序登录过程。以下示例说明了 SQL 注入攻击的一般操作。以下 HTML 表单向应用程序用户请求登录信息。尽管此示例使用 HTTP POST 请求,但攻击者也可以使用使用 HTTP GET 方法的 HTML 表单。
<form action="/cgi-bin/login" method=post> 用户名:<输入类型=文本名称=用户名> 密码:<输入类型=密码名称=密码> <输入类型=提交值=登录>
当用户在此表单中输入信息并单击 “登录”时,浏览器会向 Web 服务器提交一个包含用户凭据的字符串。此字符串在 HTTP 或 HTTPS POST 请求的正文中显示为:
用户名=提交用户 & 密码=提交密码
具有易受攻击的登录过程的应用程序可能会接受提交的信息并将其用作以下 SQL 语句的一部分,该语句查找包含提交的用户名和密码的用户配置文件:
select * from Users where (用户名 = ' subscribedUser ' AND 密码 = 'subscribedPassword ');
除非应用程序使用严格的输入验证,否则它可能容易受到 SQL 注入攻击。例如,如果应用程序在没有任何验证的情况下接受并处理用户提供的数据,则攻击者可能会提交恶意制作的用户名和密码。考虑攻击者发送的以下字符串:
用户名=admin%27%29+--+&密码=+
一旦接收到该字符串并对其进行 URL 解码,应用程序将尝试使用用户名 admin') 以及由单个空格组成的密码来构建 SQL 语句。将这些项目放入前面的 SQL 语句中会产生:
select * from Users where (用户名 = ' admin ') -- 密码 = ' ');
正如前面的示例所示,攻击者制作的用户名会更改 SQL 语句的逻辑,以有效地删除密码检查。在上面的示例中,攻击者可以使用管理员帐户成功登录应用程序,而无需知道该帐户的密码。
精心设计的输入中出现的两个破折号字符 (--) 的字符串非常重要;它向数据库服务器指示 SQL 语句中的其余字符是注释,应被忽略。此功能是攻击者可以使用的最重要的工具之一,如果没有它,就很难确保恶意 SQL 语句在语法上正确。
尽管精心设计的字段(即上一个示例中的用户名字段)必须针对易受攻击的应用程序进行定制,但事实证明,Internet 上随时可用的大量记录字符串可以成功启用 SQL 注入攻击。前面的示例可能很简单,但它说明了 SQL 注入攻击技术的有效性。
盲注和二阶 SQL 注入
在后端 SQL 数据库的数据不直接返回给用户或攻击者的情况下,攻击者可能需要使用 SQL 盲注技术。通过这种技术,攻击者可以确定 SQL 语句是否是通过直接呈现数据以外的方式执行的。使用 SQL 盲注,攻击者可以执行侦察、获取敏感信息或更改数据库内容,包括身份验证凭据。
SQL 盲注技术的一个示例是在恶意 SQL 语句中引入延迟。根据所使用的数据库软件,攻击者可以构建旨在使数据库服务器执行耗时操作的 SQL 语句。使用 MySQL 数据库软件,可以使用以下命令编写 SQL 语句:sleep() 函数。例如,将 sleep(10)合并 到恶意查询中将产生 10 秒的延迟。 攻击者可以通过执行操作系统命令或耗时的子查询或尝试建立出站 HTTP 连接,在不包含 sleep()函数的数据库服务器上引起可识别的延迟。如果执行耗时的 SQL 语句,Web 应用程序的响应时间可能会比通常情况要长得多。此方法允许攻击者确定他们的 SQL 语句是否正在以某种程度的确定性执行。
二阶 SQL 注入攻击涉及用户提交的数据,这些数据首先存储在数据库中,然后检索并用作易受攻击的 SQL 语句的一部分。此类漏洞更难定位和利用,但二阶 SQL 注入攻击证明在应用程序中执行所有 SQL 语句以及综合使用参数化查询之前进行数据验证是合理的。