软件渗透
去年冬天,软件渗透一个做电商的软件渗透朋友给我打电话,声音都在抖。软件渗透他的软件渗透商城后台被人传了一个asp文件,叫“test.asp”,软件渗透里面就三行代码。软件渗透三行。软件渗透服务器权限就没了。软件渗透攻击者没急着删库,软件渗透先翻了一遍订单表,软件渗透把近两万条用户手机号和地址导走了,软件渗透然后留了个txt在桌面上:“数据不错,软件渗透下次注意。软件渗透” 这就是软件渗透渗透测试和真实攻击之间的区别。渗透测试是软件渗透你雇人打自己,打完给你报告;真实攻击是别人打你,打完给你账单。但很多人搞混了,以为装个扫描器跑一遍就是渗透。差得远。 我见过太多“渗透报告”长一个样:打开Burp Suite,挂上代理,扫一遍,发现几个中危漏洞,写个PDF交差。这种活儿我一天能做五份。真正的渗透得手动去摸。摸什么?摸业务逻辑,摸权限边界,摸那些扫描器看不懂的地方。 举个例子。某次我测一个后台系统,扫描器报了个“未授权访问”,点进去是个404。按模板写就是“误报,忽略”。但我多看了一眼URL参数,发现它带了个id=1001。把id改成1000,页面出来了——是另一个用户的订单详情。再改成999,又出来一个。这就是水平越权,扫描器根本测不出来,因为它不知道1000和1001之间是什么关系。 渗透的核心不是工具,是思路。工具只能告诉你“这里可能有问题”,但“这里到底能不能搞、怎么搞、搞了之后能干嘛”,得靠人。我习惯先画一张业务流程图,把用户从注册到下单到支付到退款整个链路走一遍,然后在每个节点问自己:这一步的权限校验在哪?如果我把这个参数改了呢?如果我把这个请求重放一百次呢? SQL注入现在不好找了,但逻辑漏洞遍地都是。比如密码重置,很多系统只校验了手机验证码,没校验这个手机号是不是属于当前用户。你输入自己的手机号收验证码,然后把提交请求里的手机号改成别人的——密码就重置成你的了。这种漏洞扫描器永远发现不了,因为它看起来“流程正常”。 还有一个事让我印象很深。某次测一个App,抓包发现登录接口返回了一个token,但token里没有签名。我把它base64解码,发现就是个JSON:{ "uid":123,"role":"user"}。把role改成"admin",重新base64编码,替换回去——后台管理界面直接开了。整个过程不到两分钟。开发觉得“token是加密的”,其实只是编码了一下。 渗透测试最怕的不是系统复杂,是开发觉得“没人会这么干”。没人会改id?没人会重放请求?没人会看JS里的注释?我每次渗透第一件事就是翻前端JS,经常能看到测试环境的API地址、数据库连接串、甚至硬编码的密钥。有个项目,我在main.js里翻到一个注释掉的接口,路径是/internal/debug/users,访问了一下,返回了全站用户列表,包括密码哈希。 说这些不是教人搞破坏。是想说,安全这事,靠堆设备没用。WAF能挡扫描器,挡不住一个会看业务逻辑的人。渗透测试的价值在于,用攻击者的眼睛看一遍系统,然后告诉开发:你这里逻辑写反了,那里权限忘了加,这个参数不该信。 最后说个实在的。如果你在写代码,记住三件事:所有输入都不可信,所有权限都要在后端校验,所有敏感操作都要二次确认。这三条做到,能挡掉八成问题。剩下的两成,找个靠谱的人帮你打一遍。别等有人在你桌面留txt的时候才想起来。