条件竞争之对象临时中间状态的条件竞争

admin 2023年10月10日23:05:14评论8 views字数 3251阅读10分50秒阅读模式

前言

声明:这里是由零信任安全实验室组建的一个知识平台,平台有批量验证的脚本、工具以及一些漏洞的POC,后续还会分享网络安全资源(漏洞挖掘文章 工具 资讯以及SRC漏洞挖掘案例分享等等,资源多多,干货多多!
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者和本公众号无关。工具
来自网络,安全性自测。

      欢迎加入零信任攻防实验室的知识星球,星球免费!后续会抽奖送360定制周边礼品哈,敬请期待!平台有批量验证的脚本、工具以及一些漏洞的POC,和分享网络安全资源(漏洞挖掘文章 工具 资讯)  以及SRC漏洞挖掘的技巧分享等等,资源多多,干货多多!

条件竞争之对象临时中间状态的条件竞争

作者:zkaq-杳若




Portswigger练兵场之条件竞争

  1. Lab: Partial construction race conditions

实验前置必要知识点

某些框架尝试通过使用某种形式的请求锁定来防止意外的数据损坏。例如,PHP 的本机会话处理程序模块一次只处理每个会话的一个请求。

许多应用程序通过多个步骤创建对象,这可能会引入可利用对象的临时中间状态。

例如,注册新用户时,应用程序可能会在数据库中创建用户,并使用两个单独的 SQL 语句设置其 API 密钥。这留下了一个用户存在的door,但其 API 密钥未初始化。

框架通常允许您使用非标准语法传入数组和其他非字符串数据结构。例如,在 PHP 中:

  • param[]=foo相当于param = ['foo']

  • param[]=foo&param[]=bar相当于param = ['foo', 'bar']

  • param[]相当于param = []

如果注册了账户之后,抢先在SQL语句赋值之前发出身份验证

实验要求

  1. 本实验包含用户注册机制。争用条件使你能够绕过电子邮件验证,并使用不属于你的任意电子邮件地址进行注册。

  2. 要解决实验室问题,请利用此争用条件创建一个帐户,然后登录并删除用户carlos

⚡️渗透开始

  • 访问对应靶场界面

  1. https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction

  • 启动靶场

    1. 站点分析

这是SHOP类型的网站

条件竞争之对象临时中间状态的条件竞争

可以查看文章信息、购买、登录、注册等功能点,根据提示我们来到注册功能点处

条件竞争之对象临时中间状态的条件竞争

需要用户名、邮箱以及密码才可以注册,发现只能用推荐的邮箱注册

条件竞争之对象临时中间状态的条件竞争

尝试注册账户为1,发现注册成功

条件竞争之对象临时中间状态的条件竞争

再次注册1的账户发现无法注册

条件竞争之对象临时中间状态的条件竞争

尝试注册账户2,用同样的邮箱发现注册成功,说明同样的邮箱可以注册复用

条件竞争之对象临时中间状态的条件竞争

但是无法直接用账号密码进行登录,需要邮箱激活

条件竞争之对象临时中间状态的条件竞争

在不清楚邮箱的情况下陷入了困局

2. 寻找可疑功能点(查看Burp历史记录进行分析)

正常的流程为
前端注册 → 后端发送邮件并在数据库中预注册用户的账户/密码信息 → 用户激活邮箱 → 后端分配权限给用户 → 用户可以正常访问

注册发送数据包

条件竞争之对象临时中间状态的条件竞争

在此处条件竞争获取的账号也是没有权限的,毫无用处?

在翻阅的过程中发现了一处可疑的js

条件竞争之对象临时中间状态的条件竞争

  1. const createRegistrationForm = () => {

  2. const form = document.getElementById('user-registration');

  3. const usernameLabel = document.createElement('label');

  4. usernameLabel.textContent = 'Username';

  5. const usernameInput = document.createElement('input');

  6. usernameInput.required = true;

  7. usernameInput.type = 'text';

  8. usernameInput.name = 'username';

  9. const emailLabel = document.createElement('label');

  10. emailLabel.textContent = 'Email';

  11. const emailInput = document.createElement('input');

  12. emailInput.required = true;

  13. emailInput.type = 'email';

  14. emailInput.name = 'email';

  15. const passwordLabel = document.createElement('label');

  16. passwordLabel.textContent = 'Password';

  17. const passwordInput = document.createElement('input');

  18. passwordInput.required = true;

  19. passwordInput.type = 'password';

  20. passwordInput.name = 'password';

  21. const button = document.createElement('button');

  22. button.className = 'button';

  23. button.type = 'submit';

  24. button.textContent = 'Register';

  25. form.appendChild(usernameLabel);

  26. form.appendChild(usernameInput);

  27. form.appendChild(emailLabel);

  28. form.appendChild(emailInput);

  29. form.appendChild(passwordLabel);

  30. form.appendChild(passwordInput);

  31. form.appendChild(button);

  32. }

  33. const confirmEmail = () => {

  34. const container = document.getElementsByClassName('confirmation')[0];

  35. const parts = window.location.href.split("?");

  36. const query = parts.length == 2 ? parts[1] : "";

  37. const action = query.includes('token') ? query : "";

  38. const form = document.createElement('form');

  39. form.method = 'POST';

  40. form.action = '/confirm?' + action;

  41. const button = document.createElement('button');

  42. button.className = 'button';

  43. button.type = 'submit';

  44. button.textContent = 'Confirm';

  45. form.appendChild(button);

  46. container.appendChild(form);

  47. }

3. Js分析 | 对行为进行基准测试

json中命名大致了解

  • 函数createRegistrationForm通过操作DOM创建注册表单

  • 函数confirmEmail用于创建确认电子邮件功能。

在确认电子邮件功能中 访问的是POST请求的/confirm端点,拼接的参数是token

该创建的表单会获取token并确认提交

4./confirm端点分析 | 对行为进行基准测试

token为空被禁止

条件竞争之对象临时中间状态的条件竞争

token为1,证明验证了令牌为0不正确

条件竞争之对象临时中间状态的条件竞争

如果是刚注册的用户通常为空,可以发现被禁止了,尝试数组没被禁止

条件竞争之对象临时中间状态的条件竞争

5.完成实验 | 证明概念

当我注册账号之后,如果存在两句SQL语句,我可不可以抢先在应用程序赋值token之前给予账号空的token,这样就可以绕过用户注册的邮箱验证机制

构造创建用户的枚举,同时并发token为空验证的条件竞争机制成功获取了用户

条件竞争之对象临时中间状态的条件竞争

用户信息a4016:111111

条件竞争之对象临时中间状态的条件竞争

登录账号

条件竞争之对象临时中间状态的条件竞争

打开管理面板删除用户后完成实验

条件竞争之对象临时中间状态的条件竞争

条件竞争之对象临时中间状态的条件竞争


原文始发于微信公众号(零信任攻防实验室):条件竞争之对象临时中间状态的条件竞争

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月10日23:05:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   条件竞争之对象临时中间状态的条件竞争http://cn-sec.com/archives/2100636.html

发表评论

匿名网友 填写信息