这该死的漏洞,怎么就让我给撞上了?
哎,兄弟们,我今晚是真的睡不着了,非得爬起来把这糟心事写下来不可,你说这“任意读写鉴权绕过”,听着是不是特高大上?呵,一开始我也以为是哪个大佬研究出的新姿势呢!结果,是我自己给自己挖了个坑。 这事儿,还得从今天下午的渗透测试说起。
我接手了一个客户的内网系统,老古董了,用的是那种十几年前的框架,我本来想着,摸鱼划水测几个常规的SQL注入、XSS就完事儿了,结果,你猜怎么着?我在那个文件下载的接口里,习惯性地把参数 file=report_2023.pdf 改成了 file=../../../../etc/passwd,嘿!你说神不神?整个文件内容直接给我吐出来了! 我当时那个激动劲儿,差点没把咖啡打翻在键盘上!
重点来了,这仅仅是个开始,我接着想,能不能搞个大的?既然能读,那能不能写?于是我就盯上了那个上传头像的功能,我寻思着,这上传肯定得验证MIME类型吧?得检查文件头吧?我用Burp Suite抓了个包,那叫一个小心翼翼,结果你猜我发现了啥? 服务器压根儿就没校验!它只判断了文件名后缀!我直接把我写好的一个JSP一句话木马,改了个名,改成了 avatar.png.jsp,传上去,解析成功!那一刻,我感觉我简直是天选之子,直接拿下服务器不是梦啊!
可是,兄弟们,生活不是打游戏啊!任意读写鉴权绕过的精髓,在于“绕过”这俩字儿,而我,恰恰耍了小聪明,忘了正主儿——鉴权! 我上传木马的时候是没被拦,可当我拿着菜刀去连那个Webshell的时候,傻了,服务器直接给我弹了个401,提示“未授权访问”,我靠!这尼玛也太憋屈了吧!我文件都能读了,你告诉我连不上执行不了命令?
我那时候心里那叫一个万马奔腾啊!关键是我突然意识到,这个“任意读”可能只是接口设计缺陷,而这个“任意写”对应的目录,跟执行脚本的目录是隔离的。 换句话说,我就是个在银行金库里能隔着玻璃看清钱,但就是进不去的贼!那心情,别提了,恨不得把键盘砸了。
后来我冷静下来,仔仔细细把整个请求流程分析了一遍,原来,问题出在Cookie上,那个系统有个隐藏字段叫 IsAdmin,默认是空值。如果我把这个值从空改成 true,并发起文件读取请求,服务器就会认为我是管理员,从而直接放行所有关于文件流的操作。 我艹,我当时怎么没想到呢?这尼玛就叫典型的“前端信任”漏洞,鉴权逻辑全他妈写在前端JS里了,后端压根没拦截!
你造吗,这时候我盯着屏幕上那个 true 字符,心里头五味杂陈。 就像你费尽心思撬开了第一道铁门,然后发现里面还有一道指纹锁,结果你发现管理员直接把手指头放在锁边上等你按一样,这“任意读写鉴权绕过”的坑,不在于技术有多高深,而在于你是否肯低头看看那藏在犄角旮旯里的逻辑漏洞。 我敢打赌,很多开发哥这辈子都想不到,自己写的那个 if(currentUser.isAdmin == true) 居然能被人从浏览器调试器里给改了!
不过话说回来,这事儿也给我长了个记性,以后测这种接口,千万别光盯着参数,那会话里的隐藏字段、加密的Cookie结构、甚至JWT里有没有改算法的机会,都得挨个儿捋一遍。 万一哪天撞上个没做签名验证的,那就真的一马平川了!嘿,要是你也对这类“任意读写”或者别的什么渗透测试技巧感兴趣,想学点真本事,不踩我这种坑,可以加我QQ:55068888,咱们扯扯皮,聊聊安全圈那点事儿。
行了,不说了,我得去把这个漏洞报告补完,不然明天甲方爸爸又该骂我效率低了,唉,这辈子,能跟“任意读写鉴权绕过”这几个字和平共处,我也算“悟了”!
本文关联阅读:


