课程名称: 大话HTTP协议 漫画+图解打造的编程基础课程
课程章节: 跨站脚本攻击
课程内容:
- 跨站脚本攻击(Cross Site Scripting),XSS是一种经常出现在Web应用中的计算机安全漏洞
- 它允许恶意Web用户将代码植入到提供给其他用户使用的页面中,其他用户在观看网页时,恶意脚本就会执行
- 这类攻击通常通过注入HTML或js等脚本发动攻击
- 攻击成功后,攻击者可以得到私密网页内容和cookie等
- 最近几年XSS攻击已经肠胃最流行的攻击方式
- 盗取各类用户账号, 如机器登录账号、用户网银账号、各类管理员账号
- 控制数据,包括读取、篡改、添加、删除企业敏感数据的你能力
- 盗窃企业重要的具有商业价值的资料
- 非法转账
- 强制发送网站挂马
- 控制受害者机器向其他网站发起攻击
- 2005年,一名叫做Samy的用户发现了MySpace的XSS漏洞,他在用户资料页面插入一些JavaScript脚本
- 如果一个用户查看了他的用户资料,这段脚本就会被执行
- 脚本包含两方面内容,一是把Samy加为好友,二是将上面说的脚本复制到受害者自己的用户资料页面中
- 于是,所有查看受害者用户资料的用户也会成为受害者
- 一个基于存储式XSS攻击的蠕虫迅速扩散,几个小时内,Samy收到了近百万个好友申请
- 为此,MySpace被迫关站,修复反XSS过滤机制并且从所有用户的资料中删除含有恶意脚本的内容
- 2010年,Apache Foundation被攻击者利用其问题追踪应用程序中的漏洞、通过反射式XSS攻击攻破
- 首先,攻击者发布一个使用重定向服务进行模糊处理的链接,该链接指向一个利用上述XSS漏洞获取登录用户的会话令牌的URL
- 如果管理员点击链接,其会话将被攻破,攻击者获得对应程序的管理访问权限
- 然后,攻击者修改某个项目的设置,将该项目的上传文件夹更改为应用程序的Web根目录中的可执行目录
- 随后,攻击者向此文件夹上传一个木马登录表单,从而获取特权用户的账号和密码
针对XSS的攻击方式,可以分为三大类:反射式XSS、存储式XSS、基于DOM的XSS。
反射式XSS- 也称为非永久性XSS,是目前最流行的XSS攻击
- 它出现在服务器直接使用客户端提交的数据,如URL的数据、HTML表单中提交数据等,并且没有对数据进行无害化处理
- 如果提交的数据中含有HTML控制字符而没有正确处理,那么一个简单的xss攻击就会发生
- 典型的反射式攻击可通过一个邮件或中间网站,诱饵是一个看起来可信任的站点的链接,其中包含XSS攻击脚本
- 如果信任的网站没有正确处理这个脚本,用户点击后就会导致浏览器执行含有恶意攻击的脚本
反射式XSS例子
这个简单例子的测试有助于告诉我们两个问题:
- 首先,input的值可以用于任何返回给浏览器的数据替代
- 其次,无论服务器应用程序如何处理这些数据,都无法阻止提交JavaScript代码,一旦该页面显示,这些代码就会被执行
- 也称为永久性XSS,危害更大
- 攻击将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能,其中包括了Web服务器的管理员
- 存储式XSS多发生在最终显示给其他用户的位置包含:
- 个人信息字段,如姓名、地址、电子邮件、电话等
- 文档、上传文件及其他数据的名称
-
存储式XSS多发生在最终显示给其他用户的位置包含:
- 提交给应用程序管理员的反馈或问题
- 向其他应用程序用户传送的消息、注释、问题等
- 在用户之间共享的上传文件内容
典型的存储式XSS攻击过程
- 我拥有一个Web站点,该站点允许用户发布信息、浏览已发布的信息。
- 你注意到我的站点具有存储式的XSS漏洞
- 于是你发布一个热点信息,利用该漏洞获取用户信息,吸引其他用户纷纷阅读
- 任何其他浏览信息,其会话cookies或者其他信息将被你盗走
- 反射式XSS攻击和存储式XSS攻击都是通过服务器端提取用户提交的数据
- 并且以不安全的方式将其返回给用户
- 基于DOM的攻击金金通过JavaScript的方式执行
- 也就是说这种攻击常发生在应用程序每次返回相同的静态HTML,而通过客户端JavaScript动态生成信息,并不会跟服务端交互获取的时候
XSS攻击载荷
- 会话令牌
- XSS 攻击最普遍的方式
- 截取一名受害者的会话令牌,劫持他的会话,进而作为受害者的身份来使用应用程序,执行任意操作并占有该用户的账户
- 虚拟置换
- 这种攻击需要在一个Web应用程序页面注入恶意数据,从而向应用车顶徐的用户传送误导性信息
- 包括简单的向站点注入HTML,或者使用脚本注入精心设计的内容
- 攻击者实际上没有修改保存在服务器上的内容,而是利用程序处理并显示用户提交的输入方面的缺陷实现置换
- 注入木马
- 这种攻击造成的后果远比虚拟置换严重,它在易受攻击的应用程序中注入实际运行的功能,旨在欺骗终端用户执行某种有害操作(如输入敏感数据)
- 随后将他们传送给攻击者
- 在一个明显的攻击中,攻击者注入的功能向用户显示一个木马登录表单,要求他们向攻击者控制的服务器提交他们自己的证书
- 如果由技巧熟练的攻击者实施,这种攻击还允许用户无缝登录到真正的应用程序中,以便他们不会发觉访问过程中的任何反常情况
- 然后,攻击者就可以自由使用受害者的证书实现自己的目的
- 这种类型的有效载荷非常适用于在钓鱼攻击中,向用户传送一个经过专门设计、连接可信应用程序的URL,并要求他们正常登录以访问这个URL
- 输入验证
- 如果应用程序在某个位置收到的用户提交的数据将来有可能被复制到它的响应中,应用程序应根据这种情形对这些数据执行尽可能严格的确认
- 需要确认数据潜在特性包括一下几点
- 数据不是太长
- 数据仅包含某组合法字符
- 数据与一个特殊的正规表达式相匹配
- 根据应用程序希望在每个字段中收到的数据类型,尽可能限制性地对姓名、电子邮件地址、账号等应用不同的确认规则
- 输出编码
- 如果应用程序将某位用户或第三方提交的数据复制到它的响应中,那么应用程序应对这些数据进行HTML编码,以净化可能的恶意字符
- HTML编码指用对应的HTML实体替代字面量字符。这样做可确保浏览器安全处理可能为恶意的字符,把他们当做HTML文档的内容而非结构处理
- 经常造成问题的字符的HTML编码如下:
- 应用程序之所以结合使用输入确认与输出净化,原因在于这种方法能够提供两层防御:如果其中一层被攻破,另一层还能提供一些保护
- 许多执行输入与输出确认的过滤都容易被攻破
- 结合这两种技巧,应用程序就能够获得额外的保护,即使攻击者发现其中一种过滤存在缺陷,另一种过滤仍然能够阻止他实施攻击
- 在这两种防御中,输出确认最为重要,必不可少。实施严格的输入确认应被视为一种次要故障恢复
课程收获:
感谢老师,给我们介绍了什么是XSS攻击,让我们了解了XSS攻击分为反射式XSS、存储式XSS、基于DOM的XSS三种类型,以及他们各自的危害性,并且告诉了我们如何防御XSS攻击,可以通过输入验证和输出编码的方式进行防御。
课程截图: