|
凌晨两点十七分,越权访问手机屏幕亮了。越权访问一条推送通知躺在锁屏界面上:“您有一条新的越权访问私信。”我划开一看,越权访问发信人是越权访问我自己。 准确地说,越权访问发信人的越权访问ID、头像、越权访问昵称,越权访问全部和我一模一样。越权访问点进主页,越权访问连我三年前发的越权访问那张模糊的猫照片都被复制了过去。唯一不同的越权访问是,这个“我”正在给几十个陌生人发消息,越权访问内容是越权访问一串链接。 我盯着屏幕愣了几秒,后背开始发凉。这不是盗号——我的密码没改,登录设备里也没有陌生记录。后来我才搞明白,对方根本没碰我的账号,而是利用了平台的一个接口漏洞:只要构造特定的请求参数,就能以任意用户的身份发送私信。他们不需要你的密码,不需要你的验证码,只需要你的用户ID。而用户ID这东西,在任何一个公开页面的URL里都躺着。 这就是越权访问。安全圈里管它叫IDOR,Insecure Direct Object Reference,不安全的直接对象引用。名字听着绕口,原理简单得可笑——你把本该由系统判断的权限问题,交给了用户输入来决定。 打个比方。你去酒店前台说“我要进301房间”,前台二话不说把钥匙给你了。正常流程应该是:前台先查你是不是301的住客,再看你的身份证,确认无误才给钥匙。但很多系统省掉了“查”这一步,你说要301的钥匙,它就真给你了。更有甚者,你说要302的,它也给你。 我后来在一个小电商平台上又碰到过类似的事。那家店卖手工皮具,我下单后收到一条短信,附了一个查询订单的链接。链接末尾是订单号:?order_id=8817。我手贱把8817改成8818,页面刷新,跳出来另一个人的订单——姓名、电话、收货地址、买了什么,全在上面。再改成8819,又是一单。我连着改了十几个,没有一次被拦截。 这个漏洞的可怕之处在于,它不需要多高的技术门槛。一个刚学会看URL参数的人就能利用它。而它造成的后果,往往比SQL注入、XSS这些听起来更唬人的漏洞更直接——因为泄露的是实打实的用户数据。 有人可能会想,这年头大厂应该都修了吧。确实,主流平台基本都做了权限校验。但问题出在那些你意想不到的地方:一个地方政务网站的水电费查询接口、一个校园教务系统的成绩单页面、一个医院的预约挂号后台。这些系统往往外包给小型开发团队,验收时只测功能通不通,没人去测“把参数改一改会怎样”。 我认识一个做渗透测试的朋友,他跟我说过一个案例。某三甲医院的挂号系统,把患者ID直接拼在URL里。他随手改了一个数字,屏幕上弹出一份完整的电子病历——姓名、身份证号、诊断结果、用药记录。他没继续翻,直接截了图发给了院方。院方回复说“我们尽快修复”。三个月后他再测,还是老样子。 越权访问的本质,是开发者在写代码时默认“用户会按规矩来”。但攻击者从来不按规矩来。你让他传自己的ID,他偏要传别人的;你让他看自己的订单,他偏要翻别人的收货地址。系统如果不主动问一句“你凭什么看这个”,那它就等于把门敞着。 修起来其实不复杂。每次请求进来,先拿当前登录用户的身份去数据库里查一遍:这条记录属不属于他?不属于就拒绝。多写几行代码的事。但就是这几行代码,很多团队在赶工期的时候选择跳过。然后漏洞就留在那儿了,像一扇没锁的侧门,安安静静地等着有人推开。 我后来把那个冒充我的账号举报了。平台封了它,但没给我任何解释。我的用户ID还是那串数字,躺在每一个我发过的帖子链接里。谁想用它来干点什么,我拦不住。 |