文章首发公众号: 海天二路搬砖工
前言
在Web应用程序开发中,防SQL注入最基本的安全防护要求了。其实除了SQL注入, 还有很多其他的注入攻击方式。注入攻击是最常见的Web应用攻击方式之一。
本文将介绍注入攻击的概念、种类、原理,以及如何防护。
什么是注入攻击
注入攻击是指攻击者在应用程序接收用户输入的地方注入自己精心构造的攻击代码,以达到执行任意操作、篡改数据或者获取敏感信息的目的。
注入攻击是 Web 应用程序中最常见的攻击类型之一,攻击成功将导致应用程序的机密性、完整性和可用性等方面的风险。
注入攻击的种类
常见的注入攻击类型包括 :
- SQL 注入: 通过在 SQL 语句中注入恶意代码来执行不受信任的操作,以获取敏感数据或者篡改数据。
- 命令注入: 攻击者将能够执行不受信任的操作的命令注入到应用程序中。
- LDAP 注入: 利用 LDAP 查询中的漏洞来获取敏感信息或者更改应用程序的行为。
- OS 注入: 利用操作系统的漏洞,向服务器输入不受信任的数据,以利用操作系统上的缺陷来执行可疑操作。
- XML 注入: 利用 XML 编辑器中的漏洞创建恶意 XML 代码的攻击
SQL注入
什么是SQL注入攻击
SQL注入是指攻击者在应用程序接收输入参数的地方注入了恶意SQL语句,以达到获取敏感数据或者篡改数据的目的。
Web应用程序中,用户的输入经常会作为数据库的查询条件,填充到SQL语句中。
举个栗子:
假设有一个登录表单,用户可以通过输入用户名和密码来登录系统。
正常的 SQL 命令可能如下所示:
SELECT * FROM users WHERE username = 'Windeal' AND password = '123456'
如果说密码 123456 是一个错误密码,那么用户就会登录失败。
但是,攻击者可能会在用户名参数中注入恶意代码 “’ OR 1=1”,例如:
SELECT * FROM users WHERE username = 'Windeal' OR 1=1--' AND password = 'mypassword'
如此一来,尽管密码是错误的,攻击者成功地利用 SQL 注入来绕过了登录验证(查询语句重点密码校验部分被注释掉了)。
SQL注入攻击的常见类型/方法
以下是一些常见的SQL注入攻击类型:
- 基于错误信息的 SQL 注入
错误型 SQL 注入常见于应用程序的错误消息中。攻击者可以通过修改 SQL 命令的格式,导致应用程序产生错误,错误消息中包含关于应用程序所使用的后端数据库的敏感信息。
- 基于时间延迟注入
攻击者使用时间敏感的 SQL 命令来判断注入的 SQL 语句是否执行成功,从而提高自己注入的成功率。攻击者通过向所写入的 SQL 语句添加时间延迟,来判断结果是否符合他们的期望,以便进一步利用所攻占的应用程序和服务器资源。
- 盲注
盲注是指攻击者不能直接看到所注入的响应信息,通常使用布尔盲注和时间盲注来动态检测数据的恶意代码。
- 联合查询注入
联合查询注入是在一个 SQL 查询中执行两个或多个数据库查询的技术。攻击者通常使用 UNION SELECT 命令向 SQL 查询中添加新的查询语句。这种注入方式可以将两个或多个表的数据合并到一个响应中,攻击者可以访问应用程序不会返回的数据。
- 存储过程注入
存储过程是一种预编译的 SQL 代码块,可以在一个事务中执行。攻击者可以使用存储过程注入来注入 SQL 命令并在数据库中执行恶意代码,以执行未授权的活动和/或下载其他恶意代码。
- 基于堆叠查询的注入
堆叠查询允许在一个请求中执行多个查询。攻击者可能会使用堆叠查询注入技术来执行跨数据库服务器的查询命令,从而操纵应用程序中的数据。
SQL注入攻击的预防和防范
-
入参强校验:
服务后端对所有接收到的请求参数进行参数强校验,严格限时入参的长度、格式、是否是否包含非法字符。
-
参数化查询:
使用参数化查询和预编译语句而不是字符串连接来提高应用程序的安全性。
-
限制数据库和表访问:
为了限制用户和应用程序的访问权限,应用程序开发者和管理员应该为数据库用户分配最小的用户权限。将明文数据报告的能力限制在不影响应用程序正常运行的前提下。
-
限制运行时间
限制(降低)请求的最大运行时间,避免攻击者根据响应时间来推测后台运行逻辑。
-
不提供过于详细的错误消息:
错误消息的详细程度会向攻击者提供有关应用程序所使用的数据库平台的绝大部分信息。
-
多层防御措施:
使用 Web 应用程序防火墙、注入扫描预防工具和定期代码审计等方法来设置多层防御措施。
-
强制减少 SQL 数据库的功能集:
尽可能减少数据库的功能集,可以有效地减少潜在攻击的面。例如启用只读模式,关闭会话管理,强制值验证等。
其他注入攻击
命令注入
定义:
命令注入是一种类似于 SQL 注入的攻击方式。攻击者通过向应用程序输入一个操作系统命令的特定字符串,或通过摄取特定的应用程序安全补丁以绕过对输入进行的安全检查来实现。
原理:
攻击者通过输入操作系统命令或 shell 脚本的 payload 来注入恶意代码,例如添加删除、保存到磁盘、操纵文件系统和执行任意代码等。这些攻击可以通过许多短时间的输入字段和API或通过常规执行的 shell 命令执行。
示例:
假设我们提供一个搜索功能,底层是通过grep命令来查看文件系统中是否存在某个字符串。
如果我们再搜索框中注入系统命令,填入
searchterm | rm /f /
则服务器执行可能变为
grep searchterm | rm /f /
从而导致服务器上的文件被删除。
预防与防护:
为了有效预防和防护命令注入攻击,可以采用以下措施:
- 输入数据的验证和过滤
- 应用安全补丁和强化用户口令
- 对执行授权进行访问控制
- 建立客户端和服务端的双向认证机制
- 尽可能的规范化和限制应用程序的接口。
LDAP注入
定义:
LDAP注入是一种攻击方式,攻击者通过向LDAP查询中注入恶意数据或LDAP过滤器,来实现访问悄悄话的目的。
原理:
攻击者将特制的数据输入到LDAP查询或过滤器中,模拟正常LDAP查询操作,但当查询完成时,攻击者恶意数据被LDAP服务显示出来,从而导致安全问题的发生。
预防与防护:
LDAP注入攻击可以通过以下措施加以防护和预防,例如:
- 尽可能的规范和限制客户端和服务端接口
- 限制LDAP帐户的访问授权
- 对输入数据进行验证和过滤
- 应用安全补丁和监视系统日志
- 对询问访问进行授权和访问控制。
OS 注入:
定义:
OS命令注入是一种类型的攻击方式,攻击者通过将一系列恶意输入注入到一个之前预期只有数据输入的地方来实现向操作系统(OS)发送命令。
原理:
攻击者通过在 OS 命令的 payload 中注入恶意数据和命令访问权限,来执行不希望被操作系统或应用程序所记录的恶意行为,例如添加、删除、修改、操纵文件系统和直接执行任意代码等。
预防与防护:
为了防止 OS 命令注入攻击,可以采用以下方案:
- 验证所有的数据输入
- 应用安全补丁和规范化处理所有的输入
- 限制用户和关联服务帐户的访问性和权限
- 在 API 级别上加入健壮的验证机制
- 建立健康的安全意识和教育计划,使人员更加关注安全风险并采取相应措施。
XML 注入:
定义:
XML 注入攻击是指攻击者利用 XML 解析器漏洞,在 XML 数据输入和解析过程中注入恶意代码,进而达到攻击的目的。
原理:
攻击者通过向不受信任的 XML 数据输入中注入恶意的 XML 或 XML 文件格式数据来利用 XML 注入漏洞,或利用 XPath 的逻辑查询操作实现特定的筛选操作,结果导致解析器无法正确识别恶意代码,从而执行恶意操作。
示例:
以下是一个简单的示例,演示了如何进行XML注入攻击:
假设一个应用程序接受用户提供的XML数据,并使用这些数据生成HTML输出。攻击者可以提供以下恶意XML数据:
<user>
<name>John</name>
<role>Admin</role>
<script>alert('XSS Attack')</script>
</user>
如果应用程序不正确地处理输入,它可能会将这个恶意XML数据插入到HTML输出中,导致XSS(跨站脚本)攻击。攻击者的恶意脚本会在用户的浏览器中执行。
预防与防护:
为了有效预防和防护 XML 注入攻击,可以采用以下方案:
- 对所有输入数据进行验证和过滤控制
- 对所有的应用程序和接入数据库元素进行严密的控制和访问认证
- 使用工具扫描管理可能存在的安全漏洞
- 对 XML 文档进行限制和规范化处理,避免恶意代码的注入
- 启用应用程序防火墙等操作系统级别的安全机制以及专属 XML 过滤解析器等技术措施来加固、增强 XML 的安全性。