目录
🦄一、XXE(外部实体注入)
🐹1.1 漏洞介绍
XXE漏洞发生在应用程序解析XML输入时,并没有禁止外部实体的加载,当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
🐹1.2 漏洞识别
首先存在漏洞的web服务一定是存在xml传输数据的,可以在http头的content-type中查看,比如Content-Type: text/xml, post的数据包含XML格式,如:<forgot><username>admin</username></forgot>请求头中添加Content-Type: text/xml,或Content-type: application/xml。也可以根据url一些常见的关键字进行判断测试,例如wsdl (web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。
🐹1.3 漏洞防御
(1)使用开发语言提供的禁用外部实体的方法
·PHP:
libxml_disable_entity_loader (true);
·Java:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences (false);
·Python:
from lxml import etree
xmlData = etree.parse(xmlSource, etree.XMLParser(resolve_entities=False))
(2)过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC
🦄二、PHP_XXE解题
🐹2.1 解题步骤
(1)打开靶场,输入任意账号密码登录,拦截数据包。观察到数据包,发现body体数据类似XML文件形式,故可以尝试进行XML外部实体注入
(2)在body体中添加xml语句,并重发数据包
🐹2.2 注意事项
在添加XML语句时要注意以下事项:
🐔2.2.1 XML语句格式
<?xml version="1.0"?>
<!DOCTYPE test1[
<!ELEMENT foo ANY>
<!ENTITY test SYSTEM "file:///C:/windows/win.ini">
]>
<user><username>&test;</username><password>admin</password></user>
第一行为XML声明,用来定义XML的版本,一般情况可以不要
第二至五行为DTD,用来定义XML的合法元素。!DOCTYPE 用来声明文档类型;!ELEMENT定义一个元素(XML标签名)这里类型为ANY;!ENTITY声明一个实体(XML标签中的内容)
第六行为是XML树结构,为实际内容
注意:
a.在利用XXE攻击时!ELEMENT元素可不用定义
b.!ENTITY声明的实体要在树结构中以&实体名;的形式引用,否则无法显示读取内容
🐔2.2.2 内部实体与外部实体
内部实体声明:<!ENTITY entity-name "entity-value">
外部实体声明:<!ENTITY entity-name SYSTEM "URI/URL">
🐔2.2.3 文件读取的方式
file:/// #file协议读取文件
http://url/file.txt #http协议读取站点下的文件
PHP://filter #文件流形式读取php文件
注意:在读取php文件时要用PHP://filter协议,以file和http协议读取.php文件则会报错,因为php文件中含有<>//等特殊字符,xml解析时会当成xml语法进行解析。那我们若是要读取php文件则可以使用php://filter/read=convert.base64-encode/resource=/etc/hosts方法对内容进行base64编码。