微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

详细介绍Web安全之XML注入的示例代码

XML注入攻击,和sql注入的原理一样,都是攻击者输入恶意的代码来执行自身权限以外的功能。 XML是存储数据的一种方式,如果在修改或者查询时,没有做转义,直接输入或输出数据,都将导致XML注入漏洞。攻击者可以修改XML数据格式,增加新的XML节点,对数据处理流程产生影响。

攻击

下面是一个保存注册用户信息为XML格式的例子:

final String GUESTROLE = guest_role;
...
//userdata是准备保存的xml数据,接收了name和email两个用户提交来的数据。
String userdata = <USER role=+
                GUESTROLE+
                ><name>+
                request.getParameter(name)+
                </name><email>+
                request.getParameter(email)+
                </email></USER>;
//保存xml
userDao.save(userdata);

可以看到,这段代码没有进行任何的过滤操作。一个普通用户注册后,会产生这样一条数据记录:

<?xml version=1.0 encoding=UTF-8?>
<USER role=guest_role>
    <name>user1
    </name>
    <email>user1@a.com
    </email>
</USER>

攻击者输入自己email时,可以输入如下代码

user1@a.com</email></USER><USER role=admin_role><name>lf</name><email>user2@a.com

最终用户注册后,数据就变成了:

<?xml version=1.0 encoding=UTF-8?>
<USER role=guest_role>
    <name>user1
    </name>
    <email>user1@a.com</email>
</USER>
<USER role=admin_role>
    <name>lf</name>
    <email>user2@a.com
    </email>
</USER>

可以看到,多出了一条role=“admin_role”的管理员lf。达到攻击目的。

防御

还是那句老话,有攻击就有防御。防御的原理其实也很简单,就是对关键字符串进行转义:

& --> &
 < --> <
 > --> >
  --> 
 ' --> '

在XML保存和展示之前,对数据部分,单独做转义即可:

String userdata = <USER role=+
                GUESTROLE+
                ><name>+
                StringUtil.xmlencode(request.getParameter(name))+
                </name><email>+
                StringUtil.xmlencode(rrequest.getParameter(email))+
                </email></USER>;

这样就解决啦。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。