🐹1.1 漏洞介绍
XXE漏洞发生在应用程序解析XML输入时,并没有禁止外部实体的加载,当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
🐹1.2 漏洞识别
首先存在漏洞的web服务一定是存在xml传输数据的,可以在http头的content-type中查看,比如Content-Type: text/xml, post的数据包含XML格式,如:
请求头中添加Content-Type: text/xml,或Content-type: application/xml。也可以根据url一些常见的关键字进行判断测试,例如wsdl (web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。 admin
🐹1.3 漏洞防御
(1)使用开发语言提供的禁用外部实体的方法
·PHP:libxml_disable_entity_loader (true);·Java:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences (false);·Python:from lxml import etreexmlData = etree.parse(xmlSource, etree.XMLParser(resolve_entities=False))
(2)过滤用户提交的XML数据
关键词:
🐹2.1 解题步骤
(1)打开靶场,输入任意账号密码登录,拦截数据包。观察到数据包,发现body体数据类似XML文件形式,故可以尝试进行XML外部实体注入
(2)在body体中添加xml语句,并重发数据包
🐹2.2 注意事项
在添加XML语句时要注意以下事项:
🐔2.2.1 XML语句格式
]>&test; admin
第一行为XML声明,用来定义XML的版本,一般情况可以不要
第二至五行为DTD,用来定义XML的合法元素。!DOCTYPE 用来声明文档类型;!ELEMENT定义一个元素(XML标签名)这里类型为ANY;!ENTITY声明一个实体(XML标签中的内容)
第六行为是XML树结构,为实际内容
注意:
a.在利用XXE攻击时!ELEMENT元素可不用定义
b.!ENTITY声明的实体要在树结构中以&实体名;的形式引用,否则无法显示读取内容
🐔2.2.2 内部实体与外部实体
内部实体声明:
外部实体声明:
🐔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编码。
来源地址:https://blog.csdn.net/weixin_53972936/article/details/127542696