白帽子讲web安全——第三章 Note

跨站脚本攻击(XSS)

跨站脚本攻击是客户端脚本安全中的头号大敌。OWASP TOP 10威胁多次把XSS列在榜首

跨站脚本攻击 英文全称是Cross Site Scripts 本来缩写是CSS 但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做“XSS”

复杂的应用环境是XSS滋生的温床

反射型XSS

简单的把用户输入的数据“反射”给浏览器。也就是说 黑客往往需要诱使用户“点击”一个恶意链接 才能攻击成功。反射型XSS也叫做“非持久型XSS”(Non-persistent XSS)

存储型XSS

把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。

DOM Based XSS

通过修改页面的DOM节点形成的XSS 从效果上来说也是反射型XSS

XSS Payload 实际上就是JavaScript脚本(还可以是Flash或其他富客户端的脚本),所以任何JavaScript脚本能实现的功能,XSS Payload都能做到

一个最常见的XSS Payload 就是通过读取浏览器的Cookie对象 从而发起“Cookie劫持”攻击
攻击者可以不通过密码 而直接登录进用户的账户
这是因为在当前web中 cookie一般是用户登录的凭证 浏览器发起的所有请求都会自动带上cookie。如果cookie没有绑定客户端信息 攻击者窃取了cookie后 就可以不用密码登录进用户账户

构造GET与POST请求

XSS 钓鱼

实现思路:利用JavaScript在当前页面上“画出”一个伪造的登录框,当用户在登录框中输入用户名与密码后,其密码将被发送至黑客的服务器上。

识别用户浏览器

如何通过JavaScript脚本识别浏览器版本呢?最直接的就是通过XSS读取浏览器的UserAgent对象
alert(navigator.userAgent);
这个对象告诉我们很多客户端信息:OS版本 浏览器版本 系统语言
但是浏览器的UserAgent是可以伪造的 所以通过JavaScript取出来的这个浏览器对象,信息不一定准确。

识别用户安装的软件

在IE中 可以通过判断ActiveX控件的classid是否存在 来推测用户是否安装了软件
黑客通过判断用户安装的软件 选择对应的浏览器漏洞 最终达到植入木马的目的

CSS History Hack

原理是利用style的visited属性——如果用户曾经访问过某个链接 那么这个链接发颜色会变得与众不同

获取用户的真实IP地址

一般来说XSS攻击需要借助第三方软件来完成。比如 客户端安装了Java环境(JRE) 那么XSS就可以通过调用Java Applet的接口获取客户端的本地IP地址
在XSS攻击框架“Attack API”中 就有一个人获取本地IP地址的API 此外还有两个利用Java获取本地网络信息的API

XSS攻击平台
  Attack API
  BeEF
  XSS-Proxy

这些攻击平台有助于深入理解XSS的原理和危害

终端武器 XSS Worm

Samy Worm:Samy 蠕虫的技术细节分析http://namb.la/popular/tech.html
百度空间蠕虫

一般来说 用户之间发生交互行为的页面 如果存在存储型XSS 则比较容易发起XSS Worm攻击

调试JavaScript工具 及辅助测试工具

Firebug 第一利器(除了Firefox外 对其他浏览器支持并不好
IE 8 Developer Tools
Fiddler支持脚本编程 有助于安全测试
HttpWatch 多用于企业商用

XSS构造技巧

1.利用字符编码(组成新的Unicode字符
2.绕过长度限制(利用event来缩短所需要的字节数 不过最好是把XSS Payload写到别处 在通过简短的代码加载这段XSS Payload。 最常用的一个“藏代码”的地方就是“location.hash”。在某些环境下 可以利用注释符绕过长度限制。
3.使用< base >标签
4.window.name的妙用

变废为宝:Mission Impossible

1.Apache Expert Header XSS
2.Anehta的回旋镖
(思路:如果在B区域上存在一个反射型“XSS_B”,在A区域上存在一个存储型“XSS_A”,当用户访问A区域上的“XSS_A”时,同时嵌入B区域上的“XSS_B”,则可以达到在A域的XSS攻击B域用户的目的。
对于Firefox 只需要在A处潜入一个iframe
对于IE使用form标签)

容易被忽视的角落 Flash XSS

ActionScript是一种非常强大和灵活的脚本,甚至可以使用它发起网络连接
禁用< embed> < object>等标签
限制Flash动态脚本的最重要的参数是“allowScriptAccess”推荐选择never 也很关键的是“allowNetworking”推荐设置none或internal
OWASP为Flash安全研究设立了一个wiki页面

JavaScript开发框架

Dojo
YUI
jQuery

XSS的防御

1.HttpOnly (解决cookie劫持攻击
2.输入检查
(检查输入是否包含特殊字符 敏感字符 XSS Filter
XSS Filter对语境的理解不完整)
3.输出检查

输出检查

安全的编码函数

针对HTML的编码方式是HtmlEncode
在PHP中 有htmlentities()和htmlspecialchars()两个函数可以满足安全要求
JavaScript的编码方式可以用JavascriptEncode
使用JavascriptEncode的变量输出一定要在引号内
除了数字 字母外的所有字符 都使用16进制“\xhh”的方式进行编码 如此代码可保证是安全的
可以在适当的情况下选择使用函数。需要注意的是,编码后的数据长度可能会发生改变,从而影响某种功能。在写代码时需要注意这个细节,以免产生不必要的bug。

XSS攻击主要发生在MVC架构中的View层。大部分的XSS漏洞可以在模版系统中解决。
XSS是很复杂的问题 需要“在正确的地方使用正确的编码方式”
XSS的防御需要区分情况对待

XSS的本质是一种“HTML”注入 用户数据被当成了HTML代码的一部分来执行,从而混淆了原本的语义,产生了新的语意
如果网站使用了MVC架构 那么XSS就发生在View层——在应用拼接变量到HTML页面时产生。所以在用户提交数据处进行输入检查的方案,其实并不是在真正发生攻击的地方做防御。
想根治XSS的问题,可以列出所有XSS可能发生的场景,再一一解决。

可能存在以下场景

     在HTML标签中输出
     在HTML属性中输出
     在< script >标签中输出
     在事件中输出
     在CSS中输出
     在地址中输出

处理富文本

有些时候 网站需要允许用户提交一些自定义的HTML代码 称之为“富文本”
在过滤富文本时 “事件”应该被严格禁止 因为“富文本”的展示需求里不应该包括“事件”这一动态效果。而一些危险的标签 比如< iframe >< script >< base >< form >等 也是应该严格禁止的。
在标签的选择上 应 该 使 用 白 名 单 , 避 免 使 用 黑 名 单 \color{red}{应该使用白名单,避免使用黑名单} 使使
“白名单原则”不仅仅应用于标签的选择 同样应用于属性与事件的选择
在PHP中 可以使用另外一个广受好评的开源项目:HTMLPurify

DOM Based XSS是一种比较特殊的XSS漏洞 前文提到的几种防御方法都不太适用 需要特别对待
从JavaScript输入到HTML页面 也相当于一次XSS输出的过程 需要分语境使用不同的编码函数

安全研究者Stefano Di Paola设立了一个DOM Based XSS的cheatsheet 有兴趣深入研究的可以参考Cheatsheet

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值