本文目录一览:
- 1、浏览器的Xss过滤器机制是什么,为什么有些反射型Xss不会触发过滤器
- 2、这个xss有过滤方案么
- 3、在xss中各种过滤的情况,在什么地方可能存在注入点
- 4、做网站的时候,为什么在IE7上支持,在IE8下就不成样子了
- 5、如何防止xss攻击,需要过滤什么
- 6、网站受到了XSS攻击,有什么办法?
浏览器的Xss过滤器机制是什么,为什么有些反射型Xss不会触发过滤器
首先要说明的是 它是webkit的一个模块,而非chrome ,所以Safari和360安全浏览器极速模式等webkit内核的浏览器都有XSS过滤功能.
过滤方式:
通过模糊匹配 输入参数(GET query| POST form data| Location fragment ) 与 dom树,如果匹配中的数据中包含跨站脚本则不在输出到上下文DOM树中.另外,匹配的规则跟CSP没有什么关系,最多是有参考,CSP这种规范类的东西更新速度太慢跟不上现实问题的步伐.
关闭模式:
因为它有可能影响到业务,所以浏览器提供了关闭它的HTTP响应头.
X-XSS-Protection: 0
绕过方式:
因为专门做这方面的原因所以对绕过也有所了解,目前我发布过的一个bypass 0day还可以继续使用.
svgscript xlink:href=data:,alert(1)/script/svg
这个xss有过滤方案么
方案一:
避免XSS的方法之一主要是将用户所提供的内容输入输出进行过滤,许多语言都有提供对HTML的过滤:
可以利用下面这些函数对出现xss漏洞的参数进行过滤:
PHP的htmlentities()或是htmlspecialchars()。
Python 的 cgi.escape()。
ASP 的 ServerEncode()。
ASP.NET 的 ServerEncode() 或功能更强的 Microsoft Anti-Cross Site Scripting Library
Java 的 xssprotect(Open Source Library)。
Node.js 的 node-validator。
方案二:使用开源的漏洞修复插件。( 需要站长懂得编程并且能够修改服务器代码 )
在xss中各种过滤的情况,在什么地方可能存在注入点
XSS注入的本质就是:某网页中根据用户的输入,不期待地生成了可执行的js代码,并且js得到了浏览器的执行.意思是说,发给浏览器的字符串中,包含了一段非法的js代码,而这段代码跟用户的输入有关.常见的XSS注入防护,可以通过简单的htmlspecialchars(转义HTML特殊字符),strip_tags(清除HTML标签)来解决,但是,还有一些隐蔽的XSS注入不能通过这两个方法来解决,而且,有时业务需要不允许清除HTML标签和特殊字符.下面列举几种隐蔽的XSS注入方法:IE6/7UTF7XSS漏洞攻击隐蔽指数:5伤害指数:5这个漏洞非常隐蔽,因为它让出现漏洞的网页看起来只有英文字母(ASCII字符),并没有非法字符,htmlspecialchars和strip_tags函数对这种攻击没有作用.不过,这个攻击只对IE6/IE7起作用,从IE8起微软已经修复了.你可以把下面这段代码保存到一个文本文件中(前面不要有空格和换行),然后用IE6打开试试(没有恶意代码,只是一个演示):+/v8+ADw-script+AD4-alert(document.location)+ADw-/script+AD4-最容易中招的就是JSONP的应用了,解决方法是把非字母和数字下划线的字符全部过滤掉.还有一种方法是在网页开始输出空格或者换行,这样,UTF7-XSS就不能起作用了.因为只对非常老版本的IE6/IE7造成伤害,对Firefox/Chrome没有伤害,所以伤害指数只能给4颗星.参考资料:UTF7-XSS不正确地拼接JavaScript/JSON代码段隐蔽指数:5伤害指数:5Web前端程序员经常在PHP代码或者某些模板语言中,动态地生成一些JavaScript代码片段,例如最常见的:vara='!--?phpechohtmlspecialchars($name);?';不想,$name是通过用户输入的,当用户输入a’;alert(1);时,就形成了非法的JavaScript代码,也就是XSS注入了.只需要把上面的代码改成:vara=
做网站的时候,为什么在IE7上支持,在IE8下就不成样子了
ie7 和ie8
对某些样式支持不好,兼容性差
下面是ie7 和ie8的区别
1. 智能地址栏与内容匹配
智能地址栏让用户不仅可以找到所需的网站,还可以把历史记录、收藏夹中的标题同用户输入地址栏的内容进行匹配,不会出现重复的情况。
2. 选项卡分组关联性
选项卡分组,让用户可以确认哪个选项卡有相关内容,当点击一个选项卡中的链接而导向另外一个时,新的选项卡会在旁边出现,而且两个选项卡都会用一个颜色进行标记。
3. 右键可点击“新选项卡”页面
IE8中的“新选项卡”页进行了重新设计,让用户可以右键点击页面执行常见任务。
4. 重新打开上次浏览的页面
在不小心关闭浏览器或浏览器崩溃的情况下,IE8让用户可以重新打开最近浏览的页面。
5. 内查 “页面内查找”
a) 改进了人们在网页中搜索文本的方式。
b) 页面内查找:按Ctrl+F或者在编辑菜单或即时搜索对话框中选择,即可开启页面内查找功能。工具条显示在用户的选项卡下面,因此不会阻碍页面上的任何文本。
c) 结果数:强化的页面内查找功能,会显示搜索词在页面中出现的次数。
d) 结果高亮显示:强化的页面内查找功能让用户可以一眼就找到搜索项目,因为搜索文本出现的所有地方都会高亮显示。
6. Slipstream安装
可以实现IE8执行的和Windows Vista操作系统映像一部分的定制,不再需要单独安装。当以这种方式使用IE8时,将成为Windows Vista的一部分,因此改善桌面一致性和可管理性。
7. 设有ⅠE管理工具包
收藏夹定制和导入加速器的能力
8. 增加140多项设置:
IE8控制和配置包括加速器和网页快讯在内的浏览器特性,支持InPrivate、兼容性查看、SmartScreen等区域对象,新增了140多种设置,使总数达到接近1500种,
9. 增改七项子系统
除了在标准支持方面的改进,IE8也包括面向开发人员的平台特性。还在很多子系统中改进了性能,例如HTML解析器、级联样式表(CSS)规则处理、标签树作、Jscript解析器、清除对象时间和内存管理,针对开发人员的特性包括:
a) CSS 2.1:IE8全面支持CSS 2.1规范,因此网络开发人员和设计人员可以立刻开发网页并在多种浏览器上准确地渲染。
b) 文档对象模型(DOM)与HTML 4.01改进:IE8修复了很多跨浏览器不一致性问题;例如,获取/设置/删除属性等操作可以与其他浏览器互操作,而在异步Java Script与XML(AJAX)
c) 新兴标准:IE8融合了未来会成为行业标准的技术进步,例如W3C的HTML 5 Draft DOM Storage标准、Web Applications Working Group的Selectors API和ECMAScript 3.1语法。
d) 面向AJAX应用的全新浏览特性:开发人员现在可以在其AJAX应用中更新浏览器前后浏览堆栈以及地址栏,以便这些浏览器功能可以在AJAX应用中使用。
e) Acid2:IE8能准确地渲染Acid2浏览器测试。
f) 兼容性:IE8附带更多符合标准的排版引撑让开发人员可以为多款浏览器开发采用单一标准的网站。为了让开发人员可以选择何时迁移到符合新标准的布局引擎,IE8网络开发人员可采用IE7布局引擎,只需在代码中插入简单的元标签或在服务器上添加简单的http标头。
g) 开发人员可视工具:让开发人员可以在可视环境中快速调试HTML、CSS和Jscript。这些工具已经直接植入IE8并且包括扩展功能,包括用于在查看源代码时选择哪个应用程序的菜单选项。根据这个工具提供给DOM的分析。
10. 突破页面限制
IE8突破页面限制,涉及的特性包括:
a) 加速器:加速器消除了之前访问内容和服务过程中的多数鼠标点击,
b) 网页快讯:借助网页快讯,人们通常不必离开正在浏览的网页即可看到他们最希望看到的信息,而开发人员可以把网页的某个部分标记为网页快讯,让用户可以监测他们最常浏览的信息。在收藏夹一栏中,用户可以发现以粗体显示的包含更新内容的网页快讯,有可视化的内容并且包含到源网页的链接。
c) 即时搜索框:IE8中强化的即时搜索,便于用户寻找感兴趣的内容并提高搜索结果的相关度。当用户输入搜索词时,会实时看到来自所选搜索服务提供商的搜索建议,包括图像和富文本。为了便于在网站和搜索服务提供商的搜索建议之间实时切换,搜索框的底端还提供了菜单。此外,即时搜索框还可以显示用户的收藏夹和浏览历史的搜索结果。
11. 3层安全防护
a) InPrivate:InPrivate通过避免在PC上保留用户的数据和隐私信息来提供防护。这是一种针对第三方的防护,他们可能跟踪用户的网络活动。用户能够独立地使用两种功能(InPrivate浏览与InPrivate过滤)。
b) InPrivate浏览:启用后,InPrivate浏览确保不会在PC上记录浏览历史、临时Internet文件和cookies。在InPrivate模式下,工具条和扩展工具会自动禁用,而浏览历史会在浏览器关闭时自动删除。
c) InPrivate过滤:InPrivate过滤让用户可以阻止旨在跟踪和收集用户网络活动的第三方内容,从而帮助保护用户隐私。用户会被提醒,能够选择和控制允许或阻止那些第三方内容。
12. 兼容性视图查看
IE8提供了一种简单的方式来修复显示问题,例如菜单、图像和文本的错位,因为兼容性查看按钮可以按照页面最初的设计进行显示。某些网站针对旧版浏览器而设计,因此无法在IE8中正常显示。在默认情况下,IE8会以最符合标准的方式渲染内容。
13. 兼容性查看列表
使用IE8的用户可以选择接收在兼容性查看中效果最好的主要站点列表。当浏览这个列表中的网站时,IE8会自动在兼容性查看模式下自动显示这个网站,不要求用户按兼容性产看按钮。
14. 崩溃恢复
在IE8中,如果某个选项卡崩溃,则会自动恢复并重新载入,用户在这个页面上已经输入的任何信息(例如撰写电子邮件或填表)都有可能恢复。
15. 删除浏览历史记录
IE8强化了删除浏览历史记录的功能,支持删除某些cookies、历史记录和其他数据,同时保留针对喜欢站点的cookies、历史记录和其他数据。
16. SmartScreen过滤器
SmartScreen过滤器源于微软的钓鱼攻击过滤器,帮助防护钓鱼威胁以及阻止试图下载恶意软件的网站。SmartScreen过滤器提供用户界面和报警信息。
17. 点击劫持预防
IE8的这个新特性让网站内容负责人可以在页头处增加一个标签,帮助防止点击劫持——一种跨站点请求欺诈行为。点击劫持包括多种技术,用来欺骗用户无意地点击隐藏或不明显的Web元素,通常会引起意料之外的活动。IE8检测插入标签的网站并显示错误屏幕来表明内容主机已经选择不允许显示内容,同时让用户可以选择在新窗口中打开。
18. 跨站点脚本(XSS )过滤器
IE8帮助保护用户和系统避免信息泄露、cookie被盗和帐户/身份被盗,或者在不经用户允许的情况下假冒用户。XSS攻击是利用网络服务器和网络应用进行攻击的一种攻击方式:IE8拥有XSS过滤器,能够动态地检测1类XSS(反射)攻击。
19. 数据执行防护(DEP)
DEP在Windows Vista Service Pack 1中的IE8内默认启用,通过防止特定类型的代码写入可执行内存区,可以帮助防止病毒和其他安全威胁损害计算机。
20. 跨文件消息通讯(XDM)
XDM提供了一种高度安全的方法,让不同的文档可以在双方同意的情况下进行通信。XDM为双向跨文件通信提供了基于标准的同时,还提供StaticHtml方法和本地JavaScript Object Notation支持,在不牺牲性能的情况下保护数据。
21. 跨域请求(XDR)
跨域通信是AJAX开发和网状应用中不可缺少的一部分,IE8支持XDomainRequest对象,后者可以从另外一个域的服务器上请求公共资源。XDR检查特定网址和通配符的Access-Control-Allow-Origin,当只有服务器信号清楚地表明跨域共享数据时,跨域数据才可用。
22. 域名高亮显示
IE8以粗体字高亮显示地址栏中的网址字符串的域名,辨别正在访问那个网站,识别钓鱼网站和其它欺骗性网站。域名以黑色字体显示,网址中其他的灰色字符相区别。
23. 网站ActiveX:
网站ActiveX通过提供“隐含的”SiteLock(限制特定网域访问的工具)减少攻击面,这样,在默认情况下,控制只会在安装后开始运行。这使用户/管理员能管理哪些位置可以运行ActiveX。
24. 单用户ActiveX:
单用户ActiveX使开发人员能编写他们的ActiveX控件,这样当用户进行安装时,只会安装供该用户使用,而非供系统上的所有用户使用,并且为其他用户提供防止恶意软件或坏写入控制的保护。
如何防止xss攻击,需要过滤什么
XSS攻击通常是指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
一、HttpOnly防止劫取Cookie
HttpOnly最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie。目前主流浏览器都支持,HttpOnly解决是XSS后的Cookie支持攻击。
我们来看下百度有没有使用。
未登录时的Cookie信息
可以看到,所有Cookie都没有设置HttpOnly,现在我登录下
发现在个叫BDUSS的Cookie设置了HttpOnly。可以猜测此Cookie用于认证。
下面我用PHP来实现下:
?php
header("Set-Cookie: cookie1=test1;");
header("Set-Cookie: cookie2=test2;httponly",false);
setcookie('cookie3','test3',NULL,NULL,NULL,NULL,false);
setcookie('cookie4','test4',NULL,NULL,NULL,NULL,true);
?
script
alert(document.cookie);
/script
js只能读到没有HttpOnly标识的Cookie
二、输入检查
输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如、、'、"等,如果发现存在特殊字符,则将这些字符过滤或者编码。
例如网站注册经常用户名只允许字母和数字的组合,或者邮箱电话,我们会在前端用js进行检查,但在服务器端代码必须再次检查一次,因为客户端的检查很容易绕过。
网上有许多开源的“XSS Filter”的实现,但是它们应该选择性的使用,因为它们对特殊字符的过滤可能并非数据的本意。比如一款php的lib_filter类:
$filter = new lib_filter();
echo $filter-go('1+11');
它输出的是1,这大大歪曲了数据的语义,因此什么情况应该对哪些字符进行过滤应该适情况而定。
三、输出检查
大多人都知道输入需要做检查,但却忽略了输出检查。
1、在HTML标签中输出
如代码:
?php
$a = "scriptalert(1);/script";
$b = "img src=# onerror=alert(2) /";
?
div?=$b?/div
a href="#"?=$a?/a
这样客户端受到xss攻击,解决方法就是对变量使用htmlEncode,php中的函数是htmlentities
?php
$a = "scriptalert(1);/script";
$b = "img src=# onerror=alert(2) /";
?
div?=htmlentities($b)?/div
a href="#"?=htmlentities($a)?/a
2、在HTML属性中输出
div id="div" name ="$var"/div
这种情况防御也是使用htmlEncode
在owasp-php中实现:
$immune_htmlattr = array(',', '.', '-', '_');
$this-htmlEntityCodec-encode($this-immune_htmlattr, "\"script123123;/script\"");
3、在script标签中输出
如代码:
?php
$c = "1;alert(3)";
?
script type="text/javascript"
var c = ?=$c?;
/script
这样xss又生效了。首先js变量输出一定要在引号内,但是如果我$c = "\"abc;alert(123);//",你会发现放引号中都没用,自带的函数都不能很好的满足。这时只能使用一个更加严格的JavascriptEncode函数来保证安全——除数字、字母外的所有字符,都使用十六进制"\xHH"的方式进行编码。这里我采用开源的owasp-php方法来实现
$immune = array("");
echo $this-javascriptCodec-encode($immune, "\"abc;alert(123);//");
最后输出\x22abc\x3Balert\x28123\x29\x3B\x2F\x2F
4、在事件中输出
a href="#" onclick="funcA('$var')" test/a
可能攻击方法
a href="#" onclick="funcA('');alter(/xss/;//')"test/a
这个其实就是写在script中,所以跟3防御相同
5、在css中输出
在owasp-php中实现:
$immune = array("");
$this-cssCodec-encode($immune, 'background:expression(window.x?0:(alert(/XSS/),window.x=1));');
6、在地址中输出
先确保变量是否是"http"开头,然后再使用js的encodeURI或encodeURIComponent方法。
在owasp-php中实现:
$instance = ESAPI::getEncoder();
$instance-encodeForURL(‘url’);
四、处理富文体
就像我写这篇博客,我几乎可以随意输入任意字符,插入图片,插入代码,还可以设置样式。这个时要做的就是设置好白名单,严格控制标签。能自定义 css件麻烦事,因此最好使用成熟的开源框架来检查。php可以使用htmlpurify
五、防御DOM Based XSS
DOM Based XSS是从javascript中输出数据到HTML页面里。
script
var x = "$var";
document.write("a href='"+x+"'test/a");
/script
按照三中输出检查用到的防御方法,在x赋值时进行编码,但是当document.write输出数据到HTML时,浏览器重新渲染了页面,会将x进行解码,因此这么一来,相当于没有编码,而产生xss。
防御方法:首先,还是应该做输出防御编码的,但后面如果是输出到事件或脚本,则要再做一次javascriptEncode编码,如果是输出到HTML内容或属性,则要做一次HTMLEncode。
会触发DOM Based XSS的地方有很多:
document.write()、document.writeln()、xxx.innerHTML=、xxx.outerHTML=、innerHTML.replace、document.attachEvent()、window.attachEvent()、document.location.replace()、document.location.assign()
网站受到了XSS攻击,有什么办法?
一.跨站脚本攻击(XSS)
跨站脚本攻击(XSS,Cross-site scripting)是最常见和基本的攻击WEB网站的方法。攻击者在网页上发布包含攻击性代码的数据。当浏览者看到此网页时,特定的脚本就会以浏览者用 户的身份和权限来执行。通过XSS可以比较容易地修改用户数据、窃取用户信息,以及造成其它类型的攻击,例如CSRF攻击
常见解决办法:确保输出到HTML页面的数据以HTML的方式被转义
出错的页面的漏洞也可能造成XSS攻击.比如页面/gift/giftList.htm?page=2找不到,出错页面直接把该url原样输出,如果攻击者在url后面加上攻击代码发给受害者,就有可能出现XSS攻击
二. 跨站请求伪造攻击(CSRF)
跨站请求伪造(CSRF,Cross-site request forgery)是另一种常见的攻击。攻击者通过各种方法伪造一个请求,模仿用户提交表单的行为,从而达到修改用户的数据,或者执行特定任务的目的。为了 假冒用户的身份,CSRF攻击常常和XSS攻击配合起来做,但也可以通过其它手段,例如诱使用户点击一个包含攻击的链接
解决的思路有:
1.采用POST请求,增加攻击的难度.用户点击一个链接就可以发起GET类型的请求。而POST请求相对比较难,攻击者往往需要借助javascript才能实现
2.对请求进行认证,确保该请求确实是用户本人填写表单并提交的,而不是第三者伪造的.具体可以在会话中增加token,确保看到信息和提交信息的是同一个人
三.Http Heads攻击
凡是用浏览器查看任何WEB网站,无论你的WEB网站采用何种技术和框架,都用到了HTTP协议.HTTP协议在Response header和content之间,有一个空行,即两组CRLF(0x0D 0A)字符。这个空行标志着headers的结束和content的开始。“聪明”的攻击者可以利用这一点。只要攻击者有办法将任意字符“注入”到 headers中,这种攻击就可以发生
以登陆为例:有这样一个url:
当登录成功以后,需要重定向回page参数所指定的页面。下面是重定向发生时的response headers.
HTTP/1.1 302 Moved Temporarily
Date: Tue, 17 Aug 2010 20:00:29 GMT
Server: Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
Location:
假如把URL修改一下,变成这个样子:
那么重定向发生时的reponse会变成下面的样子:
HTTP/1.1 302 Moved Temporarily
Date: Tue, 17 Aug 2010 20:00:29 GMT
Server: Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
Location: ;CRLF
CRLF
scriptalert('hello')/script
这个页面可能会意外地执行隐藏在URL中的javascript。类似的情况不仅发生在重定向(Location header)上,也有可能发生在其它headers中,如Set-Cookie header。这种攻击如果成功的话,可以做很多事,例如:执行脚本、设置额外的cookie(CRLFSet-Cookie: evil=value)等。
避免这种攻击的方法,就是过滤所有的response headers,除去header中出现的非法字符,尤其是CRLF。
服务器一般会限制request headers的大小。例如Apache server默认限制request header为8K。如果超过8K,Aapche Server将会返回400 Bad Request响应:
对于大多数情况,8K是足够大的。假设应用程序把用户输入的某内容保存在cookie中,就有可能超过8K.攻击者把超过8k的header链接发给受害 者,就会被服务器拒绝访问.解决办法就是检查cookie的大小,限制新cookie的总大写,减少因header过大而产生的拒绝访问攻击
四.Cookie攻击
通过Java Script非常容易访问到当前网站的cookie。你可以打开任何网站,然后在浏览器地址栏中输 入:javascript:alert(doucment.cookie),立刻就可以看到当前站点的cookie(如果有的话)。攻击者可以利用这个特 性来取得你的关键信息。例如,和XSS攻击相配合,攻击者在你的浏览器上执行特定的Java Script脚本,取得你的cookie。假设这个网站仅依赖cookie来验证用户身份,那么攻击者就可以假冒你的身份来做一些事情。
现在多数浏览器都支持在cookie上打上HttpOnly的标记,凡有这个标志的cookie就无法通过Java Script来取得,如果能在关键cookie上打上这个标记,就会大大增强cookie的安全性
五.重定向攻击
一种常用的攻击手段是“钓鱼”。钓鱼攻击者,通常会发送给受害者一个合法链接,当链接被点击时,用户被导向一个似是而非的非法网站,从而达到骗取用户信 任、窃取用户资料的目的。为防止这种行为,我们必须对所有的重定向操作进行审核,以避免重定向到一个危险的地方.常见解决方案是白名单,将合法的要重定向 的url加到白名单中,非白名单上的域名重定向时拒之,第二种解决方案是重定向token,在合法的url上加上token,重定向时进行验证.
六.上传文件攻击
1.文件名攻击,上传的文件采用上传之前的文件名,可能造成:客户端和服务端字符码不兼容,导致文件名乱码问题;文件名包含脚本,从而造成攻击.
2.文件后缀攻击.上传的文件的后缀可能是exe可执行程序,js脚本等文件,这些程序可能被执行于受害者的客户端,甚至可能执行于服务器上.因此我们必须过滤文件名后缀,排除那些不被许可的文件名后缀.
3.文件内容攻击.IE6有一个很严重的问题 , 它不信任服务器所发送的content type,而是自动根据文件内容来识别文件的类型,并根据所识别的类型来显示或执行文件.如果上传一个gif文件,在文件末尾放一段js攻击脚本,就有可 能被执行.这种攻击,它的文件名和content type看起来都是合法的gif图片,然而其内容却包含脚本,这样的攻击无法用文件名过滤来排除,而是必须扫描其文件内容,才能识别。