接口fuzz
接口fuzz,接口说白了就是接口拿一堆乱七八糟的数据往接口上砸,看它会不会崩。接口崩了,接口说明有漏洞;没崩,接口不代表安全,接口只是接口你砸的姿势不对。
我见过最典型的接口案例,某电商平台的接口订单查询接口,开发加了个参数校验,接口长度限制32位。接口fuzz工具随机生成了一串33位的接口字符串,接口直接返回了500。接口日志里赫然写着:String index out of range: 33。接口就这么个低级错误,接口攻击者只需要把参数改成负数,或者超长字符串,就能让整个订单服务瘫痪。你说这算漏洞吗?严格来说不算,但线上服务挂了,损失算谁的?
真正的fuzz不是乱砸,得讲究策略。你得先摸清接口的脾性——它吃什么格式,JSON还是XML?参数是数字还是字符串?有没有签名校验?这些摸清楚了,再决定怎么砸。我习惯先把正常请求抓下来,用代理工具改参数,一点点加边界值。比如有个参数是价格,正常是99.00,你先试0.01,再试999999999.99,然后试负数,试字符串"abc"。很多开发压根没想过价格会是负数,结果优惠券叠加逻辑直接计算出负数金额,钱反打到用户账户里。
有个工具叫Burp Suite,里面那Intruder模块简直是fuzz神器。但很多人用错了——只设置一个payload位置,盯着响应码看。真正有意思的fuzz要同时改多个参数,观察参数间的关联性。比如登录接口,用户名和密码都加特殊字符,看能不能绕过SQL注入过滤。再比如分页接口,page和size都改成极大值,看会不会把整个数据库拖出来。我见过最骚的操作,有人对文件上传接口fuzz,把文件名改成../../../../etc/passwd,结果服务器真把/etc/passwd内容返回了。
做fuzz最烦的是什么?是接口有WAF(Web应用防火墙)。你砸到第17次,WAF直接把你IP封了。这时候得换思路——用分布式节点,或者慢速fuzz,每次请求间隔几秒,模拟正常用户操作。更高级的做法是观察WAF规则,它拦截的是特征字符串还是行为模式。有些WAF只检查URL和Body,对Header里的内容视而不见。那你就把payload塞进自定义Header里,照样能触发漏洞。
说句实在话,fuzz这活儿干久了,你会对代码产生一种不信任感。看任何接口都会想:这里如果传个空数组会怎样?传个嵌套JSON会怎样?传个超长unicode会怎样?这种思维方式其实是好事,逼着你站在攻击者角度审视自己的代码。有一次我自己写的接口,fuzz工具跑出个异常,发现是正则表达式没处理特殊字符,导致ReDoS(正则表达式拒绝服务攻击)。那心情,既尴尬又庆幸——还好是自己人先发现的。
最后提醒一句,fuzz不是万能的。它擅长找输入校验类漏洞,但对业务逻辑漏洞基本无能为力。比如积分兑换接口,fuzz半天也发现不了"先扣积分再发券"和"先发券再扣积分"的竞态条件问题。所以别迷信工具,该做代码审计还得做。工具是放大镜,不是眼睛。