想研究很久了,這次終於初步了解了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身份登陸