`

XSS跨站脚本攻击在Java开发中防范的方法

    博客分类:
  • xss
 
阅读更多
SS攻击原理:
XSS 属于被动式的攻击。攻击者先构造一个跨站页面,利用script、<IMG>、<IFRAME>等各种方式使得用户浏览这个页面时,触发对被攻击站点的http 请求。此时,如果被攻击者如果已经在被攻击站点登录,就会持有该站点cookie。这样该站点会认为被攻击者发起了一个http 请求。而实际上这个请求是在被攻击者不知情的情况下发起的,由此攻击者在一定程度上达到了冒充被攻击者的目的。精心的构造这个攻击请求,可以达到冒充发文,夺取权限等等多个攻击目的。在常见的攻击实例中,这个请求是通过script 来发起的,因此被称为Cross Site Script。攻击Yahoo Mail 的Yamanner 蠕虫是一个著名的XSS 攻击实例。Yahoo Mail 系统有一个漏洞,当用户在web 上察看信件时,有可能执行到信件内的javascript 代码。病毒可以利用这个漏洞使被攻击用户运行病毒的script。同时Yahoo Mail 系统使用了Ajax技术,这样病毒的script 可以很容易的向Yahoo Mail 系统发起ajax 请求,从而得到用户的地址簿,并发送病毒给他人。
XSS 攻击主要分为两类:一类是来自内部的攻击,主要指的是利用WEB 程序自身的漏洞,提交特殊的字符串,从而使得跨站页面直接存在于被攻击站点上,这个字符串被称为跨站语句。这一类攻击所利用的漏洞非常类似于SQL Injection 漏洞,都是WEB程序没有对用户输入作充分的检查和过滤。上文的Yamanner 就是一例。
另一类则是来来自外部的攻击,主要指的自己构造XSS 跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个跨站网页放在自己的服务器上,然后通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。这一类攻击的威胁相对较低,至少ajax 要发起跨站调用是非常困难的。
案例实战:
我们来看一个简单的攻击实例,下表给出了一个简单的网站http://xss.honkwin.com:8080/testxss,该网站的密码和用户名相同,普通用户可以修改user value,当以admin 身份登陆时可以通过向doadmin.jsp 发起请求来修改admin value。
  index.jsp
<html>
<body>
<textarea rows="3" cols="100" readonly="on">
Current User: ${username}
Admin Value: ${adminvalue}
User Value: ${uservalue}
</textarea>
<br>
<a href="login.jsp"/>logout</a><br>
Login:<br>
<form action="login.jsp" method="post">
username: <input type="text" name="u"></input> <br>
password: <input type="text" name="p"></input> <br>
<input type="submit" /> password == username :-)
</form>
<form action="doadmin.jsp" method="post">
adminvalue: <input type="text" name="v"></input> <br>
<input type="submit" />
</form>
<form action="doadmin.jsp" method="post">
uservalue: <input type="text" name="v2"></input> <br>
<input type="submit" />
</form>
</body>
  
login.jsp

<%
String u = request.getParameter("u");
String p = request.getParameter("p");
if (u != null && p != null && u.equals(p)) {
session.setAttribute("username", u);
} else {
session.removeAttribute("username");
}
response.sendRedirect("index.jsp");
%> 
 
doadmin.jsp
<%
String u = (String)session.getAttribute("username");
String v = request.getParameter("v");
String v2 = request.getParameter("v2");
if (u != null && u.equals("admin")) {
if (v != null)
application.setAttribute("adminvalue", v);
}
if (u != null && v2 != null)
application.setAttribute("uservalue", v2);
response.sendRedirect("index.jsp");
%>

容易想到,只要诱骗admin 用户发起一个到http://xss.honkwin.com:8080/testxss/doadmin.jsp 的http 请求,就能成功攻击。因此我们设计跨站语句如下:

hello </textarea> <img src="http://bbs.honkwin.com/2xwfed" style="display:none"> </img>
hello </textarea> <form id="shit" action="http://xss.honkwin.com:8080/testxss/doadmin.jsp" metho
nd="post" target="myframe"/> <input type="hidden" name="v" value="hacked3"/> </form> <iframe
style="display:none" name="myframe"> </iframe><script>document.forms[0].submit()</script>
hello </textarea> <script language="jscript">v = new ActiveXObject("MSXML2.XMLHTTP.3.0"); v.
open("GET","http://xss.honkwin.com:8080/testxss/doadmin.jsp?v=hacked4"); v.send();alert(v.status
Text);</script>

以普通用户身份修改user value 为以上任何一个,当admin 浏览index.jsp 时,即可悄无声息的修改admin value
这里演示了3 种跨站手法:
1 是利用img、iframe 等tag 直接发起请求,这适用于无法直接出script 的情况,其中http://bbs.honkwin.com/2xwfed 是一个redirect,指向
http://xss.honkwin.com:8080/testxss/doadmin.jsp?v=hacked2 ;
2 是用script 提交post 表单;
3 是ajax 技术。
以上攻击能够成功有2 个原因:
1. 应用程序没有对user value 做足够多的过滤,导致用户有机会构造一个复杂的跨站语句来触发admin 的非预期行为;
2. 应用程序在响应admin value 修改请求时没有防范措施来识别这是不是出于用户主动。
漏洞1 很容易修复,只要像防止SQL Injection 那样对用户输入的所有内容都过滤即可。
漏洞2 才是问题的根源,即便我们修补了漏洞1,只要诱使admin 用户访问包含<imgsrc="http://bbs.honkwin.com/2xwfed"> </img>的页面,仍然能达到目的,而这是一件极容易
做到的事。
防范措施:
这里给出一些防范XSS 攻击的措施。必须说明的是,对于XSS 攻击,并不像SQLInjection 那样可以有一劳永逸的解决方案——只需要grep 一下所有的sql 调用。这是一
场长期的斗争,而且往往需要我们采取修改业务流程、产品设计等看似削足适履的手段。

防范手法如下:
1. 防堵跨站漏洞,阻止攻击者利用在被攻击网站上发布跨站攻击语句不可以信任用户提交的任何内容,首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把html tag 弄出来。这一个层面做好,至少可以堵住超过一半的XSS 攻击。
2. Cookie 防盗
首先避免直接在cookie 中泄露用户隐私,例如email、密码等等。其次通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价值,不可能拿来重放。
3. 尽量采用POST 而非GET 提交表单
POST 操作不可能绕开javascript 的使用,这会给攻击者增加难度,减少可利用的
跨站漏洞。
4. 严格检查refer
检查http refer 是否来自预料中的url。这可以阻止第2 类攻击手法发起的http 请求,也能防止大部分第1 类攻击手法,除非正好在特权操作的引用页上种了跨站访问。
5. 将单步流程改为多步,在多步流程中引入效验码
多步流程中每一步都产生一个验证码作为hidden 表单元素嵌在中间页面,下一步操作时这个验证码被提交到服务器,服务器检查这个验证码是否匹配。
首先这为第1 类攻击者大大增加了麻烦。其次攻击者必须在多步流程中拿到上一步产生的效验码才有可能发起下一步请求,这在第2 类攻击中是几乎无法做到的。
6. 引入用户交互
简单的一个看图识数可以堵住几乎所有的非预期特权操作。
7. 只在允许anonymous 访问的地方使用动态的javascript。
8. 对于用户提交信息的中的img 等link,检查是否有重定向回本站、不是真的图片等
可疑操作。
9. 内部管理网站的问题
很多时候,内部管理网站往往疏于关注安全问题,只是简单的限制访问来源。这种网站往往对XSS 攻击毫无抵抗力,需要多加注意。安全问题需要长期的关注,从来不是一锤子买卖。XSS 攻击相对其他攻击手段更加隐蔽和多变,和业务流程、代码实现都有关系,不存在什么一劳永逸的解决方案。此外,面对XSS,往往要牺牲产品的便利性才能保证完全的安全,如何在安全和便利之间平衡也是一件需要考虑的事情。
web应用开发者注意事项:
1.对于开发者,首先应该把精力放到对所有用户提交内容进行可靠的输入验证上。这些提交内容包括URL、查询关键
字、http头、post数据等。只接受在你所规定长度范围内、采用适当格式、你所希望的字符。阻塞、过滤或者忽略其它的
任何东西。
2.保护所有敏感的功能,以防被bots自动化或者被第三方网站所执行。实现session标记(session tokens)、
CAPTCHA系统或者HTTP引用头检查。
3.如果你的web应用必须支持用户提供的HTML,那么应用的安全性将受到灾难性的下滑。但是你还是可以做一些事来
保护web站点:确认你接收的HTML内容被妥善地格式化,仅包含最小化的、安全的tag(绝对没有JavaScript),去掉任何
对远程内容的引用(尤其是样式表和JavaScript)。为了更多的安全,请使用httpOnly的cookie。
分享到:
评论
2 楼 di1984HIT 2017-07-24  
bucuo !!!   
1 楼 pudong 2014-03-21  

相关推荐

    springmvc4配置防止XSS攻击的方法

    特别是在Web应用中,跨站脚本攻击(XSS)和SQL注入攻击是常见的安全威胁。XSS攻击是指攻击者通过在网页中嵌入恶意脚本代码,当其他用户浏览该网页时,恶意代码会执行,导致用户信息泄露、网站内容篡改等问题。而SQL...

    XSS跨域攻击在web项目中的防范,基于antisamy技术

    XSS(Cross-Site Scripting)跨站脚本攻击是一种常见的网络安全漏洞,它允许恶意用户在Web应用程序中注入可执行的脚本代码。这些注入的脚本可能在其他用户的浏览器中执行,导致敏感数据泄露、会话劫持、钓鱼攻击等...

    浅谈跨网站脚本攻击(XSS)的手段与防范(简析新浪微博XSS攻击事件)

    新浪微博攻击事件跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受...

    java 预防XSS攻击

    在Java开发过程中,XSS(Cross Site Scripting)攻击是一种常见的安全威胁,它允许攻击者在用户的浏览器上执行恶意脚本。XSS攻击通常发生在Web应用程序未能充分验证或过滤用户输入的情况下,使得恶意代码能够被嵌入...

    JAVA防止XSS注入,附jar包

    在网络安全领域,XSS(Cross-Site Scripting)攻击是一种常见的威胁,它允许攻击者通过在网页中插入恶意脚本来窃取用户数据或控制用户的浏览器。对于Java开发人员来说,防止XSS注入至关重要,因为这有助于确保应用...

    开发代码安全规范-防SQL注入和XSS跨站攻击代码编写规范.docx

    开发代码安全规范旨在确保软件开发过程中对SQL注入和XSS跨站攻击的防范,这是互联网应用开发中的两个重要安全问题。以下是对这两个安全威胁的详细解释以及对应的代码编写规范: **SQL注入** 是一种常见的攻击手段,...

    spring boot xss防御

    在Spring Boot应用中,XSS(Cross Site Scripting,跨站脚本攻击)是一种常见的安全威胁,它允许攻击者向Web页面注入恶意脚本,从而影响用户的安全。本项目"spring boot xss防御"旨在介绍如何在Spring Boot环境中...

    跨站脚本样例

    跨站脚本(Cross-Site Scripting,简称XSS)是一种常见的网络安全漏洞,它发生在Web应用中,允许攻击者在用户浏览器上注入恶意脚本。XSS攻击的主要目的是窃取用户的敏感信息,如Cookie,会话令牌,或者对用户进行...

    防xss攻击和sql注入

    XSS攻击是指攻击者通过在网页中插入恶意脚本,使得用户在浏览页面时,浏览器执行这些脚本,从而获取敏感信息或者对用户的会话进行劫持。XSS攻击主要有三种类型:存储型XSS、反射型XSS和DOM型XSS。为了防范XSS攻击,...

    SpringBoot +esapi 实现防止xss攻击 实战代码,满满干货

    在网络安全领域,XSS(Cross-Site Scripting)攻击是一种常见的威胁,它允许攻击者通过注入恶意脚本到网页上,来劫持用户会话、窃取敏感信息或执行其他恶意操作。SpringBoot是一个流行的Java微服务框架,而ESAPI...

    XSS攻击检测

    XSS(Cross-site scripting)攻击是一种常见的网络安全威胁,它利用了网站对用户输入的不当处理,使得攻击者能够在网页上注入恶意脚本。这些脚本可以在用户的浏览器中执行,从而获取敏感信息、操纵用户界面或者传播...

    java web Xss及sql注入过滤器.zip

    XSS 攻击是通过在网页中插入恶意脚本,当其他用户访问该页面时,这些脚本会被执行,从而窃取用户的敏感信息。为了防止XSS攻击,开发者通常会使用过滤器(Filter)来对HTTP请求中的输入进行清洗和转义,确保数据在...

    XSS HTMLFILTER

    XSS(Cross Site Scripting)攻击是网络安全领域中常见的威胁之一,它允许攻击者通过在网页上注入恶意脚本,从而影响用户浏览器的行为。这些脚本可以窃取用户的Cookie、会话信息,甚至进行钓鱼攻击。为了有效防止XSS...

    跨站语句大全

    跨站脚本攻击,简称XSS,是一种常见的网络安全漏洞,它允许攻击者在用户浏览器中注入恶意脚本。这些脚本可以伪装成用户信任的内容,从而窃取敏感信息、执行操作或者传播恶意软件。XSS攻击主要分为三类:反射型XSS、...

    开发安全培训(XSS攻击&SQL;注入).pdf

    XSS攻击指的是恶意用户将恶意脚本代码注入到网页中,当用户浏览该网页时,这些恶意代码得以执行。XSS攻击可以分为反射型、存储型和DOM型三种。反射型XSS攻击通常发生在服务器直接使用客户端提供的数据,如URL中的...

    扫描sql注入与xss攻击的牛b工具

    在网络安全领域,SQL注入和XSS(跨站脚本)攻击是两种常见的威胁,它们针对的是Web应用程序的安全性。本文将详细介绍这两种攻击类型以及相关的防范措施,并介绍一款名为"扫描SQL注射与XSS攻击的牛B工具"的实用工具,...

    SpringBoot整合XSS.zip

    在现代Web应用开发中,安全问题始终是开发者必须重视的核心环节。SpringBoot作为一个轻量级的Java框架,为快速构建高效、稳定的应用提供了强大的支持。然而,随着Web应用的复杂性增加,各种安全威胁也随之而来,如跨...

    阿里巴巴Java开发手册(嵩山版-2020.8).rar

    手册建议使用安全的编程习惯,如避免硬编码敏感信息,使用预编译SQL防止SQL注入,对用户输入进行过滤和校验,防止跨站脚本攻击等。 五、MySQL数据库 在数据库规约方面,手册给出了关于SQL语句编写、索引优化、事务...

Global site tag (gtag.js) - Google Analytics