xss漏洞
举个例子说明,假设server端有这么一个rest接口(我们用flask实现):
@app.route('/test')
def hello_world():
name = request.args.get('name')
return 'hello, %s' % (name)
它直接返回前端输入的名字。那我们就可以构造如下url造成xss攻击:
http://localhost:8013/test?name=%3Cscript%3Ealert(document.domain);%3C/script%3E
name为:
<script>alert(document.domain);</script>
界面会弹出domain域的对话框。
上述攻击是后端将前端的输入未做任何处理,直接返回到web界面上造成,称之为反射型xss。
还有一种存储型xss,后端对前端输入未做处理,存到数据库中。后续每个用户来访问页面,数据库的数据都会加载到界面上,从而形成xss攻击。
这两种xss,客观上形成了一种动态页面或非法链接,造成浏览器解释非法脚本。
xss的影响很大,试想,上述链接如果是银行系统的一个url,且存在反射型xss漏洞,黑客将该链接以钓鱼邮件的方式发送给某人,某人一看url是合法的,点进去,可能直接就把自己的登录cookie交出去了。黑客拿到cookie,基本上相当于免密登录那人的银行系统。
参考该文。
漏洞排查
要分前后端排查。
前端,如果使用的是vue框架,要关注v-html、v-bind:action、v-bind:href等指令,因这些指令可能指向由用户控制的变量,黑客就可以构造如下输入造成xss攻击:
javascript:alert(document.domain);
<img src=x onerror='alert(/xss/)'>
<a href="javascript:alert(document.domain);">
<script>alert(/xss/)</script>;
<table background="javascript:alert('XSS')">
后台,可以使用Filter,对部分rest请求的响应做xss防护,主要是对一些特殊字符的处理,比如:
<、>、src、<script>、eval、javascript、onload、alert
从原理上讲,后台的XssFilter的防护不是一定要的,还是要看前端怎么使用后台返回的数据,如果前端把后台返回的数据直接显示为html、链接或界面响应事件,才可能存在xss风险。