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蠕虫

 

posted @ 2021-03-15 23:35  hugeQAQ  阅读(247)  评论(0)    收藏  举报