前言
之前有一段时间在玩Burp的靶场,感觉还不错,总体排名也冲到了top30
靶场地址 → https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-encryption-oracle
通过加密预言机绕过身份验证
靶场信息介绍
此实验室包含一个逻辑缺陷,该缺陷会向用户公开加密预言机。要解决实验室问题,请利用此缺陷访问管理面板并删除 Carlos。
您可以使用以下凭据登录到自己的帐户:wiener:peter
登录的时候发现了记住账号的选项stay logged in
查看对应的数据包后确定cookie的值CLaBQxXK7jjl8irpHHxq6jc0HJqzyyGlh0up7tP7WZc=
尝试乱输内容后提交评论发现被重定向到了该页面,内容无效
查看对应的burp
数据包
设置了notification=GzBnDr%2bC1mgTchLCnPA41Kn4UfsXHRfxbjETSuOKa1k%3d
同理,在修改邮箱处进行了尝试 回显:Invalid email address: bbb
语句会被加密并存入Cookie
字段的notification
参数中
追踪一下重定向
推测Cookie
字段的notification
参数值会被解密并回显到响应中,修改notification
尝试
发现和我们推测的差不多,于是我们相当于找到了一个加密点一个解密点,然后我们看到Cookie
字段的stay-logged-in
参数值与这个也有点类似,尝试将stay-logged-in
的值放入到notification
Cookie
应该采用username:timestamp
格式 .将时间戳1672988774905
复制到剪贴板。
可以控制台输入Date.now()
来获取对应的时间戳
惊奇地发现是可以成功在解密点解出的,说明解密点是通用的,那么加密点就也是通用的,然后通过观察发现stay-logged-in
的明文形式是由用户名与时间戳以冒号分隔开的格式构成的,于是我们将wiener换成administrator:1672988774905
以后加密,并尝试解密
我们看到是可以成功构造的,但是stay-logged-in
明文形式不应该包含前面那一串”Invalid email address: “
,所以我们要想办法把它去掉
通过两次加密信息的对比,发现前面23位是固定的,说明是对称加密,就是原文有多长,密文就会有多长,所以我们尝试直接删除明文中相应数量的字节,将密文发到decoder
,在十六进制下删除23字节(因为那串无用前缀有23字节长)Invalid email address:
得到新的字符串
删除以后再按照原格式编码回去,在解密点看看能不能解密出来+6NTr6pZvYqxhsW9q50Y/3z8/xlxIqRu6+23OmgpOFjgK3r5JMDg9FdRPSUz
发现会有报错,说密码密文分块必须是16的倍数,于是我们需要填充一些字节让其达到16的倍数,所以我们填充9个无用字符,然后因为是无用的,填充完以后再删除32字节就可以正常解密了
在预期 cookie
值的开头添加 9个字符xxxxxxxxxadministrator:1672988774905
新的密文发送到解码器,然后 URL 和 Base64 对其进行解码。这一次,从数据开头删除32个字节
成功地构造出不仅没有无用前缀而且还能成功解密的密文,于是我们将其替换到stay-logged-in
参数值,并替换成新的session
值,发现我们就可以进入administrator
用户页面了
将值赋给stay-logged-in
修改成/admin
端点,成功突破限制登录管理员面板
根据试验要求访问/admin/delete?username=carlos
删除carlos
用户
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
免费领取安全学习资料包!
渗透工具
技术文档、书籍
面试题
帮助你在面试中脱颖而出
视频
基础到进阶
环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等
应急响应笔记
学习路线