最近在审计公司的某个项目时(Java方面),发现了几个有意思的Blind XXE漏洞,我觉得有必要分享给大家,尤其是Java审计新手,了解这些内容可以让你少走一些弯路。
Java总体常出现的审计漏洞如下:
>SQL注入
>XSS
>CSRF
>XXE
>SSRF
>CRLF注入
>远程命令执行
>反序列化
>文件上传
>任意文件删除
>文件下载
>DWR接口未授权访问
>JSONP
>URL报名单绕过
XXE简介
XXE(XML外部实体注入、XML External Entity),在应用程序解析XML输入时,当允许引用外部实体时,可以构造恶意内容导致读取任意文件或SSRF、端口探测、DoS拒绝服务攻击、执行系统命令、攻击内部网站等。
Java中的XXE支持sun.net.www.protocol里面的所有协议:http,https,file,ftp,mailto,jar,netdoc 。一般利用file协议读取文件、利用http协议探测内网,没有回显时可组合利用file协议和ftp协议来读取文件。
相关基础概念
XML&DTD
XML(可扩展标记语言,EXtensible Markup Language ),是一种标记语言,用来传输和存储数据。
DTD(文档类型定义,Document Type Definition )的作用是定义XML文档的合法构建模块。它使用一系列的合法元素来定义文档结构。
实体ENTITY
XML中的实体类型,一般有下面几种:字符实体,命名实体(或内部实体)、外部实体(包含分为:外部普通实体、外部参数实体)。除外部参数实体外,其他实体都以字符(&)开始以字符(;)结束。
0x1):字符实体
字符实体类似html的实体编码,形如a(十进制)或者a(十六进制)。
0x2):命名实体(内部实体)
内部实体又叫命名实体。命名实体可以说成是变量声明,命名实体只能在DTD或者XML文件开始部分(语句中)。
命名实体(或内部实体语法):
``
如:
说明:
定义一个实体名称x 值为First Param!
&x; 引用实体x
知道以上语法后,可以使用名为foo的数据类型定义(DTD)构造如下请求:
request:
bar元素是单词“World”的别名 。看起来这样的内部实体似乎无害,但攻击者可以使用XML实体通过在实体内嵌入实体来导致拒绝服务攻击。通常被称为“ (Billion Laughs attack)十亿笑攻击 ”。某些XML解析器会自动限制它们可以使用的内存量。
如:
request:
response:
HTTP/1.0 200 OK
Hello World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World World
0x3):外部普通实体
外部实体用于加载外部文件的内容。(显示XXE攻击主要利用普通实体)
外部普通实体语法:
如:
0x4):外部参数实体
参数实体用于DTD和文档的内部子集中。与一般实体不同,是以字符(%)开始,以字符(;)结束。只有在DTD文件中才能在参数实体声明的时候引用其他实体。(Blind XXE攻击常利用参数实体进行数据回显)
combine.dtd的内容为:
说明:
上面combine.dtd中定义了一个基本实体,引用了3个参数实体:%param1;,%param2;,%param3;。
解析后…中的内容为Hello World。
XML外部实体的一些限制与解决办法
error
通常对于XXE的经典用法,用来读取文件比较直接方便,但是,也决定了能被解析的内容元素必须是XML文档。
如下面一个例子:
request:
response:
通常会得到如下响应
HTTP/1.0 500 Internal Server Error
File "file:///etc/fstab