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>";//保存xmluserDao.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>";

这样就解决啦。

更多相关文章

  1. Xml格式数据的生成和解析的代码详情
  2. Web设计中如何使用XML数据源对象详细介绍
  3. 深入理解XML中的字符实体与字符数据
  4. 详细介绍将XML数据转换成HTML的示例代码
  5. 数据中有'<'、'&'符号时,封装的XML就无法解析的解决方法
  6. 介绍数据库生成xml的两个简单示例代码
  7. 详细介绍json数据格式和xml数据格式的区别和用法
  8. JS读取XML数据的示例代码分享
  9. XML数据解析的系统方法的代码分享

随机推荐

  1. MySQL数据库多表查询
  2. 在原最大分区基础上再增加分区方法
  3. 使用JDBC处理MySQL大数据
  4. MySql 优化之like语句
  5. mysql galera cluster 集群的分裂与仲裁
  6. linux CentOS 7.4下 mysql5.7.20 密码改
  7. c语言把mysql数据库语句和变量封装为一个
  8. 错误'未知表引擎'InnoDB''查询。重启mysq
  9. 添加到LEFT JOIN查询
  10. MySQL查询优化系列讲座之数据类型与效率