代码审计-xxe漏洞

0x01 XXE 概述

XXE(XML External Entity)即 XML 外部实体注入,是针对使用 XML 标准语言交互的 Web 应用攻击,由于 XML 文档结构的 DTD 在引用外部实体时,未对外部实体进行敏感字符过滤或过滤不严谨,造成了该漏洞类型的产生。

1.XML 基础

XML是具有结构性的可扩展标记语言,是用来传输/保存数据而不是现实数据的,在配置文件(Struts,Sprint)、文档结构说明(如本博客的RSS)应用比较多。

XML 设计宗旨是传输数据,而非显示数据,各种应用程序之间数据传输中最常用的工具。

2.XML 结构

1
2
3
XML //文档声明,在文档的第一行
XML //文档类型定义,即DTD,XXE 漏洞所在的地方
XML //文档元素

image-20220103094629033

3.XML DTD(文档类型定义)

文档类型定义(DTD)可以是内部声明也可以引用外部 DTD

内部声明 DTD 格式:<!DOCTYPE 根元素 [元素声明]>
引用外部 DTD 格式:<!DOCTYPE 根元素 [元素声明]>
在DTD中进行实体声明时,将使用 ENTITY 关键字来声明。实体是用于定义引用普通稳定或特殊字符的快捷方式的变量。实体可在内部或外部进行声明

内部声明实体格式:<!ENTITY 实体名称 "实体的值">
引用外部实体格式:<!ENTITY 实体名称 SYSTEM "URL">

4.外部实体支持协议

引用外部实体支持协议

libxml2 PHP Java .NET
file
http
ftp
file
http
ftp
php
compress.zlib
compress.bzip2
data
glob
phar
http
https
ftp
file
jar
netdoc
mailto
gopher *
file
http
https
ftp

PHP支持的扩展协议

Scheme Extension Required
https
ftps
openssl
zip zip
ssh2.shell
ssh2.exec
ssh2.tunnel
ssh2.sftp
ssh2.scp
ssh2
rar rar
ogg oggvorbis
expect expect

5.Blind XXE

Blind XXE 即服务器无回显是,可以采用 Blind XXE(盲注 XXE),主要使用了 DTD 中的参数实体和内部实体,参数实体是只能在DTD中定义和使用的实体,以 %为标志定义,定义和使用方法,内部实体是指在一个实体中定义的另一个实体,实体之间相互进行对外实体的包容,即俗称的嵌套实体。

0x02 防御建议

禁用外部引用和过滤敏感关键词。

  • PHP 禁用引用外部实体

    1
    libxml_disable_entity_loader(true);
  • PHP过滤敏感关键词

在解析配置文件、网络数据时、校验并过滤掉 <!DOCYPE>、<!ENTITY>、SYSTEM、PUBLIC等相关的关键词

0x03 代码审计

XXE 与关键词密切相关,对XXE 审计方法也是直接搜索相关的关键词,如 file_get_contents、php://input、simplexml_load_string等围绕这些关键词上下文分析,看是否存在 XXE漏洞

1.file_get_contents

file_get_contents — 将整个文件读入一个字符串

1
2
3
4
5
6
7
file_get_contents(
string $filename,
bool $use_include_path = false,
resource $context = ?,
int $offset = 0,
int $length = ?
): string|false

2.php://input

是个可以访问请求的原始数据的只读流。

结合 file_get_contents(“php://input”) 可以读取POST提交的数据,存入 $xml

3.simplexml_load_string

php 中的 simplexml_load_string 函数将xml 格式字符串转换为对应的simpleXMLElementObject

具体使用方法可以参考我之前写的 浅谈 XXE 漏洞任意文件读取

总结

xxe 审计的思路,就是结合关键的函数,以及是否开启对应的功能,进行审计,直接使用关键字搜索即可。

参考链接

https://www.php.net/manual/zh/function.file-get-contents

https://blog.csdn.net/fengzilin1973/article/details/116355031?spm=1001.2014.3001.5501