浅谈Web安全-XSS攻击

简单的说一下我对Web安全的了解,主要是代码注入方面。

跨站脚本作为最常见的计算机安全漏洞,在世界各地的网站上疯狂肆虐,即使最知名的网站,如Google、Facebook、微软官方网站等,也曾遭受过XSS漏洞攻击。——《XSS跨站脚本攻击剖析与防御》

XSS

简介

跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

缩写:

Cross-site scripting的英文首字母缩写本应为CSS,但因为CSS在网页设计领域已经被广泛指层叠样式表(Cascading Style Sheets),所以将Cross改以发音相近的X做为缩写。但早期的文件还是会使用CSS表示Cross-site scripting。

小结:

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容,例如,网购钓鱼,诈骗者将一个XSS链接通过即时通信软件发送给用户,用户单击后,会自动跳转到钓鱼网站的页面,最终造成资金损失。

XSS跨站脚本攻击本身对Web服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。

总的来说,它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。
下图为XSS攻击流程:

XSS攻击流程

攻击手段和目的:

攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感信息),可以自行架设一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的服务器上。

常用的XSS攻击手段和目的有
  1. 网络钓鱼,包括盗取各类用户账号;
  2. 窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作,如进行不当的投票活动等;
  3. 劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等;
  4. 强制弹出广告页面、刷流量等;
  5. 网页挂马;
  6. 进行恶意操作,例如任意篡改页面信息、删除文章等;
  7. 进行大量的客户端攻击,如DDoS攻击(分布式拒绝服务攻击)攻击;
  8. 获取客户端信息,例如用户的浏览历史、真实IP、开放端口等;
  9. 控制受害者机器向其他网站发起攻击;
  10. 结合其他漏洞,如CSRF漏洞,实施进一步作恶;
  11. 提升用户权限,包括进一步渗透网站;
  12. 传播跨站脚本蠕虫等;
  13. 利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
    ……
分类

XSS根据其特性和利用手法的不同,主要分成两大类型:
- 反射型XSS(非持久型、参数型跨站脚本)
这种类型的跨站脚本是最常见,也是使用最广的一种,主要用于将恶意脚本附加到URL地址的参数中,例如:

http://www.test.com/search.php?key="><script>alert("XSS")</script>

一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的链接的时候,恶意JavaScript代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本,通常出现在网站的搜索栏、用户登入口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。如图所示:

反射型XSS

- 持久型XSS(存储型XSS);
它不需要用户单击特定URL就能执行跨站脚本,攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。

持久型XSS

持久型 XSS 一般出现在网站的留言、评论、博客日志等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当其他用户浏览该网页时,站点即从数据库中读取恶意用户存入的非法数据,然后显示在页面中,即在受害者主机上的浏览器执行恶意代码。

预防措施

1. 过滤特殊字符
XSS漏洞是由于Web应用程序对用户的输入过滤不足而产生的,所以避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤:
- PHP的htmlentities()或是htmlspecialchars()。
- Python的cgi.escape()。
- ASP的Server.HTMLEncode()。
- ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library
- Java的xssprotect (Open Source Library)。
- Node.js的node-validator。
2. 使用HTTP头指定类型
很多时候可以使用HTTP头指定内容的类型,使得输出的内容避免被作为HTML解析。如在PHP语言中使用以下代码:

<?phpheader('Content-Type: text/javascript; charset=utf-8');?>

即可强行指定输出内容为文本/JavaScript脚本(顺便指定了内容编码),而非可以引发攻击的HTML。
3. 用户方设置
包括Internet Explorer、Mozilla Firefox在内的大多数浏览器皆有关闭JavaScript的选项,但关闭功能并非是最好的方法,因为许多网站都需要使用JavaScript语言才能正常运作。通常来说,一个经常有安全更新推出的浏览器,在使用上会比很久都没有更新的浏览器更为安全。
参考
跨站脚本-维基百科
《XSS跨站脚本攻击剖析与防御》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值