buuctf
打开靶机就是源码

审计代码

有三个路由
- /geneSign:获取 param 参数,结合预设的 action scan 来调用 getSign 函数来生成签名。
- /Delta:从 cookie 里获取 action 和 sign,再获取 param 参数,结合 ip 构造一个 Task 类的对象,再以 json 返回其 Exec 方法的执行结果。
- /:首页,获取源码
getSign函数
def getSign(action, param):
return hashlib.md5(secert_key + param + action).hexdigest()
将secert_key,param和action拼在一起md5
waf函数
def waf(param):
check=param.strip().lower()
if check.startswith("gopher") or check.startswith("file"):
return True
else:
return False
过滤了gopher和file开头的
Task类
class Task:
def __init__(self, action, param, sign, ip):
self.action = action
self.param = param
self.sign = sign
self.sandbox = md5(ip)
if(not os.path.exists(self.sandbox)): #SandBox For Remote_Addr
os.mkdir(self.sandbox)
def Exec(self):
result = {}
result['code'] = 500
if (self.checkSign()):
if "scan" in self.action:
tmpfile = open("./%s/result.txt" % self.sandbox, 'w')
resp = scan(self.param)
if (resp == "Connection Timeout"):
result['data'] = resp
else:
print resp
tmpfile.write(resp)
tmpfile.close()
result['code'] = 200
if "read" in self.action:
f = open("./%s/result.txt" % self.sandbox, 'r')
result['code'] = 200
result['data'] = f.read()
if result['code'] == 500:
result['data'] = "Action Error"
else:
result['code'] = 500
result['msg'] = "Sign Error"
return result
def checkSign(self):
if (getSign(self.action, self.param) == self.sign):
return True
else:
return False
Exec方法
看action里有没有scan,有就调用scan读取内容写道沙盒下的result.txt文件
再看有没有read,有就读出里面的内容,返回。
复现
payload1
http://3d842101-0a54-41c1-a467-eb21560e76fa.node5.buuoj.cn/geneSign?param=flag.txtread
返回哈希值
payload2


915

被折叠的 条评论
为什么被折叠?



