一般有两种,其实有三种
1.反射型, 执行一次,
2.存储型, 保存到数据库中,每次查看都会触发
3.DOM型, 这里DOM型先不看,到时候再看
现在浏览器都有对XSS防护的作用,本地测试要注意!!!
漏洞介绍
跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。为了与层叠样式表( Cascading Style Sheets )的缩写CSS区分开,跨站脚本攻击通常简写为XSS
漏洞危害
只要是前端可以做的事情,他都可以做,主要你脑洞够大!!
挖掘的思路
出现在,发表文章的地方,评论,回复,搜索的地方都有可能,
留言,资料设置地方 , 后台登录地方 都有可能
没有过滤的参数,传入到输出函数中,都有可能成为XSS
以上多数可能都是存储型XSS
反射型XSS
非持久型,也叫反射型xss,通过GET和POST提交
反射型XSS是比较普遍的XSS,其危害程度通常被认为较小。但是某些反射型XSS造成的后果会很严重,如在输入框的name中输入<meta http-equiv="refresh"content="5"/>,服务器不加处理,将name的值直接送到浏览器,则浏览器会每5秒自动刷新一次。严重者会导致服务器崩溃。
常见的场景
将前端获取的内容,直接输出到浏览器页面
将前端获取的内容,直接输出到HTML标签
将前端获取的内容,直接输出到<script>标签
演示
//直接输出到浏览器页面
写一段代码,直接输出到屏幕上,没有任何过滤
<?php
$cmd = $_GET['cmd'];
echo $cmd;
?>
简单弹框
//直接输出到HTML标签内
<?php
$cmd = $_GET['cmd'];
?>
<input type="text" vlaue="<?php echo $cmd;?>">
这样的页面,首先我们要闭合当前的代码标签,这样我们才能执行自己的语句
"><script>alert(1)</script>
直接输出到<script>标签
<?php
$cmd = $_GET['cmd'];
?>
<script>
var xss = '<?php $cmd?>';
document.write(xss);
</script>
闭合前面的单引号' 用分号 ; 结束, 然后闭合</script> 结束后面的, 加载payload
出现 ';</script><script>alert(1)</script>
存储型
持久型,也叫存储型XSS。通常是因为服务器端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式,将数据呈现在浏览器上。则该XSS跨站脚本攻击将一直存在。若其他用户访问该页面,则恶意脚本就会被触发,用于盗取其他用户的私人信息
写到数据库中,每次刷新页面 都会触发
判断是存储型,还是,反射型, 要看有没有与数据库交互的地方
有xss平台,可以注册,用用
反射和存储的区别
反射型
输入---输出
存储型
输入----进入数据库-----取出数据库-------输出
DOM型xss
DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。
DOM型XSS其实是一种特殊类型的XSS,它是基于DOM文档对象模型的一种漏洞。
服务器中,经常使用,
DOM型,可能是存储型,也可能是存储型,
代码演示
<?php
$xss = $_GET['xss'];
?>
<input type="text" id="text" value="<?php echo $xss;?>">
<div id="id"></div>
<script type="text/javascript">
var text = document.getElementById("text");
var id = document.getElementById("id");
id.innerHTML = text.value;
</script>
输出在div中 把 text 获取的内容,放到id里面 id 是div 块里的
<img src=x οnerrοr=alert(/xss/)>
DOM型数据流向
DOM--XSS的数据流向是 : URL--> 浏览器
DOM型常见的属性
修复方案
对所有输入中的script、iframe等字样进行严格的检查
验证数据的类型及其格式、长度、范围和内容
客户端做数据的验证与过滤,关键的过滤步骤在服务端进行
检查输出的数据