如何手动测漏洞

如何手动测漏洞

别急着上扫描器。何手手动测漏洞,动测本质是漏洞猜开发者怎么犯错。我见过太多人拿Nessus扫一遍,何手输出报告就完事,动测结果连个SQL注入都测不出来——因为扫描器只会打已知的漏洞靶子,而真正的何手洞,藏在逻辑缝隙里。动测

先从最基础的漏洞开始:输入点就是攻击面。别只看登录框,何手搜索框、动测排序参数、漏洞甚至HTTP头里的何手Referer字段,都能成为入口。动测我上周测一个内部系统,漏洞发现它的导出功能把文件名直接拼进了路径,连urlencode都没做。你猜怎么着?一个`../../etc/passwd`就穿出去了。这不是什么高深技巧,就是盯着每个参数问一句:这玩意儿会被拼到哪去?

测漏洞得学会“反着看”。开发者以为用户只会传数字,你就传字符串;以为前端限制了长度,你就用Burp抓包改包。有个经典案例:某电商站点的优惠券接口,前端JS校验了金额不能超过100元,但后端压根没查。我手动把`amount=99`改成`amount=9999`,直接下单成功。这叫什么?信任了不该信任的输入。手动测的关键,就是找到这种信任边界,然后一脚踹过去。

再说说逻辑漏洞。这类洞扫描器永远发现不了,因为需要你理解业务。比如密码重置流程,正常是填邮箱→收链接→改密码。你试试在第一步抓包,把邮箱参数改成别人的,看系统会不会把重置链接发到你自己手里。我测过一家金融App,它的验证码校验居然放在前端JS里——响应包里直接带着明文验证码。这种洞,只要你会看流量,五分钟就能挖出来。

手动测还讲究个“脏”技巧。别老想着构造复杂payload,先试最简单的。`' OR 1=1--`可能被WAF拦了,但换成`%27%20OR%201=1--`呢?或者用`/*!50000OR*/`这种MySQL版本注释绕过。我见过有人为了绕过过滤,把payload写成`1'&&(SELECT 1 FROM(SELECT COUNT(*),CONCAT((SELECT table_name FROM information_schema.tables LIMIT 1),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)--`,结果被拦得死死的。其实管理员只过滤了空格,你换成`%0a`换行符就通了。简单路径往往比复杂路径更有效,因为开发者防的是教科书攻击,不是歪招。

有个容易忽略的点:测漏洞要测“状态”。比如文件上传功能,你上传一个PHP文件被拦了,但改成`.php5`、`.phtml`、`.phar`呢?或者先传一个`.jpg`,再用条件竞争把内容改掉?我干过最野的一次,是把shell藏在图片的EXIF信息里,然后通过另一个文件包含漏洞去执行它。这种组合拳,扫描器连影子都摸不着。

最后提醒一句:手动测漏洞不是乱撞。你得有个假设——开发者在这里犯了什么错?是没过滤、没校验、还是信任了不该信任的东西?带着假设去试,比盲目fuzz高效十倍。我每次测试前,都会把应用的业务逻辑画个流程图,标出每个数据处理节点,然后逐个问:如果这里断掉,会发生什么?

漏洞就在那儿,藏不了。你需要的不是工具,是那双看出破绽的眼睛。多测,多想,别怕出错——手动测本身就是个试错游戏,试得越多,你的直觉就越准。