XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
危害: 存储型>反射型>DOM型
1.反射型XSS(get)
随便输入, 输入 ' " <> 特殊字符都可以原封不动得输出 可以发现没有任何过滤,
只是限制了输入字符的长度,F12修改一下即可 因为一般 前端中得输入框 会做一个长度得限制, 我们将他修改为20000
<script> alert("你好,我是一个警告框!") ;</script> // 弹窗得语法
查看后台代码,发现 后台代码并没有对你输入得东西 做任何修改 只是原封不动得输出了
总结: 随便输入,可以发现没有任何过滤,只是限制了输入字符的长度,F12修改一下即可,
后台不会存储数据, 刷新后 不会弹窗!
输入kobe 会生成链接 http://192.168.50.100/pikachu/vul/xss/xss_reflected_get.php?message=kobe&submit=submit#
2.反射型XSS(post)
admin 123456 登陆成功后 显示
输入 kobe 会以post方式提交请求 http://192.168.50.100/pikachu/vul/xss/xsspost/xss_reflected_post.php#
这种情况下 无法将恶意代码 发送到后端
提前写好 html页面 发送给用户 和用户点击 就可以获取cookie值
让用户去点击这个页面 获取cookie值
3.存储型XSS
提交留言后刷新 会一直存储在留言板上 后台有数据 这就是 和反射型xss一个区别
' " <> ? 6666666 输入特殊字符 发现没有过滤
查看前端代码
我们输入 <script> alert("xss") </script> 会出现一个弹窗
我们查看后台代码
判断message是否存在 并且 message不为空
进行了转义 防止sql注入
插数据库的时候 做了对应的转义 防止数据库的注入 把massage 插入到表中 存下来 存到后台
将存储得留言 都显示出来
4.DOM型XSS
DOM学习链接: https://www.w3school.com.cn/htmldom/index.asp
你可以理解为DOM为一个一个访问html的标准编程接口
输入1111
查看代码
有一段script的代码 他获取了id=text的值 输出了 通过字符串拼接方式
构造闭合方式
"<a href=' "+str+" '> what do you see?</a>";
"<a href=' ' > what do you see?</a>"
"<a href=' #' onclick="alert(111)"> ' what do you see?</a>"
#' onclick="alert(111)">
实际会出现<a href=' #' 闭合
剩下 >'what do you see? 显示到下方
点击 onclick="alert(111)"会出现弹窗 111
5.DOM型XSS-X
输入后显示
查看源代码,发现代码获取的是url的text 值
"<a href=' "+str+" '>就让往事都随风,都随风吧</a>"
"<a href=' ' > 就让往事都随风,都随风吧</a>"
"<a href=' #' onclick="alert(111)"> ' 就让往事都随风,都随风吧</a>"
#' onclick="alert(111)">
构造 #' onclick="alert(111)">
弹窗
6.XSS之盲打
输入 : <script>alert('xss')</script> 发现 也没有其他内容输出
根据提示 登录后台 : http://192.168.50.100/pikachu/vul/xss/xssblind/admin_login.php
7.XSS之过滤
XSS过滤:
几种XSS绕过的姿势:
1.直接f12修改前端的限制,例如长度。
2.大小写混合:<SCRIpt>ALErt(11)<SCRipt>
3.拼凑:<scr<script>ipt>alert(11)</sc<script>ript>
4.注释符:<scr<!--text-->ipt>alert(11)</sc<!--text-->ript>
5.编码的方式,
但是在使用时要注意是否会被输出点识别和执行,不然绕过了也没有用。
输入<script>' " 特殊字符 看输出结果 字符被过滤 查看前端源码 输入结果不一致
查看后端源码 发现对script进行了 过滤 替换为空格 但是只是对小写进行了替换
利用大小写混合输入的方式 进行绕过处理 <sCrIpt>alert(1111)</sCriPt> ,则会弹窗
8.xss之htmlspecialchars
学习链接: https://baijiahao.baidu.com/s?id=1621553793329253809&wfr=spider&for=pc
在php中,htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。
如果 string 包含无效的编码,则返回一个空的字符串,除非设置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 标志;
被转换的预定义的字符有:
& : 转换为&
" : 转换为"
' : 转换为成为 '
< : 转换为<
> : 转换为>
可用的引号类型:
ENT_COMPAT:默认。仅编码双引号。
ENT_QUOTES:编码双引号和单引号。
ENT_NOQUOTES:不编码任何引号。
输入特殊字符 查看源码, 我们看到 ' " < > 都进行了编码
所以使用单引号闭合:q' onclick='alert(111)'
XSS防范 总原则: 输入做过滤,输出做转义
过滤: 根据业务需求进行过滤,比如输入点要求输入手机号。则只允许输入手机号格式的数字
转义 : 输出到前端的数据根据输出点 进行转义 html做html转义 js页面做js转义
9.xss之href输出
查看源码,这次htmlspecialchars函数使用了ENT_QUOTES类,也加上了对单引号的转义,
但是在a标签的href属性里面,可以使用javascript协议来执行js
于是:javascript:alert(1111)
所以在 href 的输出最安全的防范措施: 因为herf里面可以写超链接 只允许http,https,其次在进行htmlspecialchars处理
10xss之js输出
输入1111,观察源码
只要闭合语句即可:</script>'<script>alert("111")</script>
这里讲输入动态的生成到了js中,形成xss
javascript特点:不会对tag和字符实体进行解释的, 就是不对实体编码 进行转义 ,所以需要进行js转义
这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
所以正确的防范 在JS的输出点应该使用对特殊字符进行转义