#!/usr/bin/env python3importsysimportzlibfrombase64importb64decodefromflask.sessionsimportsession_json_serializerfromitsdangerousimportbase64_decodedefdecryption(payload):payload,sig=payload.rsplit(b'.',1)payload,timestamp=payload.rsplit(b'.',1)decompress=Falseifpayload.startswith(b'.'):payload=payload[1:]decompress=Truetry:payload=base64_decode(payload)exceptExceptionase:raiseException('Could not base64 decode the payload because of ''an exception')ifdecompress:try:payload=zlib.decompress(payload)exceptExceptionase:raiseException('Could not zlib decompress the payload before ''decoding the payload')returnsession_json_serializer.loads(payload)if__name__=='__main__':print(decryption("eyJ1c2VybmFtZSI6eyIgYiI6IlozVmxjM1E9In19.XyZ3Vw.OcD3-l1yOcq8vlg8g4Ww3FxrhVs".encode()))
#!/usr/bin/env python2""" Flask Session Cookie Decoder/Encoder """__author__='Wilson Sumanang, Alexandre ZANNI'# standard importsimportsysimportzlibfromitsdangerousimportbase64_decodeimportast# Abstract Base Classes (PEP 3119)ifsys.version_info[0]<=2andsys.version_info[1]<6:# < 2.6raiseException('Must be using at least Python 2.6')elif(sys.version_info[0]==2andsys.version_info[1]>=6):# >= 2.6 && < 3.0fromabcimportABCMeta,abstractmethodelse:# > 3.0raiseException('Use Python 3 version of the script')# Lib for argument parsingimportargparse# external Importsfromflask.sessionsimportSecureCookieSessionInterfaceclassMockApp(object):def__init__(self,secret_key):self.secret_key=secret_keyclassFSCM:__metaclass__=ABCMeta@classmethoddefencode(cls,secret_key,session_cookie_structure):""" Encode a Flask session cookie """try:app=MockApp(secret_key)session_cookie_structure=dict(ast.literal_eval(session_cookie_structure))si=SecureCookieSessionInterface()s=si.get_signing_serializer(app)returns.dumps(session_cookie_structure)exceptExceptionase:return"[Encoding error] {}".format(e)raisee@classmethoddefdecode(cls,session_cookie_value,secret_key=None):""" Decode a Flask cookie """try:if(secret_key==None):compressed=Falsepayload=session_cookie_valueifpayload.startswith('.'):compressed=Truepayload=payload[1:]data=payload.split(".")[0]data=base64_decode(data)ifcompressed:data=zlib.decompress(data)returndataelse:app=MockApp(secret_key)si=SecureCookieSessionInterface()s=si.get_signing_serializer(app)returns.loads(session_cookie_value)exceptExceptionase:return"[Decoding error] {}".format(e)raiseeif__name__=="__main__":# Args are only relevant for __main__ usage## Description for helpparser=argparse.ArgumentParser(description='Flask Session Cookie Decoder/Encoder',epilog="Author : Wilson Sumanang, Alexandre ZANNI")## prepare sub commandssubparsers=parser.add_subparsers(help='sub-command help',dest='subcommand')## create the parser for the encode commandparser_encode=subparsers.add_parser('encode',help='encode')parser_encode.add_argument('-s','--secret-key',metavar='<string>',help='Secret key',required=True)parser_encode.add_argument('-t','--cookie-structure',metavar='<string>',help='Session cookie structure',required=True)## create the parser for the decode commandparser_decode=subparsers.add_parser('decode',help='decode')parser_decode.add_argument('-s','--secret-key',metavar='<string>',help='Secret key',required=False)parser_decode.add_argument('-c','--cookie-value',metavar='<string>',help='Session cookie value',required=True)## get argsargs=parser.parse_args()## find the option chosenif(args.subcommand=='encode'):if(args.secret_keyisnotNoneandargs.cookie_structureisnotNone):print(FSCM.encode(args.secret_key,args.cookie_structure))elif(args.subcommand=='decode'):if(args.secret_keyisnotNoneandargs.cookie_valueisnotNone):print(FSCM.decode(args.cookie_value,args.secret_key))elif(args.cookie_valueisnotNone):print(FSCM.decode(args.cookie_value))
#!/usr/bin/env python3""" Flask Session Cookie Decoder/Encoder """__author__='Wilson Sumanang, Alexandre ZANNI'# standard importsimportsysimportzlibfromitsdangerousimportbase64_decodeimportast# Abstract Base Classes (PEP 3119)ifsys.version_info[0]<3:# < 3.0raiseException('Must be using at least Python 3')elifsys.version_info[0]==3andsys.version_info[1]<4:# >= 3.0 && < 3.4fromabcimportABCMeta,abstractmethodelse:# > 3.4fromabcimportABC,abstractmethod# Lib for argument parsingimportargparse# external Importsfromflask.sessionsimportSecureCookieSessionInterfaceclassMockApp(object):def__init__(self,secret_key):self.secret_key=secret_keyifsys.version_info[0]==3andsys.version_info[1]<4:# >= 3.0 && < 3.4classFSCM(metaclass=ABCMeta):defencode(secret_key,session_cookie_structure):""" Encode a Flask session cookie """try:app=MockApp(secret_key)session_cookie_structure=dict(ast.literal_eval(session_cookie_structure))si=SecureCookieSessionInterface()s=si.get_signing_serializer(app)returns.dumps(session_cookie_structure)exceptExceptionase:return"[Encoding error] {}".format(e)raiseedefdecode(session_cookie_value,secret_key=None):""" Decode a Flask cookie """try:if(secret_key==None):compressed=Falsepayload=session_cookie_valueifpayload.startswith('.'):compressed=Truepayload=payload[1:]data=payload.split(".")[0]data=base64_decode(data)ifcompressed:data=zlib.decompress(data)returndataelse:app=MockApp(secret_key)si=SecureCookieSessionInterface()s=si.get_signing_serializer(app)returns.loads(session_cookie_value)exceptExceptionase:return"[Decoding error] {}".format(e)raiseeelse:# > 3.4classFSCM(ABC):defencode(secret_key,session_cookie_structure):""" Encode a Flask session cookie """try:app=MockApp(secret_key)session_cookie_structure=dict(ast.literal_eval(session_cookie_structure))si=SecureCookieSessionInterface()s=si.get_signing_serializer(app)returns.dumps(session_cookie_structure)exceptExceptionase:return"[Encoding error] {}".format(e)raiseedefdecode(session_cookie_value,secret_key=None):""" Decode a Flask cookie """try:if(secret_key==None):compressed=Falsepayload=session_cookie_valueifpayload.startswith('.'):compressed=Truepayload=payload[1:]data=payload.split(".")[0]data=base64_decode(data)ifcompressed:data=zlib.decompress(data)returndataelse:app=MockApp(secret_key)si=SecureCookieSessionInterface()s=si.get_signing_serializer(app)returns.loads(session_cookie_value)exceptExceptionase:return"[Decoding error] {}".format(e)raiseeif__name__=="__main__":# Args are only relevant for __main__ usage## Description for helpparser=argparse.ArgumentParser(description='Flask Session Cookie Decoder/Encoder',epilog="Author : Wilson Sumanang, Alexandre ZANNI")## prepare sub commandssubparsers=parser.add_subparsers(help='sub-command help',dest='subcommand')## create the parser for the encode commandparser_encode=subparsers.add_parser('encode',help='encode')parser_encode.add_argument('-s','--secret-key',metavar='<string>',help='Secret key',required=True)parser_encode.add_argument('-t','--cookie-structure',metavar='<string>',help='Session cookie structure',required=True)## create the parser for the decode commandparser_decode=subparsers.add_parser('decode',help='decode')parser_decode.add_argument('-s','--secret-key',metavar='<string>',help='Secret key',required=False)parser_decode.add_argument('-c','--cookie-value',metavar='<string>',help='Session cookie value',required=True)## get argsargs=parser.parse_args()## find the option chosenif(args.subcommand=='encode'):if(args.secret_keyisnotNoneandargs.cookie_structureisnotNone):print(FSCM.encode(args.secret_key,args.cookie_structure))elif(args.subcommand=='decode'):if(args.secret_keyisnotNoneandargs.cookie_valueisnotNone):print(FSCM.decode(args.cookie_value,args.secret_key))elif(args.cookie_valueisnotNone):print(FSCM.decode(args.cookie_value))
其实可以看到,加解密逻辑是一样的,区别主要是不同版本引入合适的抽象基类模块是不一样的
1
2
3
4
5
6
ifsys.version_info[0]<3:# < 3.0raiseException('Must be using at least Python 3')elifsys.version_info[0]==3andsys.version_info[1]<4:# >= 3.0 && < 3.4fromabcimportABCMeta,abstractmethodelse:# > 3.4fromabcimportABC,abstractmethod
#!/usr/bin/python3.6importosimportpicklefrombase64importb64decodefromflaskimportFlask,request,render_template,sessionapp=Flask(__name__)app.config["SECRET_KEY"]="*******"# 定义一个 User 类User=type('User',(object,),{'uname':'test','is_admin':0,'__repr__':lambdao:o.uname,})@app.route('/',methods=('GET',))defindex_handler():ifnotsession.get('u'):u=pickle.dumps(User())session['u']=ureturn"/file?file=index.js"@app.route('/file',methods=('GET',))deffile_handler():path=request.args.get('file')path=os.path.join('static',path)ifnotos.path.exists(path)oros.path.isdir(path) \
or'.py'inpathor'.sh'inpathor'..'inpathor"flag"inpath:return'disallowed'withopen(path,'r')asfp:content=fp.read()returncontent@app.route('/admin',methods=('GET',))defadmin_handler():try:u=session.get('u')ifisinstance(u,dict):u=b64decode(u.get('b'))u=pickle.loads(u)exceptException:return'uhh?'ifu.is_admin==1:return'welcome, admin'else:return'who are you?'if__name__=='__main__':app.run('0.0.0.0',port=80,debug=False)