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%E8%BA%AB%E4%BB%BD%E4%BC%AA%E9%80%A0%E7%AE%80%E5%8D%95%E6%BA%90%E7%A0%81)

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账户登陆下试试,登陆成功后

打开控制台:

jy5yv3T.png

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

解码:

S1h2W1v.png

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

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

⑥获取密钥的办法:

ssti注入,信息泄露。

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

可以看到密钥是HELLO WORLD!

⑦伪造session脚本

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

vsjGbYc.png

⑧burp抓包,替换session

CH1mE76.png

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

CWKOd8E.png

转载于:https://www.cnblogs.com/zaqzzz/p/10243961.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值