flask利用session身份伪造

想研究很久了,这次终于初步了解了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账户登陆下试试,登陆成功后##

打开控制台:

session的值为eyJ1c2VybmFtZSI6InFhcSJ9.Dxclgg.FMNAqa5Zk2wqg6S6WPyOQm-nU68  
其中eyJ1c2VybmFtZSI6InFhcSJ9为base64编码后session的内容。  

解码:

⑤如果我直接把qaq改成admin然后base64编码一下不就可以直接登陆上去了?

不是的,后边的内容是签名,一开始说了,没有密钥没法伪造身份就是因为这个签名防篡改的作用。

⑥获取密钥的办法:

ssti注入,信息泄露。

这里ssti怎么获取就不说了,获取密钥要紧,以后再讨论ssti,输入ip/{{config}}

可以看到密钥是HELLO WORLD!

⑦伪造session脚本

https://github.com/noraj/flask-session-cookie-manager

⑧burp抓包,替换session

可以看到成功的以admin身份登陆

原文地址:https://www.cnblogs.com/zaqzzz/p/10243961.html