哎哟喂!接口没上锁,OAuth绕过去,这漏洞也太“刑”了吧?
大家好啊,我是老周,一个在网络安全圈子里摸爬滚打了七八年的老油条,今天咱们不聊那些高深莫测的二进制漏洞,也不扯那些让人头大的内核提权,咱们就聊聊一个在Web安全里特别常见,但又特别容易被忽视的“小问题”——接口未鉴权和OAuth绕过。
说实话,每次看到这类漏洞,我心里都跟猫抓似的,又急又气,你说开发者辛辛苦苦码了半年代码,结果因为给接口“忘穿裤子”了,直接被脱个精光,这谁能顶得住啊?真的,我跟你讲,这玩意儿比直接SQL注入还让人血压升高。
先聊聊那个让人无语的“接口未鉴权”
什么叫接口未鉴权?兄弟,你听我给你掰扯掰扯,这就好比你开了一家饭店,后厨的门本来是给厨师走的,结果你图省事儿,把门锁给拆了,任何人从后门溜进来都能直接进厨房翻冰箱、看菜单底稿,甚至把醋瓶子倒了。
放到程序里就是,有些接口,比如那些 /api/admin/getUserInfo、/api/config/list 之类的,本该需要管理员登录才能访问,结果呢?好家伙,开发小哥哥可能当时赶着下班约会,把这茬儿忘了个一干二净,连个最基本的 token 校验都没加。你就说离谱不离谱?
我知道有人要杠了:“老周,你说得轻巧,这种低级错误现在哪还有啊?”嘿,你别不信,我上个季度做渗透测试,碰到一个金融类App的后台,有个导出用户数据的接口,连个参数加密都没有,直接裸奔在公网上,我拿Burp Suite一抓包,改了改请求头,绕过前端那些花里胡哨的校验,直接把这个接口的URL粘到浏览器里,好家伙,几百万条用户姓名、手机号、身份证号,哗啦啦全下来了,当时我后背就一阵发凉,这要是被坏人盯上,那不得把裤衩子都赔光咯?
再说说那个更气人的“OAuth绕过”
OAuth这玩意儿,本身是为了方便,比如你用微信登录某个网站,本来是个好机制,但很多开发者在实现的时候,就把它给玩坏了。
最经典的案例就是什么呢?拆东墙补西墙”的校验逻辑。 他只在登录的时候验证了OAuth返回的 code,但拿到用户信息后,就完全信任了前端传过来的 userid。
我给你画个图你就明白了,正常流程是:你点微信登录 -> 微信给你一个code -> 你网站后端拿code去换用户信息 -> 成功。
可漏洞在于呢?有些网站后端偷懒,它拿code换了信息后,把那个 openid 或者 userid 直接当成一个参数,让你前端传回来了,兄弟,这就等于什么呢?等于你进了小区门,保安看了你一眼,给你发了个门禁卡,结果你上去跟保安说:“兄弟,我这张卡是借我邻居老王的,你让我刷一下呗?”保安居然特么的放你进去了!
至于绕过的姿势,更是五花八门。 什么把 redirect_uri 改成攻击者的地址,什么直接抓包篡改 response_type,什么利用状态码 state 参数缺失搞CSRF,尤其是那个 state 参数,好多开发者不当回事儿,觉得可有可无,哎呀妈呀,这个一丢,攻击者直接可以诱导你点一个链接,然后在你不知情的情况下,用你的账号给那个网站绑定一个攻击者的邮箱,下次人家直接登录,你的号就没了! 你气不气?你防不胜防!
老周我为什么对这俩漏洞这么敏感?
因为这种漏洞根本不需要高深的攻击技巧,只需要耐心和细心,它不像缓冲区溢出,需要你懂汇编、懂Linux内核;也不像机器学习对抗样本,需要你懂算法。
这种漏洞,卡的就是人的惰性和思维盲区,你只要多问一句:“这个接口真的安全吗?”、“这个回调真的带上了state吗?” 就能少交很多学费。
给那些还在疯狂写代码的朋友们掏心窝子说几句:
我知道大家赶工期、抢上线压力大,但是尼玛的,你接第三方登录的时候,务必校验 state 参数,这是防CSRF的铁律;你写接口的时候,务必在服务端做好鉴权,别信前端传什么ID就是什么ID,你得去Session或者Token里拿当前用户的身份。
真的,别把安全测试当仇人。 我们测出漏洞来,是救了你,不是害了你,要是我没测出来,被坏人利用了,那你不仅仅是删库跑路的问题了,那是要面临《刑法》里“侵犯公民个人信息罪”的铁拳的!那可不是闹着玩的兄弟,那是真刑啊!
好了,今天唠叨了这么多,就是想让大家把这根弦绷紧点,网络安全无小事,尤其是这接口未鉴权和OAuth绕过,这俩就是一对难兄难弟,专治各种粗心大意。
如果你也是个对网络安全感兴趣的初学者,或者想转行做渗透测试、代码审计的老铁,欢迎加我QQ:3382689,咱们可以一起交流学习,少走点弯路,但记住了,学技术是为了保护,不是为了搞破坏,咱们要做白帽子,不做黑产狗,拿捏住分寸,才能走得更远!

(文章底部) 学习网络安全,实战渗透技巧,欢迎添加QQ:3382689,备注“安全学习”,一起交流进步!

