Session会话之伪造用户登录
前言
伪造用户登录的攻击面也是特别广
伪造用户需要 Key
,所以隐藏 key
的方法就有很多
- uuid.getnode()函数隐藏
key
- Session反序列化
- 环境变量藏
KEY
,软连接读任意文件读取 - pickle反序列化
/proc/self/environ
获取环境变量 - SSTI读取环境变量
例题[CISCN2019 华东南赛区]Web4
有传参,猜测目录跨越
这种路由处理方式并不像是PHP,尝试了file:///etc/passwd
没有效果,猜测Flask
,尝试local_file:///
读取文件
flask的默认文件app/app.py
源码
import re, random, uuid, urllib
from flask import Flask, session, request
app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = True
@app.route('/')
def index():
session['username'] = 'www-data'
return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>'
@app.route('/read')
def read():
try:
url = request.args.get('url')
m = re.findall('^file.*', url, re.IGNORECASE)
n = re.findall('flag', url, re.IGNORECASE)
if m or n:
return 'No Hack'
res = urllib.urlopen(url)
return res.read()
except Exception as ex:
print str(ex)
return 'no response'
@app.route('/flag')
def flag():
if session and session['username'] == 'fuck':
return open('/flag.txt').read()
else:
return 'Access denied'
if __name__=='__main__':
app.run(
debug=True,
host="0.0.0.0"
)
当if session and session['username'] == 'fuck':
得到flag
- 伪造session
而伪造session
或者解密session
都需要密钥
,在源码中有密钥的生成方式:
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
对于伪随机数,如果seed
是固定的,生成的随机数是可以预测的,也就是顺序固定的,所以只要知道seed
的值即可。这里的seed
使用的uuid.getnode()
的值,该函数用于获取Mac地址并将其转换为整数。
那么就需要读取Mac地址local_file:///sys/class/net/eth0/address
#!/usr/bin/python
import random
random.seed(0x0242ac10a57a)
print(str(random.random()*233))
解码成功
{'username': b'www-data'}
修改为{'username': b'fuck'}
然后重新加密生成session
替换生成的session,得到flag
本文来自博客园,作者:kzd的前沿思考,转载请注明原文链接:https://www.cnblogs.com/Fram3/p/15865912.html