01
XSS跨站脚本介绍
跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端Javascript脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者可能采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。
XSS跨站脚本攻击本身对Web服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意URL,当受害者在Web浏览器中打开该URL的时候,恶意脚本会在受害者的计算机上悄悄运行,流程如图所示:
02
XSS的危害
1.网络钓鱼,包括盗取各类用户账号;
2.窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;
3.劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等;
4.强制弹出广告页面、刷流量等;
5.网页挂马;
6.进行恶意操作,例如任意篡改页面信息、删除文章等;
7.进行大量的客户端攻击,如DDoS攻击;
8.结合其他漏洞,如CSRF漏洞,实施进一步作恶;
9.传播跨站脚本蠕虫等。
03
XSS的原理及案例
XSS根据其特性和利用手法的不同,只要分成两大类型:一种是反射型跨站脚本;另一种是持久型跨站脚本。
1.反射型XSS
反射型跨站脚本也称作非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见的,也是使用最广的一种,主要用于将恶意脚本附加到URL地址的参数中,例如:
http://www.test.com/search.php?key=”><script>alter(“XSS”)</script>
http://www.test.com/logout.asp?out=1&ur1=javascript:alert(document.cookie)
反射型XSS的利用一般是攻击者通过特定手法(比如利用电子邮件),诱惑用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的链接的时候,恶意JavaScript代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。
反射型XSS的攻击流程如图所示:
此类XSS通常出现在网站的搜索栏、用户登入口等地方,常用来窃取客户端Cookies或进行钓鱼欺骗。
如下为反射型XSS的一个案例:当在该网站的姓名提交框内输入恶意的JavaScript脚本时,点击提交按钮,便出现了反射型XSS攻击,如图所示:
反射型XSS的危害往往不如持久型XSS,因为恶意代码暴露在URL参数中,并且时刻要求用户单击方可触发,稍微有点安全意识的用户可以轻易看穿链接是不可信任的。如此一来,反射型XSS攻击的成本要比持久型XSS高得多。
2.持久型XSS
持久型跨站脚本也等于存储型跨站脚本,比反射型跨站脚本更具威胁性,并且可能影响到Web服务器自身的安全。
此类XSS不需要用户单击特定的URL就能执行跨站脚本,攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。
持久型XSS的攻击流程如图所示:
持久型XSS一般出现在网站的留言、评论。博客日志等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当其他用户浏览该网页时,站点即从数据库中读取恶意用户存入的非法数据,然后显示在页面中,即在受害者主机上的浏览器执行恶意代码。
如下为持久型XSS的一个案例:当攻击者在留言框内输入恶意JavaScript代码并提交后,其他用户再浏览这个页面时,就会发生持久型XSS攻击,如图所示:
持久型XSS不需要用户去单击URL进行触发,所以他的危害比反射型XSS大,黑客可以利用它渗透网站、挂马、钓鱼……
04
XSS防御方案
XSS 漏洞是由于对用户提交的数据没有经过严格的过滤处理造成的,所以防御的原则就是不相信用户输入的数据,对输入进行过滤,对输出进行编码。
1.使用XSS Filter
对用户提交的信息进行有效的验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略此外的其他任何数据。此外,还需过滤有效的和净化有害的输入。
例如:
▻ 表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
▻ 过滤或移除特殊的 html 标签:<script>、<iframe>等。
▻ 过滤 js 事件的标签:onclick、onerror、onfocus等。
2.使用编码(HTMLEncode)
HTML编码在防止XSS攻击上可以起到很大的作用,它主要是用对应的HTML实体替代字面量字符,这样做可确保浏览器安全处理可能存在的恶意字符,将其当做HTML文档的内容而非结构加以处理。
一些常见的可能造成问题的字符的HTML编码如表所示:
3、JavaScript编码
这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码,并且只把这些数据放到使用引号包围起来的值部分(data value)之中,除了上面的那些转义之外,还要附加上下面的转义:
\ 转成 \\
/ 转成 \/
; 转成 ;(全角;)
4、Http Only cookie
许多 XSS 攻击的目的就是为了获取用户的cookie,将重要的 cookie 标记为http only,这样的话当浏览器向服务端发起请求时就会带上cookie字段,但是在脚本中却不能访问 cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie。