XML基础
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。一个完整的XML例子:1
2
3
4
5
6
7
8
9
10
11"1.0" encoding="GBK" xml version=
<edd>
<a> &comrade; </a>
<b>
<c><d>&edarmoc;</d></c>
</b>
</edd>
可以看到有xml声明、DOCTYPE声明(实体必须在DOCTYPE中声明)等。解析结果:
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>
1
2
3
4
5"1.0" encoding="UTF-8" xml version=
<x>&f;</x>
可以看到,PUBLIC的话,需要在文件名前面加一个PUBLIC_ID.这里的原理是通过file协议把/etc/passwd
的值赋给了实体f,然后f又被放在x元素中,被print出来了。
for windows:此处可以使用各种协议xml.php:1
2
3
4
5
$xml=file_get_contents('php://input');
$data=simplexml_load_string($xml,'SimpleXMLElement',$options=LIBXML_NOENT);
print_r($data);
通过编码绕过关键词检测:
XXE用于端口扫描、SSRF
扫端口(http协议):SSRF示例:
test.php1
2
3
4
5
if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){
file_put_contents('/tmp/lol.txt',$_GET[comrade]);
}
POST:成功ssrf:
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"1.0" encoding="UTF-8" xml version=
<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.php1
2
3
4
5
6
$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);
然后,类似于SQL注入,不能用注释符而已。
XPATH盲注
可以看这篇文章