0%

[CISCN2019 华东南赛区]Web4

[CISCN2019 华东南赛区]Web4

国赛国赛,复现复现

题解

打开界面顺着给的链接走,会进read路由并且获取参数url=https://www.baidu.com
可以猜出来打一个ssrf,不过具体怎么打倒是没有思路,不过首先还是先用file协议读一下文件吧,然后输入file就直接回显WAF,果然没有这么简单啊

根据路由类型再访问一下index.php之类的路径,发现不存在index.php文件,大概可以猜出来是个python题或者js题之类的,不过还是不知道咋搞啊

看wp得知在flask框架下可以用一个名为的local_file协议,使用方法和file://协议没什么区别,读一下/etc/passwd发现能用,确定框架flask,python题。读一下常见路径,/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! <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"
    )

print str(ex)这句可以看出来是python2啊,然后过滤也就过滤了^file,所以local_file就能用,剩下的就是一个session的伪造,去flag路由拿flag了

好久没做过flask相关题目,都忘了flask的session是啥情况了,好像用的就是jwt,所以数据部分直接公开,需要用密钥加密一下签名部分,这里的secret_key是由种子产生的,而种子却是一个固定值uuid.getnode(),专门查了一下是个什么东西

__Get the hardware address as a 48-bit positive integer. __The first time this runs, it may launch a separate program, which could be quite slow. If all attempts to obtain the hardware address fail, we choose a random 48-bit number with the multicast bit (least significant bit of the first octet) set to 1 as recommended in RFC 4122. __“Hardware address” means the MAC address of a network interface. __

就是MAC地址嘛
读这个文件获得MAC地址/sys/class/net/eth0/address
得到的MAC地址就按十六进制填进去生成key就可以了,不过要使用python2的环境,python2和python3的随机数是不一样的,这里从之前语法可以看到是Python2语法

可以先解密一下现在的session,然后把username改一下再加密,用那个cookie访问flag路由获取flag