从业者-非常规输入-异常处理不一致
# 实验室:异常输入的处理不一致
# 题目
此实验室未充分验证用户输入。你可以利用其 帐户注册过程中的逻辑缺陷 来访问管理功能。要解决实验室问题,请访问管理面板并删除carlos
用户。
提示
你可以使用实验室横幅中的链接 访问邮件服务器的电子邮件客户端。客户端将显示发送到@YOUR-EMAIL-ID.web-security-academy.net
中的所有消息和任意子域。你的唯一电子邮件 ID 将显示在电子邮件客户端中。
- name: 实验室-从业者
desc: 异常输入的处理不一致 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-inconsistent-handling-of-exceptional-input
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
根据题意,可得实验目标:
- 该实验室的 账户注册过程 中存在逻辑缺陷,能够访问站点管理功能。
- 利用逻辑缺陷,访问站点的用户管理面板,然后删除 carlos 用户。
点击 “Access the lab” 进入实验室。

点击 “Register” 转到注册页面。

注册需要输入邮箱,点击上方的 “Email client” 进入邮箱客户端。

记录我们的邮箱attacker@x.exploit-0aba001604d7e0d780a8a28f01a7003c.exploit-server.net
。

# 注册测试1
尝试注册 carlos 账户,程序提示该账户已存在,无法注册。

注册 test 用户,启用浏览器代理,点击 “Register” 提交注册表单。

服务端接收注册表单之后,会往邮箱中发送注册链接。

在邮箱客户端中找到邮件,点击注册链接。

点击之后,提示注册成功。

随后使用账号密码进行登录,一切正常。

# 信息1
注册过程中,产生了两个请求数据包。
第一个数据包,提交注册表单时发出,由于携带 token 所以该数据包无法复用。

第二个数据包,在邮箱中点击注册链接时发出,也携带了 token 所以无法复用数据包。

# 信息2
邮箱不能重复注册账户。

# 信息3(关键)
在注册页面,有这样一条信息:
邮箱@dontwannacry.com
代表内部员工。

# 信息4
网站的/admin
路径存在管理界面。

综合以上信息,我们拥有的邮箱为@exploit-server.net
,但只有邮箱为@dontwannacry.com
的账户才能访问管理界面。
所以现在要做的是:用邮箱 @exploit-server.net 接收注册链接,但最终的账户邮箱必须为 @dontwannacry.com 。
我一直绕啊绕,绕不出来,不争气的看了答案,知识点+1 。
# 注册测试2 - 成功
用一个很长很长的邮箱进行注册。
attacker@123456789012345678901234567890123456789012345678901234567890.abcdefgabcdefgabcdefgabcdefgabcdefgabcdefg.xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz.exploit-0af20094043dc0f1801dcff2014a0089.exploit-server.net

点击注册链接。

注册成功之后,登录账户。
咋一看,好像没啥毛病,一切正常。

用一个更长的邮箱进行注册,然后登录账户。
attacker@123456789012345678901234567890123456789012345678901234567890.abcdefgabcdefgabcdefgabcdefgabcdefgabcdefg.xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz.jkljkljkljkljkljkljkljkljkljkljkljkljkljkljkljkl.exploit-0af20094043dc0f1801dcff2014a0089.exploit-server.net
登录之后你会发现,展示的邮箱后面貌似少了一截?!
这是为什么?(又到了 C语言 时刻)

经过测试,异常邮箱的长度为 255 个字符,难道是存储上限?

在 C语言 的数据类型中,char 类型的存储长度一般为 1 字节,长度为0~255
。
如果你用的是 Windows 系统,则可以用快捷键 Win + R 并输入 calc ,打开计算器。

功能选择 “程序员” 。

1 个字节就是 8 个比特位,点击二进制 “BIN” 一栏,然后输入 8 个数字 1 ,在十进制 “DEC” 的地方可以看到数字 255 。

这里只是拿 char 类型举个例子,目标程序用的不一定是 char 类型。也可能是用了其他的字符串类型,但是将长度设置为了 255 导致后续内容丢失。
既然超过 255 字符的部分会被截断,那就好办了。
构建一个长度为 356 个字符的邮箱:
attacker@123456789012345678901234567890123456789012345678901234567890.abcdefgabcdefgabcdefgabcdefgabcdefgabcdefg.xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz.jkljkljkljkljkljkljkljkljkljkljkljkljkljkljkljkl.qweqweqweqwe.dontwannacry.com.exploit-0af20094043dc0f1801dcff2014a0089.exploit-0af20094043dc0f1801dcff2014a0089.exploit-server.net

假设该邮箱被截断,则我们的邮箱 .XXX.exploit-server.net 会被去除,剩下的 255 个字符刚好包含 @XXX.dontwannacry.com 的内部员工邮箱。

使用上述邮箱提交注册表单,在我们的邮箱中 点击注册链接。

注册成功之后,登录账户。
我们的邮箱字符真被截断了,剩下了内部员工的邮箱。

再次访问管理界面,访问成功。点击 carlos 账户的删除按钮。

删除成功,实验完成。

# 修复建议
身份验证绕过漏洞1 - 邮箱截断
- 在服务端限制邮箱的长度,超过长度的时候请用户重新输入(正常人谁用那么长的邮箱)。
A:马冬梅啊!
B:马...?