|
去年冬天,设置漏洞我帮一个做电商的设置漏洞朋友看他的后台系统。登录框干干净净,设置漏洞密码框也没毛病。设置漏洞我随手在用户名里敲了个 ' or 设置漏洞'1'='1,回车。设置漏洞页面跳转,设置漏洞直接进了管理员面板。设置漏洞他愣了两秒,设置漏洞说了句“我靠”。设置漏洞这不是设置漏洞什么高深攻击,就是设置漏洞最基础的SQL注入。漏洞不在代码写得多烂,设置漏洞而在他压根没想过有人会往输入框里填这种东西。设置漏洞 设置漏洞这件事,设置漏洞很多时候不是技术问题,是心态问题。开发者脑子里有一套“正常用户”的画像:会老老实实填手机号,会按格式输密码,不会在姓名栏里写一串带分号的鬼东西。这套画像一旦固化,代码就只防君子不防小人。而互联网上最不缺的就是小人——或者说,最不缺的是好奇心旺盛、手又闲的人。 我见过一个更离谱的。某企业内部OA系统,重置密码的功能只验证了用户名,没验证任何身份凭证。也就是说,我知道你工号,就能把你密码改成我想要的,然后大摇大摆登进去。这个漏洞藏了三年,直到有个离职员工心情不好,顺手把前领导的密码改成了“fuckyou123”。安全团队才发现。你看,漏洞有时候不是被黑客挖出来的,是被情绪引爆的。 设置漏洞的核心逻辑其实很朴素:系统默认输入是善意的,而攻击者恰恰利用这个默认。 你在前端用JavaScript校验了邮箱格式,后端就不再检查。攻击者绕过前端直接发请求,脏数据就灌进去了。你给用户分配了普通权限,但删除文件的操作只判断了“是否登录”,没判断“是否是该文件的创建者”。那任何登录用户都能删别人的东西。这些都不是什么零日漏洞,是设计时少想了一步。 我自己的习惯是,每次写涉及用户输入的功能,先问三个问题。这个输入如果是一串SQL会怎样?如果是一段HTML会怎样?如果是一个超长字符串会怎样?这三个问题能挡掉八成低级漏洞。剩下的两成,靠的是别偷懒。别把权限校验写在前端,别把敏感操作放在GET请求里,别用自增ID当订单号——不然竞争对手写个脚本就能算出你一天卖了多少单。 有人觉得安全是安全团队的事。真不是。安全团队的职责是兜底和审计,但第一道防线永远是写代码的人。你写登录功能的时候多想一步,后面就少一个半夜被叫起来修漏洞的运维。我认识一个独立开发者,他的做法很土但很有效:每上线一个新功能,自己先当十分钟坏人。用Burp Suite随便改改参数,用浏览器控制台删删隐藏字段,看看系统会不会露出奇怪的表情。大多数漏洞,根本不需要什么高级工具,只需要你愿意弯下腰看一眼。 回到开头那个电商后台。我后来帮他加了参数化查询,把输入框里的单引号转义了。他问我,这样就行了吗?我说,对付普通脚本小子够了。但如果你哪天做大了,被人盯上,该请专业渗透测试还是得请。安全没有一劳永逸,只有不断修补。设置漏洞的人,和堵漏洞的人,本质上是在打一场永远不会结束的乒乓球。球速越来越快,但规则没变:谁先预判了对方的预判,谁就赢一局。 最后说个真事。某开源CMS有个漏洞,允许上传任意文件。修复方式是在上传目录里放了一个 .htaccess 文件,禁止执行PHP。结果下一个版本更新,打包时把这个隐藏文件漏掉了。漏洞复活。你看,设置漏洞的不只是代码,还有流程。人一疏忽,墙就塌了。 |