9.1 注入解释性语言
解释型语言是一种在运行时由一个运行时组件解释语言代码并执行其中包含的指令的语言。解释器处理的数据实际上是有程序员编写的代码和用户提交的数据共同组成的。攻击者提交专门设计的输入,使得输入的一部分被解释成程序指令运行。
编译型余元在代码生成是转换成机器指令,然后在运行时直接由使用该余元的计算机处理器执行这些指令。在编译型语言中实施旨在执行任意命令的攻击往往非常困难。注入代码的方法通常并不利用目标程序所使用语言的任何语法特性,注入的有效载荷为机器代码,而不是用那种语言编写的指令。
9.2 注入SQL
SQL一种解释性语言,Web应用程序经常建立合并用户提交的数据的SQL语句。因此,如果建立语句的方法不安全,那么应用程序可能易于收到SQL注入攻击。
9.2.1 利用一个基本的漏洞
9.2.2 注入不同的语句类型
tips:大多数数据库会隐式的将一个整数转换成一个字符串
- SELECT语句
- INSERT语句
- UPDATE语句
- DELETE语句
9.2.3 查明SQL注入漏洞
tips:某些字符在HTTP请求中具有特殊含义,必须谨慎地对它们进行URL编码。
对于用户提交的列名称,使用预处理语句或转义单引号也不能阻止此类注入,必须小心这类攻击。
- 注入字符串数据
- 注入数字数据
- 注入查询结构
9.2.4 “指纹”识别数据库
- 根据数据库连接字符串的不同方式进行识别
- MySQL处理某些行内注释时,例如
"/*!32302 and 1=0*/"
。只要数据库的实际版本等于或高于32302
应用程序就会将注释内容解释为SQL;否则,应用程序就会忽略注释内容。
9.2.5 UNION操作符
- 如果使用UNION操作符组合两个查询的结果,第二个查询中的每种数据类型要么必须与第一个查询中的对应类型完全相同,要么必须隐含地转换到那个类型。
- 数据库会将一个数字值隐含的转换为一个字符串值
- NULL可被转换为任何数据类型
9.2.6 提取有用的数据
- 可通过DBMS中的大量数据库元数据查询数据库中每一个表和列的名称
- 在各种情况下,提取有用数据所使用的的方法完全相同;但是,在不同的数据库平台上的应用细节各不相同
9.2.7 使用UNION提取数据
tips:
1.在分析大型数据库以及探查攻击目标时,最好是查找有用的列名称,而不是表
2.如果表返回了多个列,可以将这些列串连到单独一个列中
9.2.8 避开过滤
1.避免使用被阻止的字符
- 使用CHAR()函数替代过滤的字符
- 如果注释符号被过滤,可设计注入的数据,使其不会破坏周围查询的语法。如:
' or 'a' = 'a
代替' or 1 = 1 --
- 在MS-SQL数据库中注入批量查询时,不必使用分号分隔符。只要纠正所有批量查询的语法。
2.避免使用简单确认,如SELECT被阻止或删除,可尝试以下输入:
- SeLeCt
- %00SELECT
- SELSELECTECT
- %53%45%4c%45%43%54
- %2553%2545%254c%2545%2543%2554
3.使用SQL注释
- 使用注释代替空白符
- 将注释插入关键字中,避开过滤,如
SEL/**/ECT
9.2.9 二阶SQL注入
当数据首次插入数据库中时,许多应用程序能够安全处理这些数据。但是,一旦数据存储在数据库中,随后应用程序本身或其他后端进程可能会以危险的方式处理这些数据。
9.2.10 高级利用
1.获取数字数据
- 当单引号被过滤时,只有通过应用程序的数值响应,才能获得注入查询的结果
- 使用ASCII()返回字符的ASCII码
- 使用SUBSTRING()返回输入的子字符串
2.使用带外通道
- MS_SQL:使用OpenRowSet命令与外部数据库建立连接,并在其中插入任何数据
- Oracle:使用UTL_HTTP,UTL_INADDR,UTL_SMTP,UTL_TCP等默认功能建立带外连接
- MySQL:使用SELECT…INTO OUTFILE将任意一个查询的输出指向一个文件
- 操作系统:在操作系统上执行任意命令,以此实施权限提升攻击
3.使用推论:条件式响应
- 引发条件性错误
- 适应时间延迟
9.2.11 SQL注入之外:扩大数据库攻击范围
- 提升数据库的使用权限访问其他应用程序的数据
- 攻破数据库服务器的操作系统
- 访问其他系统
- 在主机基础架构与自己的计算机质检建立网络连接
- 通过用户自定义功能扩充数据库的现有功能
9.2.12 使用SQL注入工具
9.2.13 SQL语法与错误参考
9.2.14 防止SQL注入
- 部分有效的防御措施(对输入进行过滤)
- 参数化查询(参数占位符不能用于指定查询中表和列的名字以及查询的任何其他部分)
9.3 注入NoSQL
NoSQL数据存储区呈现使用键/值映射的数据,并且不依赖固定的方案。值可能为数据结构本身,因而可以实现层次化存储,这与数据库方案中的平面数据结构不同。
NoSQL数据存储区的常用查询方法:
- 键/值查询
- XPath
- 编程语言(如JavaScript)
9.4 注入XPath
XPath(XML路径)是一种用于导航XML文档并从中获取数据的解释性语言。许多时候,一个XPath表达式代表由一个文档节点导航到另一个文档节点所需要的一系列步骤。
9.4.1 破坏应用程序逻辑
9.4.2 谨慎XPath注入
9.4.3 盲目XPath注入
9.4.4 查找XPath注入
9.4.5 防止XPath注入
9.5 注入LDAP
LDAP用于访问网络中的目录服务,目录是一个分级结构的数据存储区,其中可能包含任何类型的信息。
每个LDAP查询使用一个或多个搜索过滤器,他们决定了请求返回的目录项。常用搜索过滤器如下:
- 简单匹配条件
- 析取查询
- 合取查询