打开发现页面怎么有点熟悉呀,这不就是刚才做过的那道题吗qyq
这里就整理一下XSS注入的知识点吧,详细做题步骤可以看看上一篇文章,链接附上
1.【BUUCTF】BUU XSS COURSE 11及XSS知识点-优快云博客
web安全之XSS跨站脚本知识点
网站应用程序安全漏洞,代码注入的一种,允许将代码注入网页,其他用户观看网页时会受到影响
通常包含HTML和JS(用户端脚本语言)
通过利用网站开发时留下的漏洞,巧妙注入恶意旨令代码到网页,使用户加载并执行恶意制造的网页程序。
这些恶意的网页程序通常是Java script,Java,Vb Script,Active X,Flash或者普通的HTML
可能得到更高的权限,私密的网页内容,会话和Cookie等
按触发特征分类
反射型XSS
指恶意代码未被服务器储存,每次触发漏洞时,都将恶意代码通过GET/POST的方式提交,用户输入的内容被直接输出在HTML中,然后触发漏洞
注入点在标签外部
提交这样的URL
name=<script>alert('xss')</script>
效果:弹窗xss
就实施了一次XSS注入
查看网站源代码
在url中输入的script标签,直接嵌入了HTML中,被浏览器识别,执行,弹窗xss
注入点在标签内部
不需要在注入的时候插入标签
如果是script标签内部,直接插入JavaScript语句
比如有这样的代码
<html>
<body>
<script>
var name ='<?=$_GET['name']?>';
document.write('hello '+name);
</script>
</body>
</html>
这种情况下的XSS跟SQL注入很像
先闭合引号
写入代码
再将后面的引号注释掉
如果是在其他标签的属性字段内,可以采用先闭合引号,再插入可以执行JavaScript代码的属性进行XSS
name=';alert('xss');//
;用于结束上一个语句
查看HTML源代码
先用一个单引号闭合了前面的字符串,用分号结束该语句,后面插入了alert('xss')用于弹窗,用双斜杠注释掉了最后剩余的单引号
存储型XSS
与反射型XSS的基本思路相同,都是后端未对用户输入进行过滤所导致的漏洞
存储型XSS是将用户输入保存在数据库或者其他的服务器存储中,只要服务保存了XSS代码,便可造成持续性的影响
比如下面的PHP代码,将用户输入直接保存在文件中
<?php
$name = $_GET['name'] ?? '';
if($name != '')
file_put_contents('data.txt', $name);
$name=file_get_contents('data.txt');
echo "hello $name";
用户输入被保存起来,每次访问这个页面时,都读取之前输入过的name
name=<script>alert(%27xss%27)</script>
/*URL 编码
%20 为空格
%23 为# (注释符)
%27 为单引号
–+ 注释后面的语句*/
payload与最开始的无差异 但下次访问时无需输入name参数即可造成XSS
在实际的环境中,这种存储型XSS最常见于用户发的贴子,用户的的个人信息等页面
这种数据会被保存在服务器中,当其他用户访问到含有恶意代码的帖子或个人信息页面时,便受到XSS
DOM XSS(文档对象模型)
njexs、apache托管的静态文件
不需要PHP、JSP后端语言
区别于前两种,漏洞位置发生在前端而非后端
前端将用户输入直接写入到HTML中
比如下面的HTML文件
<!DOCTYPE html>
<html>
<body>
<script>
var url = new URL(window.location.href);
var name = url.searchParams.get("name");
//5、6行将name这个文件取出来
document.write('hello! '+name);
//将'hello! '+name直接写到HTML中
</script>
</body>
</html>
JavaScript具有操作DOM的功能,可以提取用户的输入,直接插入到DOM中,造成XSS
payload与反射/存储型XSS无异
name=<script>alert('xss'</script>
!!!只有document.write()函数才会执行script标签签内的代码,而通过修改DOM属性
inner HTML来插入HTML内容,是不会执行其中的script标签内代码。但是可以通过插入
<img src=x onerror='alert(1)'>
的方法来执行类似onerror属性中的JavaScript代码。
eg:
<!DOCTYPE html>
<html>
<body>
<p></p>
<script>
var url = new URL(window.location.href);
var name = url.searchParams.get("name");
var p = document.querySelectorAll("p")[0]
p. innerHTML = 'hellol'+name;
</script>
</body>
</html>
用来执行XSS的标签
1.基本上几乎所有的标签on事件来执行JavaScript代码,比如:
<h1\textcolor{red}{%20}onmousemove="alert(1)">hello</h1>//用户交互,需移动鼠标移动才执行
另一个比较常见的是img标签的onerror属性
<img src=x onerror="alert(1)">
还有
<iframe src="javascript:alert(1)"></iframe>//使用伪协议
<svg onload="alert(1)">
这些用于XSS的标签和属性,可以在
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet查找
2.HTML5特性的XSS
利用HTML5特性进行XSS可以参考,http://www.html5sec.org/
很多标签的on属性需要用户交互才能完成触发,比如
<input onfocus='alert(1)'>
需要输入框获得焦点后才能触发alert(1)
HTML5有一个属性
autofocus可以自动实现聚焦
就将需要交互的XSS变成了无需交互的XSS
<input onfocus='alert(1)' autofocus>
3.javascript伪协议
浏览器中常见的协议有http、https
有些a标签的href属性值为javascript:void(0)
"javascript:",就是javascript伪协议,它是由javascript引擎执行的
eg:
<a href="javascript:alert(1)">click here</a>
click here
点击之后,就alert(1)
iframe标签也可以使用JavaScript伪协议,实现自动触发,比如
<iframe src="javascript:alert(1)">
XSS过滤和绕过过滤
WAF层(web应用防火墙)
外部,在主机或网络硬件上
对HTTP请求进行过滤拦截
代码层
编写web应用过程中,直接实现或引用第三方库,对用户输入进行过滤
JavaScript语法非常灵活,对于普通的正则匹配,字符串比较,很难拦截XSS
1.富文本过滤绕过
如果过滤器本身存在缺陷,比如将黑名单内容替换为空,采用双写绕过
eg:
服务端代码
<?php
function filter($payload){
$data = str_replace("script","", $payload);//过滤掉了script,替换成了空格
return $data;
}
$name = filter($_GET['name']);
echo "hello $name";
输入name=<scriscriptpt>alert('xss')</scriscriptpt>
2.注入点在标签属性中
如果没有过滤"<"和">",可以直接引入新的标签
如果尖括号被过滤,可以插入新的事件属性
eg:onload,onmousemove等
而且标签的属性字段支持HTML编码,可以通过这个绕过过滤
eg:
<img src=x onerror="alert(1)">
alert(1)
这里onerror的内容就是对alert(1)进行HTML编码之后的结果,最后仍然可以成功触发弹窗。
3.注入点在script标签中
注入点被引号包裹,可以向绕过SQL注入,先闭合引号再用分号结束语句之后插入代码
如果引号被过滤,且一行存在两个注入点的情况下:
var url= 'http://xxxx/?name=<?=$name?>'+'<?=$address?>'
用反斜杠使得第一个引号被转义,从第二个引号插入代码
var url= 'http://xxxx/?name=\'+';alert(1);\\'
红色部分是name的值,蓝色部分是address的值
如果存在单词黑名单,比如不允许出现eval等字符,可以使用unicode编码(只能输入函数名)绕过
\u0065\u0076\u0061\u006c('alert(1)')
undefined
4.CSP过滤及其绕过
CSP(内容安全策略)
一个额外的安全层
用于检测并缓解某些特定类型的注入,包括XSS和数据注入等
CSP被设计成完全向后兼容
不支持CSP的浏览器会忽略相关策略,并正常运行,采用默认的同源策略
为了使CSP可用,需要配置HTTP头部配置Content-Security-Policy字段
除此之外还可以使用Meta标签来配置该策略
XSS防御绝非易事,CSP应运而生
CSP看作是为了防御XSS,额外添加的一些页面渲染,javascript执行的规则
策略文档https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy找到