WEB

[TG:HACK 2020] Shop

初始时给了100$,然后在商店中售有Flag,为1337$,可以向银行借钱,但最多只能借200$

尝试借钱或还钱使其溢出或者为负,发现进行了限制:

经过多次尝试,发现当购买商品时修改sum为负且ID为不存在便会触发逻辑漏洞增加钱数:

之后购买Flag即可:

5

[SuSecCTF 2020] web0

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function sha1(s) {
return crypto.createHash("sha1")
.update(s)
.digest("hex");
}
app.post("/flag", (req, res) => {
const {first, second} = req.body;
const salt = "pepper";
console.log(first.length);
if (!first || !second || first.length !== second.length) {
res.send("bad input");
return;
}
if (first !== second && sha1(salt + first) === sha1(salt + second)) {
res.send("flag"); // have some flag
return;
}

res.send("access denied");
});

js特性:

1
2
3
4
5
[0] == [0]为false,因为两数组地址不同

[0] == 0为true,[0]会先转为原始值,即'0' == 0

{} == 0会报错,因为在浏览器的控制台中这样写的话,{}被当作空代码块,而不是对象,最后执行实际上是 == 0,如果写成({} == 0)则为false

审计得到,POST传参,firstsecond的值不能相同,二者加上salt后经过sha1加密处理后要相等,然后根据js特性,[0] == 0,构造payload:

1
2
3
first[]=0&second=0

first[]=0&second[]=0