第3章 跨站脚本攻击(XSS)
3.1 XSS简介
- Cross Site Script,跨站脚本攻击,简称XSS。
- XSS攻击,通常是指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在客用户浏览网页时,控制用户浏览器的一种攻击。
- XSS分类
- 反射型XSS
- 存储型XSS
- DOM Based XSS
3.2 XSS攻击进阶
- XSS Payload
- JavaScript脚本
- 最简单的:窃取Cookie的XSS Payload
- Cookie的“HttpOnly”标识可以防止“Cookie劫持”
- 强大的XSS Payload
- 构造GET与POST请求
- 删除博客:JacvaScript代码
- 提交表单:JavaScript发出POST请求
- HTML代码构造表单
- XMLHttpRequest发送POST请求
- 浏览器的扩展和插件
- CSS History Hack
- 获取用户的真实IP地址
- Javascript本身没有此能力。借助第三方软件来完成
- 如调用Java Applet的接口获取客户端的本地IP地址。
- 构造GET与POST请求
- XSS攻击平台
- Attack API
- BeEF
- XSS-Proxy
- 终极武器:XSS Worm
- Samy Worm
- 一般来说,用户之间发生交互行为的页面,如果存在存储型XSS,则比较容易发起XSS Worm攻击。
- 百度空间蠕虫
- Samy Worm
- 调试JavaScript
- 调试JavaScript,需要有很好的JavaScript工地,调试JavaScript是必不可少的技能。
- Firebug
- IE 8 Developer Tools
- Fiddler
- HttpWatch
- XSS构造技巧
- 利用字符编码
- 绕过长度限制
- 利用事件(Event)缩短所需要的字节数
- 最好的办法是把XSS Payload写到别处,再通过简短的代码加载这段XSS Payload
- loacation.hash
- 利用注释符绕过长度限制
- 使用
<base>
标签 - window.name的妙用
- 变废为宝:Mission Impossible
- Apache Expect Header XSS
- Anehta的回旋镖
- 容易被忽视的角落:Flash XSS
- 在Flash中是可以嵌入ActionScript脚本的
- 真的高枕无忧吗:JavaScript框架
3.3XSS的防御
- HttpOnly
- 输入检查
- 输出检查
- 安全的编码函数
- 只需一种编码吗
- 正确地防御XSS
- XSS的本质还是一种“HTML”注入,用户的数据被当成了HTML代码一部分来执行,从而混淆了原来的语义,产生了新的语义。
- 想要根治XSS问题,可以列出所有XSS可能发生的场景,再一一解决。
- 下面用变量“$var”表示用户数据,它将被填充入HTML代码中。可能存在以下场景:
- 在HTML标签中输出
- 在HTML属性中输出
- 在
<script>
标签中输出 - 在CSS中输出
- 在地址中输出
- 处理富文本
- HTML
- CSS
- 防御DOM Based XSS
- 换个角度看XSS的风险
- 前面谈到的所有XSS攻击,都是从漏洞形成的原理上看的。下面从业务风险的角度来看。
- 一般来说,存储型XSS的风险会高于反射型XSS
- 从攻击过程来说
- 反射型XSS,一般要求攻击者诱使用户点击一个包含XSS代码的URL链接。
- 存储型XSS,则只需要让用户查看一个正常的URL链接。
- 从风险的角度来看
- 用户之间有互动的页面,是可能发起XSS Worm攻击的地方。
- 根据不同页面的PageView高低,也可以分析出哪些页面受XSS攻击后的影响会更大。
- 从攻击过程来说
3.4 小结
理论上,XSS漏洞虽然复杂,但却是可以彻底解决的。
在设计XSS防御方案时,深入理解XSS攻击的原理,针对不同的场景使用不同的方法。