|
“钻取漏洞”这个词听起来像黑客术语,钻取漏洞其实它每天都在发生,钻取漏洞只是钻取漏洞大多数人没注意到。上个月我帮朋友排查一个后台系统,钻取漏洞登录框输入 ' OR 1=1 --,钻取漏洞页面直接跳进了管理员面板。钻取漏洞开发人员把用户输入直接拼进了 SQL 查询,钻取漏洞连最基本的钻取漏洞转义都没做。这不是钻取漏洞什么高深攻击,属于钻取漏洞里最粗糙的钻取漏洞一种——利用系统对输入数据的盲目信任,一层层往下挖,钻取漏洞直到拿到不该拿的钻取漏洞东西。 钻取漏洞的钻取漏洞核心逻辑不复杂:系统在设计时假设用户会按规矩操作,但攻击者偏不。钻取漏洞比如一个电商网站的钻取漏洞商品详情页,URL 里带着 ?id=123,正常用户看到的是商品 123。攻击者把 123 改成 123 AND 1=1,页面正常返回;改成 123 AND 1=2,页面报错或空白。两次对比,数据库类型、表结构、字段名就能一点点猜出来。这个过程像用螺丝刀慢慢撬开一个没上锁的抽屉,每撬一下,里面的东西就多露出来一点。 我见过更隐蔽的钻取。某次渗透测试中,一个 API 接口返回用户信息,参数是 userId=1001。尝试改成 userId=1002,返回了另一个用户的手机号和邮箱。没有报错,没有验证,直接越权。开发人员觉得“用户不会去改这个数字”,可攻击者恰恰就改。这种漏洞不需要多强的技术,只需要耐心和一点好奇心。钻取的本质是试探边界——系统以为边界在 A 点,攻击者发现边界其实在 B 点,中间那段空白就是漏洞。 为什么这类问题反复出现?我观察到一个现象:很多开发者在写代码时,脑子里想的是“正常流程”。用户点按钮,提交表单,服务器处理,返回结果。他们很少去想“如果用户不点按钮,直接构造请求会怎样”。这种思维盲区跟经验无关,跟习惯有关。一个写了五年 CRUD 的程序员,可能从来没亲手试过在输入框里敲一个单引号。安全测试里有个词叫“威胁建模”,听起来很正式,说白了就是问自己一句:如果有人故意乱来,我的系统会怎样? 钻取漏洞的破坏力取决于挖到多深。浅层的只是泄露一条数据,深层的能直接拿到服务器权限。我印象最深的一个案例:某内部管理系统有个文件下载功能,URL 参数是 file=report.pdf。攻击者改成 file=../../../../etc/passwd,直接读到了系统用户列表。再配合其他漏洞,最终拿到了 root。整个链条的起点,就是那个没做路径校验的下载参数。一个看似无害的功能,因为少写了几行过滤代码,变成了进入内网的跳板。 修复钻取漏洞没有银弹。参数化查询能挡住 SQL 注入,白名单校验能挡住路径穿越,权限检查能挡住越权访问。但关键在于,这些措施必须覆盖每一个入口——表单、URL、HTTP 头、Cookie、文件上传。漏掉任何一个,攻击者就能从那里钻进去。我见过一个系统,所有输入都做了过滤,唯独忘了 X-Forwarded-For 头,结果攻击者通过伪造 IP 绕过了频率限制,暴力破解了管理员密码。钻取漏洞不怕你防得严,就怕你防得不全。 最后说个真实场景。某次代码审计,我发现一个查询接口的 orderBy 参数直接拼进了 SQL。开发人员说“这个参数只传字段名,用户改不了”。我当场用 Burp Suite 拦截请求,把 orderBy=id 改成 orderBy=id,(select 1 from (select sleep(5))a),服务器响应延迟了五秒。时间盲注成立。他盯着屏幕愣了几秒,说“还能这样?”——对,还能这样。钻取漏洞从来不挑系统大小,只挑开发者的疏忽。 |