isSafeAscii = lambda s : not re.search(r'[^\x20-\x7F]',s) isSafeHeader = lambda s : isSafeAscii(s) isSafePath = lambda s : s[0] == '/' and isSafeAscii(s) and ' ' not in s badHeaderNames = ['encoding','type','charset'] unsafeKeywords = ["flag"]
def checkHostname(name): name = str(name) port = '80' if(':' in name): sp = name.split(':') name = sp[0] port = sp[1]
if( ( re.search(r'^[a-z0-9][a-z0-9\-\.]+$',name) or re.search(r'^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$',name) ) and 0 < int(port) < 0x10000 ): return name,int(port) return Exception('unsafe port'),Exception('unsafe hostname')
def recvuntil(sock,u): r = b'' while(r[-len(u):] != u): r += sock.recv(1) return r
def checkHeaders(headers): newHeaders = {} if(type(headers) is not dict): return Exception('unsafe headers') for headerName in headers: headerValue = str(headers[headerName]) if((isSafeHeader(headerName) and ':' not in headerName) and isSafeHeader(headerValue)): isBad = False for badHeaderName in badHeaderNames: if(badHeaderName in headerName.lower()): isBad = True break for badHeaderValue in unsafeKeywords: if(badHeaderValue in headerValue.lower()): isBad = True break if(isBad): return Exception('bad headers') newHeaders[headerName] = headerValue return newHeaders
def checkMethod(method): if(method in ['GET','POST']): return method return Exception('unsafe method')
def checkJson(j): if(type(j) == str): for u in unsafeKeywords: if(u in j.lower()): return False elif(type(j) == list): for entry in j: if(not checkJson(entry)): return False elif(type(j) == dict): for entry in j: if(not checkJson(j[entry])): return False else: return True
try: r = requests.post('http://firewalled-curl/req',json=json.loads(args)).json() if('request'in r and'flag'in r['request'] and'flag'in request.headers['X-Request']): return flag except: pass return'No flag for you :('