限制溢出争用条件
lab
实验室:限制超限竞争条件 |网络安全学院 (portswigger.net)
solve
预测潜在的碰撞
- 登录并购买最便宜的商品,确保使用提供的折扣代码,以便您可以研究购买流程。
- 考虑到购物车机制,特别是决定您可以订购什么的限制,值得尝试绕过。
- 在 Burp 中,从代理历史记录中,确定使您能够与购物车交互的所有端点。例如,请求将商品添加到购物车,并且请求应用折扣代码。
POST /cart
`POST /cart/coupon` - 尝试确定这些终结点上存在的任何限制。例如,请注意,如果您多次尝试应用折扣代码,您将收到响应。
Coupon already applied
- 确保您的购物车中有商品,然后将请求发送到 Burp Repeater。
GET /cart
在 Repeater 中,尝试使用和不使用会话 cookie 发送请求。确认如果没有会话 cookie,您只能访问空购物车。由此,您可以推断出:
GET /cart
- 购物车的状态存储在会话中的服务器端。
- 购物车上的任何操作都以您的会话 ID 或关联的用户 ID 为键。
这表明存在碰撞的可能性。
- 请注意,在首次应用折扣代码和更新数据库以反映您已经执行此操作之间可能存在竞争窗口。
对行为进行基准测试
- 确保当前没有应用于您的购物车的折扣代码。
- 向 Repeater 发送应用折扣代码 () 的请求 20 次。提示:您可以使用热键快速执行此操作。
POST /cart/coupon
`Ctrl/Cmd + R` - 在 Repeater 中,将所有 20 个选项卡添加到一个新组中。有关如何执行此操作的详细信息,请参阅创建新的选项卡组
- 使用单独的连接按顺序发送请求组,以减少干扰的机会。有关操作方法的详细信息,请参阅按顺序发送请求。
- 请注意,第一个响应确认已成功应用折扣,但其余响应始终拒绝代码,并显示已应用相同的优惠券消息。
探查线索
- 从购物车中删除折扣代码。
- 在 Repeater 中,再次发送请求组,但这次是并行发送的,一次有效地多次应用折扣代码。有关如何执行此操作的详细信息,请参阅并行发送请求。
- 研究响应并观察多个请求收到一个响应,指示代码已成功应用。如果没有,请从购物车中删除代码并重复攻击。
- 在浏览器中,刷新您的购物车并确认 20% 的折扣已多次应用,从而导致订单便宜得多。
证明概念
- 从购物车中删除应用的代码和任意商品,然后将皮夹克添加到购物车中。
- 并行重新发送请求组。
POST /cart/coupon
刷新购物车并检查订单总额:
- 如果订单总额仍高于您剩余的商店信用额度,请删除折扣代码并重复攻击。
- 如果订单总额少于您剩余的商店信用额度,请购买夹克以解决实验室问题。
通过争用条件绕过速率限制
lab
实验室:通过争用条件绕过速率限制 |网络安全学院 (portswigger.net)
solve
- 通过故意为您自己的帐户提交不正确的密码来尝试登录功能。
- 请注意,如果您输入错误密码的次数超过三次,系统会暂时阻止您再次尝试使用同一帐户登录。
- 尝试使用其他任意用户名登录,并观察您看到的正常消息。这表示速率限制是按用户名而不是按会话强制执行的。
Invalid username or password
- 推断每个用户名的失败尝试次数必须存储在服务器端。
考虑到以下两者之间可能存在竞争窗口:
- 当您提交登录尝试时。
- 当网站增加与特定用户名关联的失败登录尝试次数的计数器时。
对行为进行基准测试
- 从代理历史记录中,找到包含您自己帐户的登录尝试失败的请求。
POST /login
- 将此请求发送到 Burp Repeater 20 次。提示:您可以使用热键快速执行此操作。
Ctrl/Cmd + R
- 在 Repeater 中,将所有 20 个选项卡添加到一个新组中。有关如何执行此操作的详细信息,请参阅创建新的选项卡组
- 使用单独的连接按顺序发送请求组,以减少干扰的机会。有关操作方法的详细信息,请参阅按顺序发送请求。
- 请注意,在两次登录尝试失败后,您将按预期暂时锁定。
探查线索
- 再次发送请求组,但这次是并行发送的。有关如何执行此操作的详细信息,请参阅并行发送请求
- 研究反应。请注意,虽然您已经触发了账号锁定,但有三个以上的请求收到了正常响应。
Invalid username and password
- 推断,如果您足够快,您可以在触发帐户锁定之前提交三次以上的登录尝试。
证明概念
- 仍在 Repeater 中,突出显示请求中参数的值。
password
`POST /login` - 右键单击并选择 Extensions > Turbo Intruder > Send to turbo intruder。
- 请注意,在 Turbo Intruder 的请求编辑器中,参数的值会自动标记为带有占位符的有效负载位置。
password
`%s` - 将参数更改为 。
username
`carlos` - 从下拉菜单中,选择模板。
examples/race-single-packet-attack.py
在 Python 编辑器中,编辑模板,以便攻击使用每个候选密码将请求排队一次。为简单起见,您可以复制以下示例:
def queueRequests(target, wordlists): # as the target supports HTTP/2, use engine=Engine.BURP2 and concurrentConnections=1 for a single-packet attack engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=1, engine=Engine.BURP2 ) # assign the list of candidate passwords from your clipboard passwords = wordlists.clipboard # queue a login request using each password from the wordlist # the 'gate' argument withholds the final part of each request until engine.openGate() is invoked for password in passwords: engine.queue(target.req, password, gate='1') # once every request has been queued # invoke engine.openGate() to send all requests in the given gate simultaneously engine.openGate('1') def handleResponse(req, interesting): table.add(req)
- 请注意,我们通过引用 从剪贴板分配密码列表。将候选密码列表复制到剪贴板。
wordlists.clipboard
- 发起攻击。
研究反应。
- 如果您没有成功登录,请等待帐户锁定重置,然后重复攻击。您可能希望从列表中删除已知不正确的任何密码。
- 如果您收到 302 响应,请注意此登录似乎成功。记下“有效负载”列中的相应密码。
- 等待帐户锁定重置,然后使用标识的密码登录。
carlos
- 访问管理面板并删除用户以解决实验室问题。
carlos
评论0
暂时没有评论