** 哎呦喂!别让XSSI偷走你的数据!一文读懂跨站包含攻击与防御
开始前,我先拍个桌子!各位搞前端、搞运维、甚至只是写点个人小站的朋友们,都给我听好了! 今天咱不聊那些虚无缥缈的APT攻击,也不谈什么高大上的红蓝对抗,咱就聊聊一个特别容易被忽视,但一旦被利用,能让你底裤都输光的玩意儿—— XSSI(跨站脚本包含)。
说真的,我刚接触这个漏洞的时候,心里就俩字:离谱!它不像SQL注入那样“哐哐”报错,也不像XSS那样还得骗你点链接,XSSI的利用,简直就像是你把自己家的钥匙,光明正大地放在门口脚垫下面,然后还发朋友圈告诉所有人“我家钥匙在脚垫下”,哎,你说气不气人?
这玩意儿到底是个啥?让我用“人话”给你唠唠。
你想啊,咱们平时用浏览器上网,是不是经常需要从一个网站(比如A站)跳到另一个网站(比如B站)去拿点数据?这本来挺正常的。浏览器这货有个“傻白甜”的特性——它分不清你这次请求到底是要“处理JSON数据”,还是要“执行JavaScript代码”。
这时候,XSSI的“骚操作”就来了!攻击者(就是那个坏家伙)会在自己的恶意网站上,直接用<script>标签去加载你网站上的一个接口地址,比如说,你网站的接口返回的是一段JSON数据,里面有个用户邮箱,正常程序会去解析这个JSON,但攻击者的网站可不跟你讲武德,它把你这段JSON当成了JavaScript代码来执行!
哎,这时候问题就来了——JSON本身不是代码,它执行不了啊! 如果你这接口设计得有点儿“艺术感”,比如返回的是var user = {"name":"张三","email":"zhangsan@xx.com"},那这就不一样了!这玩意儿长得就跟JavaScript代码一模一样!攻击者的网站一加载,就能直接读取到这个user变量里的数据!你的隐私信息,就这么顺顺利利、大摇大摆地被人家拿走了!
你说气不气?我隔着屏幕都能听到你骂娘了!
更可恨的是,这漏洞利用起来极其丝滑,完全不需要你做什么额外操作,攻击者只需要把恶意链接发给你,你只要一点开,访问了他那破网站,你的浏览器就会在后台默默地把你家A站的隐私数据“送”给人家了,你这边还在刷着抖音乐呵呢,那边你的订单信息、手机号,甚至是一部分业务逻辑,早就打包送走了!
咱们得冷静分析一下,这漏洞为啥这么“阴损”?
我觉得,最核心的锅,得让老旧的CORS(跨域资源共享)策略来背一半,很多兄弟搞开发,为了图省事,或者不懂,把接口的CORS设置成Access-Control-Allow-Origin: *,也就是允许所有域名访问,这简直是把你家大门的锁给拆了呀!虽然XSSI和CORS不是一回事,但这种宽松的跨域策略,简直就是在给XSSI递刀子!
还有一半锅,得让粗心的开发者来背,很多老项目,接口直接返回JSONP格式(就是那种带callback参数的回调函数),结果后来不维护了,又不改,这就好比你搬了新家,但旧房子的钥匙还挂在门上,小偷一推门就进来了。
行了行了,别光顾着生气了,咱们得想想怎么防!
第一招: 如果你用JSON,千万别把敏感数据直接放在<script>可以执行的范围内,最简单粗暴的办法,就是在JSON数据前面加个)]}'\n 前缀,或者用while(1);,这样,就算攻击者强撸,那也只是一堆语法错误,执行不了你的数据!这就好比给你的隐私文件加了个密码锁,他拿到手也是一堆乱码。
第二招: 检查一下你的CORS配置。*别傻乎乎地全用``通配符了!** 只允许你的真实业务域名,这样就算别人想跨站读,浏览器也会毫不留情地拦下他。
第三招: 接口请求带个不可预测的Token(令牌),你别光靠Cookie验证啊!特别是那种类似<script>标签发起的GET请求,通常是不会带自定义Header的,如果你的接口强制要求请求头必须有自定义的X-Requested-With: XMLHttpRequest,那很多跨站包含的脚本就死了这条心了。
唉,写到这里,我心里真是五味杂陈。 你说搞安全容易吗?天天跟这些“土鳖”漏洞斗智斗勇,还得防着AI搞出些更离谱的变种。但话说回来,咱们不怕出漏洞,就怕不知道自己有漏洞! 今天看完这篇文章,赶紧去看看自己的接口,瞅瞅有没有这种“裸奔”的JSON数据!可长点心吧!
对了,如果你看完这些还是觉得有点懵,或者想系统地学学怎么把这些“坑”填平,欢迎加我QQ:123456789(网络安全学习交流),咱们群里唠,我手把手教你!群里不仅有XSSI,还有SQLi、XSS各种“花活”等你来拆招!

别犹豫了,为了你的服务器不被脱库,赶紧的!

