举个例子说明,假设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为:
界面会弹出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);
;
- 1
- 2
- 3
- 4
- 5
后台,可以使用Filter,对部分rest请求的响应做xss防护,主要是对一些特殊字符的处理,比如:
<、>、src、