NSSCTF第8页(1)

news2024/12/22 5:58:43

[HGAME 2023 week1]Classic Childhood Game

js代码审计,找关键语句,发现event.js里边东西是最多的

找到了通关语句

他下边应该是就关键代码了,有一串16进制代码

解出来是base64,接着解  两次base64 解码,就得到了flag, 把前缀换成NSSCTF就ok

prize_p5

源代码:

<?php
error_reporting(0);

class catalogue{
    public $class;
    public $data;
    public function __construct()
    {
        $this->class = "error";
        $this->data = "hacker";
    }
    public function __destruct()
    {
        echo new $this->class($this->data);
    }
}
class error{
    public function __construct($OTL)
    {
        $this->OTL = $OTL;
        echo ("hello ".$this->OTL);
    }
}
class escape{                                                                   
    public $name = 'OTL';                                                 
    public $phone = '123666';                                             
    public $email = 'sweet@OTL.com';                          
}
function abscond($string) {
    $filter = array('NSS', 'CTF', 'OTL_QAQ', 'hello');
    $filter = '/' . implode('|', $filter) . '/i';
    return preg_replace($filter, 'hacker', $string);
}
if(isset($_GET['cata'])){
    if(!preg_match('/object/i',$_GET['cata'])){
        unserialize($_GET['cata']);
    }
    else{
        $cc = new catalogue(); 
        unserialize(serialize($cc));           
    }    
    if(isset($_POST['name'])&&isset($_POST['phone'])&&isset($_POST['email'])){
        if (preg_match("/flag/i",$_POST['email'])){

            die("nonono,you can not do that!");
        }
        $abscond = new escape();
        $abscond->name = $_POST['name'];
        $abscond->phone = $_POST['phone'];
        $abscond->email = $_POST['email'];
        $abscond = serialize($abscond);
        $escape = get_object_vars(unserialize(abscond($abscond)));
        if(is_array($escape['phone'])){
        echo base64_encode(file_get_contents($escape['email']));
        }
        else{
            echo "I'm sorry to tell you that you are wrong";
        }
    }
}
else{
    highlight_file(__FILE__);
}
?>
 

PHP原生类的利用_慕晨sekurlsa的博客-CSDN博客 

https://www.cnblogs.com/bcxc/articles/17052527.html (php原生类利用)

还是,要构造pop链,这里有一个利用点。

这里可以利用反序列化原生类

 public function __destruct()
    {
        echo new $this->class($this->data);
    }
}

这里可以实例化任意类,而且配合echo输出,那么自然想到就是原生类读文件了。这里利用FilesystemIterator来读取根目录有哪些文件。 

还有一个利用点是file_get_contents()函数,读取文件,路径可控

 if(is_array($escape['phone'])){
        echo base64_encode(file_get_contents($escape['email']));

过滤点:

<1>对于第一个反序列化点
只对get传入的序列化字符串内容进行正则匹配,匹配object关键字,忽略大小写
<2>对于第二个文件读取点
(0)get要设置cata的值
(1)对post传入的email参数进行匹配,匹配关键字flag,忽略大小写
(2)对生成的catalogue序列化字段进行关键字的替换,关键字'NSS', 'CTF', 'OTL_QAQ', 'hello'替换成'hacker'
(3)post phone要传入一个数组

读到了文件是/flag,接着来

 

 在根目录下有一个flag文件,我们利用SplFileObject这个原生类,同时他对object进行了过滤

利用编码绕过即可。

这里有一个知识点:

方便数据的传输,反序列化内容中大写的S表示字符串,可以识别内容里的十六进制

把序列化中的s变成大写就可以进行绕过,通过这个知识点,把object里边的一个字母变成16进制,就可以实现绕过,这里把b变成\62就可以

 payload:

O:9:"catalogue":2:{s:5:"class";S:13:"SplFileO\62ject";s:4:"data";s:5:"/flag";}

得到flag

这里只是一种解法,还可以利用字符替换,进行字符串逃逸,然后利用file_get_contenes()进行文件读取

推荐一篇大佬的博客

nssprize5 - 刷题记录 |Yume Shoka = Xilzy's blog = Just have fun in cyberspace!

[HDCTF 2023]YamiYami 

Linux内核:进程管理——进程文件系统 /proc详解 - 知乎 

Linux下 /proc文件夹内容解析(/proc文件系统解析)_proc environ-CSDN博客 

有一种非预期解法,就是利用/proc来读取环境变量,得到flag

在第一个链接来读取

先访问一下/etc/passwd

发现能读取,那就读取环境变量得到flag  file:///proc/1/environ

这是一个Linux系统特有的文件路径,其中的“/proc”目录是一个特殊的虚拟文件系统,提供了对内核数据结构的访问和控制。在这个目录下,“1”代表的是PID为1的进程(也就是init进程)。而“environ”文件则保存了该进程启动时设置的环境变量,以及之后在该进程中使用 putenv() 或者 setenv() 等相关函数修改的环境变量。
 

他在最后一个链接提到了/app ,应该是他源码存在的地方,尝试访问

发现读取不出来

 /flag也是读取不出来,应该是有限制,利用url编码来读取

app/app.py -> %61%70%70/%61%70%70%2E%70%79 --> %2561%2570%2570/%2561%2570%2570%252E%2570%2579

成功读取到源码


#encoding:utf-8
import os
import re, random, uuid
from flask import *
from werkzeug.utils import *
import yaml
from urllib.request import urlopen
app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = False
BLACK_LIST=["yaml","YAML","YML","yml","yamiyami"]
app.config['UPLOAD_FOLDER']="/app/uploads"
 
@app.route('/')
def index():
    session['passport'] = 'YamiYami'
    return '''
    Welcome to HDCTF2023 <a href="/read?url=https://baidu.com">Read somethings</a>
    <br>
    Here is the challenge <a href="/upload">Upload file</a>
    <br>
    Enjoy it <a href="/pwd">pwd</a>
    '''
@app.route('/pwd')
def pwd():
    return str(pwdpath)
@app.route('/read')
def read():
    try:
        url = request.args.get('url')
        m = re.findall('app.*', url, re.IGNORECASE)
        n = re.findall('flag', url, re.IGNORECASE)
        if m:
            return "re.findall('app.*', url, re.IGNORECASE)"
        if n:
            return "re.findall('flag', url, re.IGNORECASE)"
        res = urlopen(url)
        return res.read()
    except Exception as ex:
        print(str(ex))
    return 'no response'
 
def allowed_file(filename):
   for blackstr in BLACK_LIST:
       if blackstr in filename:
           return False
   return True
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            return "Empty file"
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            if not os.path.exists('./uploads/'):
                os.makedirs('./uploads/')
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return "upload successfully!"
    return render_template("index.html")
@app.route('/boogipop')
def load():
    if session.get("passport")=="Welcome To HDCTF2023":
        LoadedFile=request.args.get("file")
        if not os.path.exists(LoadedFile):
            return "file not exists"
        with open(LoadedFile) as f:
            yaml.full_load(f)
            f.close()
        return "van you see"
    else:
        return "No Auth bro"
if __name__=='__main__':
    pwdpath = os.popen("pwd").read()
    app.run(
        debug=False,
        host="0.0.0.0"
    )
    print(app.config['SECRET_KEY'])
 

需要做的事情就2件,因为提示在/boogipop做坏事,那么就需要伪造session,Yaml反序列化。

伪造session,需要知道secret_key,对secret_key的定义

app.config['SECRET_KEY'] = str(random.random()*233)

对于伪随机数,当seed固定时,生成的随机数是可以预测的,也就是顺序为固定的,所以只要知道seed的值即可。这里看到seed使用的uuid.getnode()函数,该函数用于获取Mac地址并将其转换为整数。所以我们还需要读一下Mac地址。

random.seed(uuid.getnode())  

前提知识:
在 python 中使用 uuid 模块生成 UUID(通用唯一识别码)。可以使用 uuid.getnode() 方法来获取计算机的硬件地址,这个地址将作为 UUID 的一部分。
那么/sys/class/net/eth0/address,这个就是网卡的位置,读取他进行伪造即可。 

读取到的mac地址,把他转换成10进制

2485376912964 

构造secret_key 74.93509459398877

他的session形式

 

 在进行伪造session,伪造好session之后就是进行反序列化了

eyJwYXNzcG9ydCI6IldlbGNvbWUgVG8gSERDVEYyMDIzIn0.ZTPnxA.HH4vFZIJQ3RCFrA5XkJcirW1oe4

PyYaml反序列化漏洞_snowlyzz的博客-CSDN博客

接下来就是构造并上传yml文件进行反序列化:

由于上传文件后缀设置了黑名单,所以直接采用.txt文件,那为什么.txt也能被当作.yaml来解析呢。猜测可能是:这里full_load调用了load函数,而load函数输入的是一个steam,也就是流,二进制文件,所以不管是什么后缀都无关紧要了。 

 

上传成功后通过源码可知文件访问路径为/boogipop?file=/uploads/expp.txt

 成功访问

接下来就是连接 然后进行查询,得到flag

改session

监听并连接成功 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vector3(即是位置,也是方向)

在三维世界中&#xff0c;最重要的就是确定物体在三维世界中 的位置、大小和缩放等信息。在Unity中&#xff0c;Vector3结构体就是用来表示这些信息的&#xff0c;此外也用Vector2来表示二维世界中的信息。 Vector3结构体由x、y、z这3个数值组成&#xff0c;表示了一个向量&am…

Nautilus Chain 与 Coin98 生态达成合作,加速 Zebec 生态亚洲战略进

目前&#xff0c;行业内首个模块化 Layer3 架构公链 Nautilus Chain 已经上线主网&#xff0c;揭示了模块化区块链领域迎来了全新的进程。在主网上线后&#xff0c;Nautilus Chain 将扮演 Zebec 生态中最重要的底层设施角色&#xff0c;并将为 Zebec APP 以及 Zebec Payroll 规…

算法-动态规划-java

文章目录 动态规划动态规划的核心动态规划算法的两种形式首先使用递归的方法实现这个算法①自顶向下的备忘录法②自底向上的动态规划&#xff08;推荐使用&#xff09; 更好的理解动态规划经典例题&#xff1a;钢条分割首先使用递归的方法实现这个算法①自顶向下的备忘录法②自…

2023-10-16 LeetCode每日一题(只出现一次的数字 III)

2023-10-16每日一题 一、题目编号 260. 只出现一次的数字 III二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答…

CSS中 通过自定义属性(变量)动态修改元素样式(以 el-input 为例)

传送门&#xff1a;CSS中 自定义属性&#xff08;变量&#xff09;详解 1. 需求及解决方案 需求&#xff1a;通常我们动态修改 div 元素的样式&#xff0c;使用 :style 和 :class 即可&#xff1b;但想要动态修改 如&#xff1a;Element-ui 中输入框&#xff08;input&#x…

【每日一题】统计无向图中无法互相到达点对数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;并查集方法二&#xff1a;DFS乘法原理 写在最后 Tag 【DFS乘法原理】【并查集】【图】【数组】【2023-10-21】 题目来源 2316. 统计无向图中无法互相到达点对数 题目解读 节点之间的连接关系是通过数组给出的&#x…

10月9日 Jdbc(2)

PreparedStatement的使用和jdbcUtil工具类的封装 拼接带来的sql注入问题(拼接sql) Statement PreparedStatement的使用 package com.fs.db;import com.fs.util.JdbcUtil;import java.sql.*; import java.util.Date; import java.util.Scanner;/*** 模拟SQL攻击*/ public clas…

使用 dynamic-datasource 完成多数据源操作

本次操作是将达梦数据库的数据插入到MySQL数据库中。 准备工作 创建一个 Spring Boot 项目添加依赖配置数据源属性 POM文件 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</art…

Python机器学习入门指南

前言 机器学习 作为人工智能领域的核心组成&#xff0c;是计算机程序学习数据经验以优化自身算法&#xff0c;并产生相应的“智能化的”建议与决策的过程。 一个经典的机器学习的定义是&#xff1a; A computer program is said to learn from experience E with respect to …

【软考】11.6 系统转换/系统维护/系统评价

《系统转换》 遗留系统 &#xff08;改造&#xff09;高水平高价值&#xff08;集成&#xff09;高水平低价值&#xff08;继承&#xff09;低水平高价值&#xff08;淘汰&#xff09;低水平低价值 系统转换 《系统维护》 耗时长、成本高 提高可维护性是在软件设计和开发阶…

搞个微信小程序001

一&#xff0c;申请账号 开始 | 微信开放文档 二&#xff0c;安装开发者工具 开始 | 微信开放文档 我这里搞了个稳定版的。 三&#xff0c;第一个小程序 1&#xff0c;打开工具&#xff0c;扫码登录 2&#xff0c;新建以小程序 选择&#xff0c;不使用云服务&#xff0c…

SpringMVC的工作流程

1、SpringMVC的定义 Spring MVC是基于Java的开源Web框架&#xff0c;它是Spring框架的一部分&#xff0c;用于构建MVC&#xff08;Model-View-Controller&#xff09;模式的Web应用程序。它提供了一种灵活且强大的方式来开发Web应用程序&#xff0c;并将应用程序的不同层进行解…

C#接口和继承的区别、联系与使用场景

在C#编程语言中&#xff0c;接口和继承是两个核心的概念。本文将详细介绍接口和继承之间的区别与联系&#xff0c;并探讨它们在实际编程中的使用场景。通过代码示例和详细说明&#xff0c;读者将能够深入理解这两个概念的功能和用法。 目录 引言1. 区别与联系1.1 区别1.2 联系 …

curl命令服务器上执行http请求

1. 现在本地使用postman生成curl命令 注意: 将ip改成127.0.0.1,端口是实际服务运行的端口 curl --location --request POST http://127.0.0.1:63040/content/course/list?pageNo1&pageSize2 \ --header Content-Type: application/json \ --data-raw {"courseName&q…

FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6

一、FreeRTOS 介绍 什么是 FreeRTOS &#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;Fr…

基于SSM的在线房屋租赁和电子签约系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

11 Self-Attention相比较 RNN和LSTM的优缺点

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html RNN 无法做长序列,当一…

自然语言处理---Transformer机制详解之Transformer优势

1 Transformer的并行计算 对于Transformer比传统序列模型RNN/LSTM具备优势的第一大原因就是强大的并行计算能力. 对于RNN来说&#xff0c;任意时刻t的输入是时刻t的输入x(t)和上一时刻的隐藏层输出h(t-1)&#xff0c;经过运算后得到当前时刻隐藏层的输出h(t)&#xff0c;这个…

网络编程的学习初篇

网络原理初始 网络原理和网络编程[重要] 网络能够跨主机通信! 我们未来工作,很可能是成为后端开发工程师,写服务器,和客户端通信,肯定会涉及到网络. 网络初始 计算机网络的由来 ~~ 计算机网络这是计科相关专业最核心的专业课!!! 计算机是咋来的??最初是用来计算弹道导弹的轨…

EtherCAT主站SDO读报文抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文读取从站1的对象字典&#xff0c;读取对象字典主索引为0x2000&#xff0c;子索引为0x00。主站通过发送SDO读报文实现对该对象字典的读取&…