简介摘自百度百科的一段话:
用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。攻击者通常会用十六进制(或其他编码方式)将链接编码,以免用户怀疑它的合法性。网站在接收到包含恶意代码的请求之后会产成一个包含恶意代码的页面,而这个页面看起来就像是那个网站应当生成的合法页面一样。许多流行的留言本和论坛程序允许用户发表包含HTML和javascript的帖子。假设用户甲发表了一篇包含恶意脚本的帖子,那么用户乙在浏览这篇帖子时,恶意脚本就会执行,盗取用户乙的session信息。
前言
Q:为什么写这篇文章?
A:在自己的开源项目sra-admin中,GitHub网友LuckyT0mat0在这项目中发现了文件上传接口的xss漏洞
XSS攻击原理
- 攻击者通过上传恶意攻击脚本,比如a.html,在这里举例我这边项目的情况
<script>
// 攻击脚本就不具体写了,简单描述下
// 先获取cookie,然后将cookie发送到攻击者的服务器
</script>
- 然后攻击者可以在自己的钓鱼网站里让你点击这个链接,比如你浏览到攻击者的钓鱼网站ABC,里面有个吸引你点击的按钮,你点击了,结果是跳转到的是sra-admin项目的 sra-admin/a.html这个页面,然后你是登录了sra-admin这个系统的,结果就是你访问量这个恶意脚本后你的登录信息就发送到攻击者那边了。
如何防范
- 在很多开源安全框架中,比如shiro、SaToken这些都会有xss攻击防护的,所以一般的接口不会出现xss漏洞。
// 如:SaToken xss防护配置
// ---------- 设置一些安全响应头 ----------
SaHolder.getResponse()
// 服务器名称
.setServer("sa-server")
// 是否可以在iframe显示视图: DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以
.setHeader("X-Frame-Options", "SAMEORIGIN")
// 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面
.setHeader("X-XSS-Protection", "1; mode=block")
// 禁用浏览器内容嗅探
.setHeader("X-Content-Type-Options", "nosniff")
;
- 但是我这边是一个上传文件接口,所以上传的文件必定能够访问,所以a.html就可以利用这个漏洞进行攻击。如何防范?很简单,就在文件上传接口的那里做个文件格式校验即可。
// 如
String[] ts = {"jpg","png","zip"};
if (Arrays.asList(ts).contains(file.fileType)) {
//todo 文件安全,可以保存
} else {
//todo 不支持文件格式
}
尾声
出现此类问题还是自己经验不足导致的,所以写一些敏感接口时一定要做校验,尽量缩小值的范围