前言
说好的一天一道ctf,差点忘了,耍脱了,赶快做起来,现在还欠了一道
解题
进入题目点击链接后直接跳到百度了,毫无疑问,ssrf,而且参数都给了url,尝试file读取文件,你妹,file被禁了应该,怎么办,绕一绕,绕半天绕不过,也没心情想,直接wp,发现™的根本不需要file,直接读就完事了
然后就读一下源码,因为这个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去找之后数获得之后我们就得到key,之后就是伪造session了
然后我们访问flag,修改cookie就得到了flag
总结
file协议绕过不了尝试直接读取,或者直接local_file一样的