nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

[CISCN 2019华东南]Web4

前言

说好的一天一道ctf,差点忘了,耍脱了,赶快做起来,现在还欠了一道

解题

进入题目点击链接后直接跳到百度了,毫无疑问,ssrf,而且参数都给了url,尝试file读取文件,你妹,file被禁了应该,怎么办,绕一绕,绕半天绕不过,也没心情想,直接wp,发现™的根本不需要file,直接读就完事了2024-01-22T12:06:47.png
然后就读一下源码,因为这个web程序是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"
    )

一目了然if session and session['username'] == 'fuck':,需要控制session,然后又给了key的获取方法

random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)

uuid.getnode() 会返回一个唯一的标识符(UUID)作为种子,该标识符通常基于计算机的 MAC 地址,我们就去读mac地址url=/sys/class/net/eth0/address读到02:42:ac:02:3c:1d
那我们的种子就是0x0242ac023c1d,然后有一个重点就是python2和python3不一样,这题是2,我们需要用python2去找之后数2024-01-22T12:14:52.png获得之后我们就得到key,之后就是伪造session了
2024-01-22T12:16:11.png然后我们访问flag,修改cookie就得到了flag

总结

file协议绕过不了尝试直接读取,或者直接local_file一样的

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » [CISCN 2019华东南]Web4

评论