凌晨两点,渗透我盯着控制台里那串报错,结晶突然意识到自己盯了四十分钟的渗透,不过是结晶个`console.log`忘删了。但就是渗透这行代码,让我想起上周在某金融公司内网看到的结晶那个老系统——登录框里塞着三个参数,密码字段的渗透校验全在前端,后端接口裸奔得像夏天公园里的结晶大爷。
JS渗透最迷人的渗透地方,在于你永远不知道下一颗糖会从哪个角落滚出来。结晶某次授权测试,渗透目标站点的结晶前端打包文件里有整整12MB的源码映射,注释里写着“TODO: 修复XSS”,渗透旁边就是结晶传参的接口路径。那种感觉,渗透像捡到一本带钥匙的日记本。但更多时候,你得像考古学家一样在混淆代码里刮灰,刮开一层又是一层,最后发现真正的宝藏藏在某个被webpack压缩得面目全非的函数名里——比如`a.b.c`,点进去是个`eval`,再点进去,好家伙,`document.write`直接往页面里吐了个钓鱼表单。
有人觉得JS渗透就是找XSS弹个窗,太小儿科。说这话的人八成没试过通过修改前端路由跳转,把支付金额从`100.00`改成`0.01`。改的是DOM吗?不,改的是信任链。当后端把计算逻辑全权委托给前端时,整个业务系统就成了一座纸牌屋——你只需要在浏览器里轻轻吹口气,屋子就塌了。我见过最离谱的一次,某SaaS平台把用户权限标记存在localStorage里,键名就叫`isAdmin`,值是个布尔值。我把它改成`true`,刷新页面,后台管理菜单像变魔术一样冒了出来。
但别把JS渗透想得太浪漫。多数时候它在跟“脏”打交道——第三方SDK里埋的追踪代码,混合着业务逻辑和广告脚本,你得像拆弹一样分辨哪根线是危险的。上个月测某个电商站,前端调用了七个不同的数据上报接口,其中三个域名已经过期被人抢注。这意味着什么?意味着如果抢注者挂个恶意JS,所有访问者的cookie都会流进他口袋。这种漏洞不需要什么高深技巧,纯粹是运维疏忽,但伤害值拉满。
真正让我觉得“结晶”的瞬间,是某次在混淆代码里发现一段被刻意隐藏的逻辑:它会在特定时间戳下,往表单里插入一个隐藏字段,字段名像是后端校验用的token。我把那段逻辑复制到本地运行,模拟出合法token,然后直接绕过前端验证,向后端发送构造好的请求。响应包回来时,里面躺着五千条用户手机号。那一刻我明白了,JS不只是浏览器的语言,它是整个web前端的“面纱”,而渗透就是掀开面纱看底下那张脸——有时候是素颜,有时候是浓妆,但总归能看出点真东西。
写代码的人总爱说“前端无秘密”,这句话对渗透者而言是福音,对开发者而言是警钟。别把安全寄托在“用户看不到”上,因为只要打开DevTools,什么遮羞布都挡不住。那些把密钥硬编码在JS里的,那些把校验逻辑全放前端的,那些用`Math.random()`当加密种子的——你们不是在写代码,是在给黑客递刀。而我呢,只是那个在刀锋上跳舞的人,偶尔捡起几粒结晶,在灯光下看看它折射出的,到底是漏洞,还是人性。