宝哥软件园

JSP安全开发中XSS漏洞的详细说明

编辑:宝哥软件园 来源:互联网 时间:2021-09-07

大家好,好人是我,我是好人,我是-0nise。在主要的漏洞报告平台上,我们经常看到XSS漏洞。那么问题来了,为什么会有这样的漏洞呢?这个漏洞怎么修?

主体

1.XSS?XSS?XSS到底是什么?

XSS也被称为跨站点脚本。我不会告诉他它最初被称为CSS,但为了不与我们使用的级联样式表(CSS)混淆。CSS(跨站点脚本攻击)和CSS(级联样式表)既愚蠢又难以区分。这就是它被称为XSS的原因。

2.2的危害是什么。XSS?

实验1:

0x00构造代码

% @ page language=' Java ' import=' Java . util . * ' page encoding=' UTF-8 ' % % String path=request . getcontextpath();string base path=request . getscheme()' ://' request . getservername()' : ' request . getserverport()' path '/;%!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' HTML head base href=' %=base path % ' title my JSP ' index . JSP '起始页/title meta http-equiv=' pragma ' content=' no-cache ' meta http-equiv=' cache-control ' content=' no-cache ' meta http-equiv=' expires ' content=' 0 ' meta http-equiv=' keyword ' content=' keyword 1,keyword2,//接收值字符串tmp=request。get parameter(' opr ');//是减速null的输入值if(tmp==null){ out . print(' 111 ');}else{ //转码字符串opr=new string(tmp . getbytes(' iso-8859-1 '),' utf-8 ');out . print(opr);}%我是内容/div/正文/html0x01环境布局

0x02漏洞钻取

我们访问:http://本地主机:8080/XSS/index.jsp?Opr=i春秋

然后访问:http://localhost 33608080/XSS/index . JSP?opr=0nise

最后,我们发现了一个“伟大的定律”:

Opr参数等于打印的页面。(好像是废话)

让我们加载一张图片,看一看

转到:http://localhost 33608080/XSS/index . JSP?opr=

既然所有的图片都可以加载,那么我们的JS文件够宽可以加载吗?

访问:http://localhost :8080/XSS/index . JSP?opr=<script > alert(/我欢迎春秋社区的每个人/)

Js?Js?跳跃后有可能改变地址吗?

访问:http://localhost :8080/XSS/index . JSP?opr=<script > location . href=' http://BBS . ichunchuu.com '

既然xss可以加载js,那么我们是否可以通过js在本地打开一些东西呢?

提前放一份MD5.exe文件

访问:http://localhost :8080/XSS/index . JSP?opr=script var objShell=new ActiveX object(' wscript . shell ');objShell。run(' g :/work/XSS/WebRoot/M5 . exe ');/script

既然连本地文件都可以打开,远程文件木马?有电脑恶搞?这个自慢象限。我没那么说。

所有文件都可以打开,那么写一些文件怎么样?

访问:http://localhost :8080/XSS/index . JSP?opr=<script>var fso,TF;fso=新的ActiveXObject("脚本。filestystemobject ");tf=fso。CreateTextFile(" d : test . txt ",true);Tf。WriteLine(“我在春秋社区欢迎你”);tf。close();警报(“文件写入成功!”);

通过以上实验,我们可以看到opr参数赋值操作。如果opr参数没有值,则无法执行,攻击者在攻击前必须提前访问攻击者的设计。这种XSS攻击模式被称为:存储XSS

如果你想看到更强大的实验,请继续往下看。

实验二:

前言:

大多数网站都处理数据。那么,当XSS漏洞出现时,这些网站是什么样的呢?

0x00构造代码

数据库部分

BaseDao.java

导入Java。SQL。连接;导入Java。SQL。Drivermanager导入Java。SQL。PreparedStatement导入Java。SQL。resultset导入Java。SQL。SqLexception导入java.sql。语句;公共类BaseDAO { //打开连接public Connection getConn(){ Connection conn=null;请尝试{类。FOrname(' com。微软。SQLServer。JDBC。SQL server driver’);conn=驱动程序管理器。GetConnection(' JDBC :s QL server ://localhost :1433;databaseName=SQLTMP ',' sa ',' sa ');} catch(ClassNotFoundException e){ e . printstacktrace();} catch(SQLException e){ e . printstacktrace();}返回conn} //关闭链接的方法公共void closeAll(连接连接,语句状态,结果集){尝试{ if(rs!=null)RS。close();if(stat!=null)stat。close();if(conn!=null)conn . close();} catch(SQLException e){ e . printstacktrace();} } //重载关闭方法公共void closeAll(连接连接,PreparedStatement pstat,ResultSet rs){ try { if(rs!=null)RS。close();if(pstat!=null)pstat。close();if(conn!=null)conn . close();} catch(SQLException e){ e . printstacktrace();} } //继续重载public void closeAll(Connection conn,PreparedStatement pstat){ try { if(pstat!=null)pstat。close();if(conn!=null)conn . close();} catch(SQLException e){ e . printstacktrace();} } //增删改的公用方法public int upDate(String sql,Object[]pram){ PreparedStatement pstat=null;连接conn=null nt a=0;尝试{ conn=GetConn();pstat=conn . prepare statement(SQL);//遍历参数集合,将集合中的参数对应添加到结构化查询语言语句中for(int I=1;I=pram . lengthi){ pstat . set object(I,pram[I-1]);} //调用方法a=pstat。执行update();} catch(SQLException e){ e . printstacktrace();}最后{ closeAll(conn,pstat);}返回a;} } CommentDao.java

导入Java。SQL。*;导入Java。乌提尔。*;导入实体。*;公共类注释道扩展了basedo {/* * *获取所有留言* */public Listcomm GetComment(){//SQL语句字符串sql='选择CID,CName,CContext FROM Comments ';listcomm list=new ArrayListcomm();//数据库连接对象连接conn=null//SQL执行对象PreparedStatement pstmt=null//数据库执行返回值结果集rs=空尝试{ //创建数据库链接conn=这个。getconn();//创建结构化查询语言执行对象pstmt=conn . prepare statement(SQL);//执行结构化查询语言语句返回值RS=pstmt。execute query();//读取而(RS。next()){ comm comment=new comm();评论。setcid(RS。getint(' CID ');评论。setcname(RS。getstring(' CName ');评论。setccontext(RS。getstring(' CContext ');list.add(注释);} } catch(异常e){ e . print stack trace();}最后{ //关闭this.closeAll(conn,pstmt,RS);}返回列表;} public int AddComment(comm comment){ String SQL=' INSERT INTO Comments VALUES(?)';//受影响行数(同Internationalorganizations)国际组织结果=0;//数据库连接对象连接conn=null//SQL执行对象PreparedStatement pstmt=null尝试{ //创建数据库链接conn=这个。getconn();//创建结构化查询语言执行对象pstmt=conn . prepare statement(SQL);//设置参数pstmt.setString(1,注释。GetCName());pstmt.setString(2,注释。getccontext());//执行结构化查询语言语句结果=pstmt。执行update();} catch(异常e){ e . print stack trace();}最后{ this.closeAll(conn,pstmt);}返回结果;}}CommentServlvet

导入Java。io。*;导入javax。servlet。*;导入javax。servlet。http。*;导入实体。*;公共类评论视频扩展httpersvlet {/* * * Doget()*/public void Doget(Httpsersvletrequest请求,HttpServletResponse响应)抛出ServletException,IOException { request。setcharacten coding(' UTF-8 ');回应。setcontenttype(' text/html;字符集=UTF-8 ';PrintWriter out=响应。getwriter();字符串opr=请求。getParameter(' opr ');评论Dao评论Dao=新评论Dao();//检索参数是否为空if(opr==null | | opr。equals(' all '){ request。setattribute(' all '),commentDao .GetComment());//转发请求。getrequest dispatcher(' comment。JSP ').转发(请求、响应);} else if(opr。equals(' add '){ comm comment=new comm();评论。setcname(请求。getparameter(' UName ');评论。setccontext(请求。getparameter(' context ');如果(评论道.添加注释(注释)0){ out。打印('脚本警报('留言成功');location.href='CommentServlvet?opr=all ';/script ');}else{ out.print('scriptalert('留言失败');location.href='CommentServlvet?opr=all ';/script ');} } else { request。setattribute(' all '),commentDao .GetComment());//转发请求。getrequest dispatcher(' comment。JSP ').转发(请求、响应);}出去。flush();出去。close();}/* * * doPost()*/public void doPost(httprsvletrequest请求,HttpServletResponse响应)抛出ServletException,IOException { doGet(请求,响应);}}Comment.jsp

“% @”页面语言=“Java”导入=“Java”。乌提尔。*,实体.* "页面编码="UTF-8"% %字符串路径=请求。getcontextpath();字符串基本路径=请求。getscheme()' ://'请求。getservername()“:”请求。getserverport()“path ”/;%!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' HTML头基href=' %=基路径% ' title my JSP '注释。“JSP”起始页/title meta http-equi v=' pragma ' content=' no-cache ' meta http-equi v=' cache-control ' content=' no-cache ' meta http-equi v=' expires ' content=' 0 ' meta http-equi v='关键字' content='关键字1,关键字2,关键字if(请求。GetAttribute(' all '==null){请求。GetRequestDispatcher(' commentServVet?opr=all ').转发(请求、响应);} % table % Listentity。通信列表=(列表实体。通信)请求。GetAttribute(' all ');for(int I=0;我列举。size();i ){ % tr td%=list.get(i).getCName() %/td td%=list.get(i).getCContext()%/TD/tr % } %/表格表单操作='CommentServlvet?opr=add ' method=' post '文本区域rows=' 5 ' cols=' 30 ' name=' context '/文本区域昵称:输入类型=' text '名称=' UName '/输入类型=' submit '值='提交//表单/正文/html0x01漏洞实验

[电子邮件保护]~#

我们在留言板留言:

脚本var objShell=新的ActiveX对象(' wscript。shell’);objShell .run(' g :/work/XSS/WebRoot/M5。exe ');/script

然后访问:http://本地主机:8080/XSS

这样只要访问这个页面,软件就自动打开了,来个远程文件?慢慢领悟。

[电子邮件保护]~#

我们在留言板留言:

复制代码代码如下:scriptvar fsofso=新的ActiveXObject('脚本编写.filestytemobject’);tf=fso .CreateTextFile(' d : test。txt ',true);tf .WriteLine('i春秋社区欢迎您');tf .close();警报('文件写入成功!');/script

然后访问: http://本地主机:8080/XSS

文件写入成功。

[电子邮件保护]~#

留言内容:

[代码]脚本位置。href=' http://论坛。ichunchuu。com '/脚本[代码]

访问页面:http://本地主机:8080/XSS

访问留言页面自动跳转到攻击者特定的网站。难道这就是传说中的劫持吗?

3.XSS防御方案

正所谓哪里有攻击,哪里就有防御XSS一样,有攻击的方式,也有防御的方案。

埃尔表达式JSTL标签库

表达语言:[大小=12.0000磅]为了使JSP写起来更简单。表达式语言的灵感来自于ECMAScript和XPath表达式语语言,他提供了JSP中简化表达式的方法,让jsp代码更简单。

JSTL(联署材料标准标签库):开放源代码的JSP标签库。

实验一防御代码:

“% @”页面语言=“Java”导入=“Java”。乌提尔。*“页面编码=”UTF-8“% @ taglib uri=”http://Java。星期日com/JSP/jstl/core ' prefix=' c ' % % String path=request。getcontextpath();字符串基本路径=请求。getscheme()' ://'请求。getservername()“:”请求。getserverport()“path ”/;%!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' HTML头基href=' %=基路径% ' title my JSP '索引。“JSP”起始页/title meta http-equi v=' pragma ' content=' no-cache ' meta http-equi v=' cache-control ' content=' no-cache ' meta http-equi v=' expires ' content=' 0 ' meta http-equi v='关键字' content='关键字1,关键字2,关键字字符串tmp=request。getParameter(' opr ');//减速传入值是否为空if(tmp==null){ out。print(' 111 ');}else{ //转码字符串opr=新字符串(tmp。getbytes(' ISO-8859-1 ',' utf-8 ');request.setAttribute('name ',opr);% c:out值=' $ { RequestScope。name } '/c : out % } %我是内容/div/body/html

实验二防御代码:

“% @”页面语言=“Java”导入=“Java”。乌提尔。*,实体.* "页面编码=" UTF-8 " % % @ taglib uri=" http://Java。星期日com/JSP/JSTL/core " prefix=" c " % % String path=request。getcontextpath();字符串基本路径=请求。getscheme()' ://'请求。getservername()“:”请求。getserverport()“path ”/;%!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN ' HTML头基href=' %=基路径% ' title my JSP '注释。“JSP”起始页/title meta http-equi v=' pragma ' content=' no-cache ' meta http-equi v=' cache-control ' content=' no-cache ' meta http-equi v=' expires ' content=' 0 ' meta http-equi v='关键字' content='关键字1,关键字2,关键字if(请求。GetAttribute(' all '==null){请求。GetRequestDispatcher(' commentServVet?opr=all ').转发(请求、响应);} % table!-防御XSS方案-c : foreach var=' x ' items=' $ {请求范围。all } ' tr TD c : out值=' $ { x . getcname()} '/c : out/TD TD c : out值=' $ { x . getccontext()} '/c : out/TD/tr/c : foreach/表格表单操作='CommentServlvet?opr=add ' method=' post '文本区域rows=' 5 ' cols=' 30 ' name=' context '/文本区域昵称:输入类型=' text '名称=' UName '/输入类型=' submit '值='提交//表单/正文/html

结束语

技术无黑白,专研甚好。

更多资讯
游戏推荐
更多+