web安全之XSS
一、什么是XSS
XSS全称叫 Cross Site Scripting 跨站脚本攻击,顾名思义,其攻击方式就是在用户浏览的网页中想办法插入恶意脚本(大多数都是JS脚本,所以JS能做的,理论上XSS攻击者都能做到),在用户不知情的情况下,执行恶意脚本,获取用户的隐私信息或者其他操作,XSS攻击由用户手动发起,最终直接受害者也是用户。
二、 XSS分类
1、反射型XSS
反射型XSS是最容易出现的一种,又称非持久性XSS,假设某个站点的请求为http://xxxx.com/xss.php?username=xxx&xx=xx ,前端通过get方式向后端传一个username参数,后端经过一系列业务逻辑后,又将这个username参数返回给前端页面,如果后端没有对这个username参数的输入输出做合法性校验,那么XSS攻击者可以通过构造请求http://xxxx.com/xss.php?username=<script>xss攻击代码</script>&xx=xx,最终 <script>xss攻击代码</script>会被当成JS脚本执行。最终的后果,就取决于这段JS代码能干什么了。(例如:盗取cookie、恶意跳转等)
2、存储型XSS
存储型XSS又称持久性XSS,是一种危害性非常高的XSS,它的原理其实跟反射型类似,只不过反射型XSS用户一次请求完后,XSS脚本只是从前端传到后端又传回前端,最终之运行了一次,而存储型则是将XSS脚本存储进数据库,之后用户的所有请求,XSS脚本都会被执行。假设某个站点页面有个input标签<input type="text" name="xxx" value="$value"/>,name属性是从后端动态返回的,后端获取这个字段的值是从数据库查出来的,而数据库这个字段的值是在其他请求通过post传入的,假如后端同样没有对该参数的输入输出做校验,那么XSS攻击者就在该变量对应的输入框写入<script>xss攻击代码</script>,此时标签变为<input type="text" name="xxx" value="<script>xss攻击代码</script>"/>,幸好name是标签的属性,这段JS不会被执行,不过如果XSS攻击者输入“/><script>xss攻击代码</script>,此时标签变为<input type="text" name="xxx" value="“/><script>xss攻击代码</script>"/> ,input标签被闭合,后面的JS脚本被执行。并且用户每进一次这个页面,这个脚本就会被执行一次。危害同上。
3、DOM XSS
同样顾名思义,该类型的XSS发生在DOM上,主要是前端在操作DOM树的时候发生。
<script>
var temp = document.URL;
var index = document.URL.indexOf("name") + 4;
var par = temp.substring(index);
document.write(decodeURI(par))
</script>
这段代码的意思是获取URL中的name参数输出,如果请求http://xxxx.com/xss.php?username=xxx&xx=xx,XSS攻击者输入http://xxxx.com/xss.php?username=<script>xss攻击代码</script>&xx=xx,xss代码将会被执行
三、检测XSS
1、人工
2、工具
四、XSS漏洞修复
1、入参和出参严格格式校验
这是最有效的方法,对于每个接口的入参和出参都做特殊字符转义和过滤,PHP可用htmlspecialchars 函数将特殊字符转义,上述几种情况,脚本最终被转义成字符串,而不会被浏览器当成JS脚本执行。其他语言也有对于的函数。
如果能明确知道参数的格式,用正则去匹配参数我觉得是最好的。
2、设置httponly
httponly主要是来防止cookie劫持,就是不让攻击者用脚本拿到用户的cookie。当服务器下发的cookie带上httponly属性后,JS脚本就不能获取到该cookie了。
五、高级危害
1、盗用用户cookie
2、修改网页内容
3、网站挂马
4、利用网站重定向
5、XSS蠕虫

浙公网安备 33010602011771号