想研究很久了,这次终于初步了解了flask session伪造(得知道密钥)。
python2和python3 session解密不一样,而且不都是base64,脚本https://github.com/ZhangAiQiang/Flask/tree/master/%E8%A7%A3%E5%AF%86session%E8%84%9A%E6%9C%AC
参考文章:https://www.cnblogs.com/apossin/p/10083937.html
①首先需要知道的信息
flask是把session存在客户端的,而且只经过base64编码和用密钥签名,虽然没有有签名不可以伪造session,但是有很多信息我们可以直接从session解码找出来。
②session伪造源码(https://github.com/ZhangAiQiang/Flask/tree/master/flask-session身份伪造简单源码)
from flask import Flask,session,render_template,request,render_template_string
app=Flask(__name__)
app.config['SECRET_KEY']="HELLO WORD!"#session必须用到的密钥,伪造身份的关键。
@app.route('/')
def index():
try:
username=session['username']
return "hello,"+username #判断session里面是否有username的值,有的话就直接登陆状态。
except KeyError: #捕获异常,如果没有session的值,会出现KeyError错误
return render_template('login.html') #如果没有session就跳转登录界面
@app.route('/login',methods=['POST','GET'])
def login():
if request.method=='POST':
username=request.form['username']
if username=='admin' and not password =="8sudehd7eageaade54": #用户是不知道admin密码的,这里考虑session伪造。
return "密码不对"
session['username']=username
return "hello,"+username
return render_template("login.html")
#ssti注入点
@app.errorhandler(404)
def page_not_found(e):
template='''
{%% block body %%}
<div class="center-content error">
<h1>Oops! That page doesn't exist.</h1>
<h3>%s</h3>
</div>
{%% endblock %%}
'''%(request.url)
return render_template_string(template),404
app.run(debug=True,port=8091)
③简单的说一下代码的功能:
- 除了admin需要密码,其他用户爱咋地咋地。
- 直接输入ip一开始没有session所以跳转登录界面,有了session就可以直接访问ip看到欢迎信息
- 想尽办法伪造admin用户
④先随便用个qaq账户登陆下试试,登陆成功后##
打开控制台:
解码:
⑤如果我直接把qaq改成admin然后base64编码一下不就可以直接登陆上去了?
不是的,后边的内容是签名,一开始说了,没有密钥没法伪造身份就是因为这个签名防篡改的作用。
⑥获取密钥的办法:
ssti注入,信息泄露。
这里ssti怎么获取就不说了,获取密钥要紧,以后再讨论ssti,输入ip/{{config}}
可以看到密钥是HELLO WORLD!
⑦伪造session脚本
https://github.com/noraj/flask-session-cookie-manager
⑧burp抓包,替换session
可以看到成功的以admin身份登陆