Web安全相关(一):跨站脚本攻击(XSS)
简介
一些场景
1. 恶意攻击者可以在个人介绍里面插入恶意代码,那么其他用户访问他的个人信息时,就会执行恶意代码。
2. 恶意攻击者可以发表一篇文章,取一个吸引眼球的标题,在内容里插入恶意代码,那么用户查看这篇文章时,就会执行恶意代码。
3. 恶意攻击者在一些热门文章或帖子里的回复或留言中插入恶意代码,那么用户浏览到他的回复或留言时,就会执行恶意代码。
防止XSS的两个阶段
1. 提交数据时,就对数据进行验证,如果含有恶意脚本,则不让数据进库,ASP.NET MVC默认是会做这个验证。如下图,如果试图插入恶意脚本,就会得到一个HttpRequestValidationException。注:图2红色框中的方法后续会提到。
图1
图2
如果我们需要允许脚本入库,可以在对应的Action上加上[ValidateInput(false)]。此时恶意脚本还不能产生威胁,因为还有后面一个阶段的防止措施。
图3
图4
2. 输出数据时,对输出的内容采用HTML编码,恶意脚本不会被执行。而且,MVC的Razor语法默认就采用HTML编码。但是如果我们采用Html.Raw()来输出内容的话,恶意脚本就会产生威胁。
图5
图6
一些恶意脚本
$.ajax数据验证失效?
我们假设我们的需求是不允许含有恶意脚本的数据进库的,但是我们使用了jquey的ajax进行交互。
图7
图8
图9
图10
数据还是进库,为什么呢?我们来研究下图2红框中的方法。
图11
图12
从图12中,我猜测MVC会对Request中的以上内容进行验证,可是jquery ajax的数据是存在Request的Content里面的,因此,默认的验证对jquery ajax并没有效果。
$.ajax数据验证实现
要对$.ajax进行数据验证,我从ModelBinder下手。具体代码如下:
public class AjaxModelBinder : DefaultModelBinder
{
protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
var contentType = controllerContext.HttpContext.Request.ContentType; if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase) &&
value is string &&
controllerContext.Controller.ValidateRequest &&
bindingContext.PropertyMetadata[propertyDescriptor.Name].RequestValidationEnabled)
{
if (IsDangerousString(value.ToString()))
{
throw new HttpRequestValidationException("在请求中检测到有潜在危险的值!");
}
} return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
} /// <summary>
/// Refer the method "System.Web.CrossSiteScriptingValidation.IsDangerousString".
/// </summary>
private static bool IsDangerousString(string str)
{
var startingChars = new[] { '<', '&' };
var startIndex = ; while (true)
{
var index = str.IndexOfAny(startingChars, startIndex); if (index < )
{
return false;
} if (index == (str.Length - ))
{
return false;
} var ch = str[index]; if (ch != '&')
{
if ((ch == '<') && ((IsAtoZ(str[index + ]) || (str[index + ] == '!')) || ((str[index + ] == '/') || (str[index + ] == '?'))))
{
return true;
}
} else if (str[index + ] == '#')
{
return true;
} startIndex = index + ;
}
} private static bool IsAtoZ(char c)
{
return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
}
}
然后在Global.asax.cs中注册AjaxModelBinder。
图13
那么,输入数据有恶意脚本时就会被检测出来。
图14
关于AjaxModelBinder中的IsDangerousString方法,我是从.Net的源码拷贝过来的。
图15
另外,如果需要对js显示内容进行编码,可以使用Ajax.JavaScriptStringEncode()方法。
AntiXSS第三方组件
如果使用.Net4.0及以上的版本,那么就不需要引入AntiXSS,因为.Net 4.0已经把AntiXSS集成进来了。如果是其他版本则需要引入。
XSS扫描检测工具
我之前的公司有专门的测试团队,他们用工具可以对程序进行扫描找出有风险的页面,并给出建议。现在想了解下这方面的工具,如果有对这方面了解的朋友,欢迎给我推荐工具。
源码下载
为了方便使用,我没有使用任何数据库,而是用了一个文件来存储数据。代码下载后可以直接运行,无需配置。
下载地址:https://github.com/ErikXu/XSS
Web安全相关(一):跨站脚本攻击(XSS)的更多相关文章
- 跨站脚本攻击XSS(二)——session劫持
转载自:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小 ...
- 记录一次网站漏洞修复过程(三):第二轮处理(拦截SQL注入、跨站脚本攻击XSS)
在程序编写的时候采用参数化的SQL语句可以有效的防止SQL注入,但是当程序一旦成型,再去修改大量的数据库执行语句并不是太现实,对网页表单上输入进行校验是易于实现的方法.在webForm 页面中开启校验 ...
- [Web安全之实战] 跨站脚本攻击XSS
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1. 认识XSS 2. ...
- Web安全之跨站脚本攻击(XSS)
XSS 简介 跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做&q ...
- 跨站脚本攻击XSS
跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到 ...
- java防范跨站脚本攻击(XSS)
网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加fi ...
- 渗透之路基础 -- 跨站脚本攻击XSS
目录 漏洞原理及防御 XSS 原理分析:输出问题导致js代码被识别执行 XSS 技术分类 Cookie盗取 基于Xss的WebShell箱子的攻击 XSS相关防护过滤及绕过分析(参考链接) 防护: 绕 ...
- 跨站脚本攻击xss学习
0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: ...
- 网站安全系列:跨站脚本攻击XSS
本篇博文主要从概念和应用上介绍XSS,主要内容来源于<白帽子讲web安全> XSS核心本质 XSS实际上是一种HTML注入,用户输入的数据被当成HTML的一部分来执行.防御方法核心是输入检 ...
- 网络安全-跨站脚本攻击XSS(Cross-Site Scripting)
一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者 ...
随机推荐
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- C语言 · 4-3水仙花数
问题描述 打印所有100至999之间的水仙花数.所谓水仙花数是指满足其各位数字立方和为该数字本身的整数,例如 153=1^3+5^3+3^3. 样例输入 一个满足题目要求的输入范例.例:无 样例输出 ...
- potrace源码分析一
1 简介 potrace是由Dalhousie University的Peter Selinger开发一款位图轮廓矢量化软件,该软件源码是可以公开下载的,详细见项目主页:http://potrace. ...
- Zabbix 漏洞分析
之前看到Zabbix 出现SQL注入漏洞,自己来尝试分析. PS:我没找到3.0.3版本的 Zabbix ,暂用的是zabbix 2.2.0版本,如果有问题,请大牛指点. 0x00 Zabbix简介 ...
- Android开发学习——动画
帧动画> 一张张图片不断的切换,形成动画效果* 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 ...
- maven的pom.xml关系依赖书写顺序
今天遇到了一个情况,以前代码编译没有问题,升级了hbase客户端phoenix驱动,又调整了thrift的关系依赖的位置,放到了这个驱动后面. 如下: 导致了一个thrift接口类编译报错: 检查这个 ...
- 《Note --- Unreal --- MemPro (CONTINUE... ...)》
Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...
- [css]实现垂直居中水平居中的几种方式
转自博客 http://blog.csdn.net/freshlover/article/details/11579669 居中方式: 一.容器内(Within Container) 内容块的父容器设 ...
- BZOJ 3894: 文理分科 [最小割]
3894: 文理分科 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 674 Solved: 392[Submit][Status][Discuss] ...
- jsp
-----------------