G胖de幸运抽奖

题目

听说抽箱子很好玩

考验的是人的运气

你是那位幸运儿吗

HINT

欧皇和非酋,只是一念之差

解题报告

进入题目网站,会发现一个抽奖的网站。

功能很简单,点击“我要抽”就可以抽奖,抽奖会扣除100美元,抽奖结束之后会加上中奖的游戏道具的金钱。

“续命回档“是可以帮助你重置钱包,回到10000美元。

赚够66666美元,即钱包拥有超过66666美元之后,就可以取得这个题目的Flag。

这道题的关键是审查前端代码。

你会发现 app.js 中,关于抽奖的代码(Slot),业务逻辑顺序是:

  1. 先访问 wallet.php 获取当前用户的钱包的金额;
  2. 获取钱包金额之后,前端判断是否足够金额扣除抽奖费用。如果不足,则提示要去“续命”;
  3. 如果足够金额,则访问 gacha.php 抽奖
  4. 成功返回抽奖数据之后,等待3秒,展示最终的抽奖结果。

所以,关键的部分是加粗的部分。

是否符合抽奖的资格的判断,是前端做的,实际上后台 gacha.php 并没有检查。

依题意可知,抽箱子是不可能赚钱的,所以肯定是亏的,不存在直接赢钱的情况。

考点是整数溢出,整数溢出会导致本来是很小的数,继续减小,会突然变成很大的数字。

而这道题目就是模拟了无符号整数的溢出漏洞,搭配未检查钱包是否足够金额的问题。

因此,正确的做法就是不断向 gacha.php 发包,输钱输到负数。

采用 BurpSuite 的 Intruder 可以实现这样的攻击。

填入被攻击的网站的主机名和端口。

填入 gacha.php 的请求报文。

构造一万次的攻击。

攻击成功!第2089次之后成功溢出。

溢出成功之后,直接去网页买Flag就可以咯。

results matching ""

    No results matching ""