写在开头:
当时因为一些原因没花很多时间在写极客大挑战上,题目都是很好的题目,对于我这种刚入门的小白难度刚刚好。这篇 wp 上涉及的题目都是当时解出的,后面的没来的及复现 QAQ,也是因为刚搭博客所以从笔记上搬过来的

# 100% 的⚪


web 签到题
开始挑战之后,看一手源码
经典 js 小游戏

直接拿到 flag

# rce_me


清晰明了的审计
首先 post 传参 start 的内容为 start now(strpos 定位)
之后就是核心难点 sha1 和 md5?
no no no
其实是 php 特性
有关于 post 传参变量名要求,其中可以包含数字字母和下划线,但不能含有 .
所以在 php 中,如果遇到变量名中含有 . 号,会自动将其转化成 _
这就导致了,我们传入的变量名并不是题目要求的,不论 sha1 再怎么和 md5 绕过,回显一直都是欠打的”It is so easy, do you know sha1 and md5?”
这里就需要用到特性:如果参数中出现了 [ ,那么会将其转化为 _ ,但是会出现转化错误,导致后面的参数名中,如果还有 . z 号,那么将不会被转化
所以 payload 为:
.[2024.geekchallenge.ctf=10932435112
(其 sha1 值带 0e,因为字符串的 md5 值也带 0e)
之后稍微有点意思的就是 year<2024 && year+1>2025 了,其实这个判断的实现,主要靠 intval () 函数
假如我们传入科学计数法,但不加 1,intval 会将 e 前面的内容输出,如果加了 1,就会将其识别为科学计数法
所以 payload 为:
year=1e4 # +1前: 1;+1后:10001
接下来的 purpose 和 code 就很简单了,一个直接将 rce 放在开头,一个直接利用 system 获取 flag

# ez_http


经典 http 闯关,跟着题目提示一个个来就行,这里直接展示最终结果,比起一般的闯关,多了对于GOLBALjwt伪造的考察。像遇到GOLBAL和jwt伪造的考察。像遇到```GOLBAL [“HTTP_STARVEN”]==“I_Want_Flag”``` 这种要求,直接请求头构造就行(之前被 gpt 骗去写脚本了),jwt 的话,直接将 hasFlag 改为 true 就行,没有 hash 的 serectkey,还害得我跑了半天的 jwtcrack

# ez_include

读题发现,require_once 会检查文件包含次数,之前在题干处已经包含过一次,那么不能进行第二次直接包含
去网上了解了一下 php 文件包含的原理,发现和哈希表有关,之前还是接触浅了
php 源码分析 require_once 绕过不能重复包含文件的限制 - 安全客 - 安全资讯平台
通过伪协议配合多级符号链接的方式,让 php 既不能将 php 文件名放入哈希表中又能正确找到这个文件读取内容,payload 构造:
php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/starven_secret.php

base64 解码

还有 level2

看到有提示说 register_argc_argv=On
想到文件包含中的 argv 全局变量即 pearcmd 文件包含
通过 config-create 将一句话木马写入
不过要注意的是,这里需要抓包来传入,因为 url 会将一句话木马中的标签给编码了,导致标签失效

之后通过包含写入的木马文件,进行任意命令执行

看了一圈根目录里面没有,结果是藏在环境变量里面了……

# Can_you_Pass_Me


题目一眼 SSTI 类型的
肯定不会什么都不防御,所以先 fuzz 一下,看看都过滤了什么关键词

有很多,试了几个 payload,发现基本构造都被过滤了,去网上学习下,还可以利用 Unicode 编码绕过,然后相互之间再通过 attr 连接,来绕过限制,构造 pyload 如下:

先利用 global 去看看什么模块能用,发现有 os

直接上 ls,发现了 flag,但是还有一个地方需要绕过

既然不能直接出现,那么也许可以试试 base64 编码之后再输出,popen 中直接执行的外部命令

成功获得回显

拿下