NewStarCTF 2023
Web
[Week 1]泄漏的秘密
通过使用 dirsearch 扫描可以得到两个文件可访问 robots.txt 和 www.zip 。
robots.txt 内容如下
PART ONE: flag{r0bots_1s_s0_us3fulwww.zip/index.php 内容如下
<?php
$PART_TWO = "_4nd_www.zip_1s_s0_d4ng3rous}";
echo "<h1>粗心的管理员泄漏了一些敏感信息,请你找出他泄漏的两个敏感信息!</h1>";即可得到 flag 如下
flag{r0bots_1s_s0_us3ful_4nd_www.zip_1s_s0_d4ng3rous}[Week 1]Begin of Upload
通过查看源代码可以发现使用的是前端过滤,通过在浏览器中禁止 JavaScript 后即可直接上传 shell 文件。

通过蚁剑一把梭即可得到 flag(文件在 /fllll4g)。
[Week 1]Begin of HTTP
0x00 GET
通过 param 传入 ctf 参数即可,如下
0x01 POST
查看源代码可以发现
通过 base64 解密可以得到 Secret 值为 n3wst4rCTF2023g00000d ,通过 body 传入即可。
0x02 Cookie
通过设置 Cookie 如下
0x03 User-Agent
通过设置 User-Agent 如下
0x04 Referer
通过设置 Referer 如下
0x05 X-Real-Ip
通过设置 X-Real-Ip 如下
就可以得到 flag 了。
[Week 1]ErrorFlask
通过题目得知需要从 Flask 中的报错中寻找答案,网页回显如下
通过输入字符串类型的值即可得到报错,Payload 如下
得到回显后点击 return "not ssti,flag in source code~"+str(int(num1)+int(num2)) 即可得到 flag ,不方便复制可以 F12 来复制。
[Week 1]Begin of PHP
0x00 Level 1
md5 绕过,可以通过数组进行绕过,Payload 如下
0x01 Level 2
md5 === sha1 绕过,同样可以通过数组进行绕过,Payload 如下(Level 5 中不允许 POST 的值出现任何数字或字母)
0x02 Level 3
strcmp 函数绕过,同样可以通过数组进行绕过,Payload 如下
0x03 Level 4
is_numeric 函数绕过,将 key5 设置为 2024a(任意字符) 即可,Payload 如下
0x04 Level 5
extract($_POST); 函数相当于 $name = $_POST['name'] 。
通过发现缺少了 flag5 变量,说明就需要通过以上方法来造出 flag5,又因为 POST 的值出现任何数字或字母,根据在 PHP 中,只要字符串不为空即为 True 的特性,故 Payload 如下
即可得到 flag。
[Week 1]R!C!E!
本题需要知道 GET 或 POST 变量名中的非法字符会转化下划线,即 $_POST['e_v.a.l'] 需要通过 e[.v.a.l 来传入。
并且题目中还存在一个 password,该参数会进行 md5 加密并对比前 6 位需要与 c4d038 一致,可以通过写脚本进行爆破。
题目还对部分常见的恶意函数进行了过滤,但是可以通过 反引号 来执行 shell 命令,也可以通过 反斜杠 来进行绕过,Payload 如下
可以得到回显如下
构造 Payload 如下即可得到 flag
[Week 1]EasyLogin
随意注册一个账号后登录会进入终端,但在 BurpSuite 中可以发现还有一个特别的请求如下
该请求的回显如下
很显然,点进去一看是个诈骗 flag,继续研究终端的 JavaScript 源码发现这个终端是个虚假的终端,但在其中还能发现一个 admin 账号,并且存在一个提示 Maybe you need BurpSuite. ,看来用 bp 这方向没错,那就开始爆破寻找 admin 账号的密码。

从图中已知输入的密码会进行 md5 加密,通过编写 Python 脚本进行爆破,我这里爆破用的是 rockyou.txt ,可以在 Kali 中找到。
通过将得到的密码手动再进行一次登录操作,就可以得到 flag 了。

[Week 2]include 0。0
[Week 2]Unserialize?
[Week 2]Upload again!
.htaccess 绕过、<? 绕过
<? 绕过[Week 2]R!!C!!E!!
[Week 2]游戏高手
进入 Console
运行玩游戏直接白给就可以得到 flag 了。
[Week 2]ez_sql
可以爆破数据库名字为 ctf ,表名 here_is_flag ,字段名 flag ,以及 flag。
[Week 3]Include 🍐
这题考察的是 LFI to RCE。
打开页面源代码如下
通过构造 payload 如下
可以发现 env 存在属性 FLAG 值为 fake{Check_register_argc_argv} ,通过查看属性 register_argc_argv 可以发现值为 On 。
https://cloud.tencent.com/developer/article/2204400
register_argc_argv 告诉PHP是否声明了 argv 和 argc 变量,这些变量可以是 POST 信息、也可以是 GET 信息,设置为 TRUE 时,能够通过 CLI SAPI 持续读取 argc 变量(传递给应用程序的若干参数)和 argv 变量(实际参数的数组),当我们使用 CLI SAPI 时,PHP变量 argc 和 argv 会自动填充为合适的值,并且可以在SERVER数组中找到这些值,比如 $_SERVER['argv'] 。
当构造 payload a=a+b+c 的时候,可以通过 var_dump($_SERVER['argv']); 输出 array(1){[0]=>string(3)"a=a" [1]=>string(1)"b" [2]=>string(1)"c"} ,即通过 + 作为分割符。
通过构造 payload 如下
可以得到回显如下
通过访问 1.php ,并构造 payload 如下即可得到 flag。
[Week 3]medium_sql
根据题目描述可以得出需要进行一些绕过,先查看那些关键词被过滤了。
过滤关键词:union、# ,发现回显只有 id not exists 还有 ID 正确时的输出,故尝试布尔注入,经测试 select、or、where、ascii 需要进行大小写绕过。
[Week 3]POP Gadget
源代码
POP链如下
构造 Payload 过程如下
[Week 3]GenShin
通过查看 Network - Headers 可以发现 Pop 属性值为 /secr3tofpop ,通过访问可以得到回显如下
通过构造 Payload 如下
可以得到回显如下
猜测应该是 Python 的 SSTI 注入,通过构造 Payload 如下
得到回显如下
尝试另外一种 Payload 如下
可以得到回显如下
故判断可以通过此方法继续进行 SSTI 注入,通过尝试各种关键字可以发现 单引号, init, lipsum, url_for, 反斜杠, popen 被过滤了。
通过构造 Payload 如下
可以输出所有的子类,被过滤的关键字可以通过 |attr() 进行绕过,由于直接使用 eval 无法使用 chr 函数,因此需要通过在里面多套一层 eval 来实现,由于已经存在单双引号了,所以就直接全用 chr 函数来实现注入吧,生成脚本如下
构造 Payload 如下
即可得到 flag。
[Week 3]R!!!C!!!E!!!
源代码如下
通过 exec 方法可以执行系统命令,因此这题也考的是 Linux 的命令绕过。
由于引号没有进行绕过,所以可以通过引号进行关键字的绕过,构造 Payload 过程如下
即可得到 flag。
[Week 3]OtenkiGirl
源代码中存在 hint.txt 内容如下
在 routes/info.js 可以发现该路由用于根据所给的 timestamp 输出该时间戳之后的所有内容。
在输入 timestamp 后,上述方法会将所输入的 timestamp 与 min_public_time 进行对比,其中 CONFIG.min_public_time 值不存在,DEFAULT_CONFIG.min_public_time 值为 2019-07-09 ,因此需要通过污染 min_public_time 属性才能使其输出 2019-07-09 之前的数据。
minTimestamp 首先会从 CONFIG 中获取 min_public_time ,获取失败后继续再从 DEFAULT_CONFIG 中获取,二者的原型对象都是 Object 。
在 routes/submit.js 中可以发现原型链污染点:
在上述代码中,data 的值是可控的,能够通过 POST 请求传入。DEFAULT 的原型对象也是 Object ,因此可以通过 submit 路由来进行污染攻击。
构造 Payload 如下
通过访问 /info/0 可以得到回显得到 flag 。
[Week 4]逃
这题考察的是 PHP 反序列化逃逸。
可控的属性为 key ,并且可以通过 waf 中的替换来实现反序列化逃逸的效果。
需要通过逃逸构造出 ";s:3:"cmd";s:4:"ls /";} 共 24 个字符,又因为 bad 替换成 good 后即增加一位,因此需要循环 24 次 bad 来进行逃逸。
构造 Payload 如下
即可输出跟目录的内容,同理构造 Payload 如下
即可得到 flag。
[Week 4]More Fast
GC 回收
在PHP中,使用
引用计数和回收周期来自动管理内存对象的,当一个变量被设置为NULL,或者没有任何指针指向 时,它就会被变成垃圾,被GC机制自动回收掉 那么这里的话我们就可以理解为,当一个对象没有被引用时,就会被GC机制回收,在回收的过程中,它会自动触发_destruct方法,而这也就是我们绕过抛出异常的关键点。https://xz.aliyun.com/t/11843
当 Unserialize 运行失败时,则会对运行中的已经创建出来的类进行销毁,提前触发 __destruct 函数。
触发 GC 机制的方法:
对象被 unset() 函数处理;
数组对象为 NULL 。
将第二个索引值设为空 ,就可以触发 GC 回收机制。
POP 链如下:
通过将第二个索引 i:1 修改为 i:0 即可出发 GC 回收机制,构造 Payload 如下
即可得到目录,再构造 Payload 如下即可得到 flag 。
[Week 4]midsql
经过尝试无论输入什么正确的都只会回显 你不会以为我真的会告诉你结果吧 ,猜测需要进行盲注,先通过构造不同的 Payload 判断哪些被进行了过滤需要进行绕过。
经过测试,空格、等号被绕过了,可以通过 /**/ 和 like 进行绕过。
可以得出数据库名为 ctf 。
可以得出表名为 items 。
可以得出字段名为 id,name,price 。
可以得出值 1lolita1000,520lolita's flag is flag{647190d8-7511-4386-b513-15440eb033be}1688 。
[Week 4]Flask Disk
根据题目已知框架为 Flask ,通过 admin manage 已知开启了 Debug 模式,在该模式下修改 app.py 会立即加载,通过 Upload 上传新的 app.py 。
上传后通过构造 Payload 获得 flag 。
[Week 4]PharOne
查看源代码可以发现提示 class.php ,通过查看可以得到源码如下。
结合标题可以通过 Phar 反序列化来写入 WebShell ,经过随机上传发现存在文件类型检测。
通过上传发现存在过滤 !preg_match("/__HALT_COMPILER/i",FILE_CONTENTS) ,可以通过 gzip 压缩进行绕过。
修改好后进行上传得到回显如下。
再通过构造 Payload 如下即可上传恶意 WebShell 。
此时通过构造 Payload 如下即可获得 flag 。
[Week 4]InjectMe
附件:Dockerfile
可以得出站点目录在 /app 中,通过查看图片 110.jpg 可以得到部分源码。

可以发现 ../ 被替换成了空,但是可以通过类似双写的方法进行绕过从而实现路径穿越,构造 Payload 如下。
可以得到 app.py 的源码如下。
通过分析 backdoor 函数可知需要进行 session 伪造来修改 session['user'] ,通过源码可知 secret_key 位于 config.py 中,通过上述相同方法获取,回显如下。
成功 decode 后,还需要进行绕过,编写一个 Python 脚本如下。
发现成功绕过并且获得 flag 文件名 y0U3_f14g_1s_h3re ,通过修改脚本如下即可得到 flag 。
Misc
[Week 1]CyberChef's Secret
CyberChef 一把梭,flag 如下
[Week 1]机密图片
通过 zteg 可以得到 flag。
[Week 1]流量!鲨鱼!
用 WireShark 打开后在过滤器中输入 http.response.code==200 可以得到所有成功访问的 http 请求。
通过一个一个看可以发现一个特殊的请求,如下图

可以发现这是请求 flag 并且将 flag 以 base64 编码的形态输出,通过将值进行 base64 解码即可得到 flag。
[Week 1]压缩包们
通过 binwalk 可以知道这是个 zip 压缩包,用 010 打开后发现缺少了文件头,需要进行修改,如下图。

修改后将后缀名修改为 zip ,解压得到 flag.zip 但打开压缩包会提示压缩包数据错误 - 该文件已损坏,再看看全局方式位标记是否有错。
通过 010 可以看到压缩源文件数据的全局方式位标记为 09 00 ,压缩源文件目录区的全局方式位标记 00 00 ,将压缩源文件目录区的全局方式位标记也修改为 09 00 再打开压缩包发现压缩包正常了。
在压缩包注释中存在一串 base64 编码内容如下
解码内容如下
说明密码应该为 6 个数字,用 ARCHPR 进行爆破即可得到密码为 232311 ,解压后即可得到 flag
[Week 1]空白格
使用 VSCode 打开可以发现这是由 换行符 、制表符 和 空格 组成的内容,通过百度发现是 whitespace 语言。
https://www.w3cschool.cn/tryrun/runcode?lang=whitespace
通过在线工具即可得到 flag 如下
[Week 1]隐秘的眼睛
使用 SilentEye 进行 Decode 即可得到 flag,密钥用的是默认的。

[Week 2]新建Word文档
http://hi.pcmoe.net/buddha.html
Crypto
[Week 1]brainfuck
密文如下
https://www.splitbrain.org/services/ook
[Week 1]Caesar's Secert
密文如下
https://www.dcode.fr/caesar-cipher
[Week 1]Fence
密文如下
栅栏密码,使用 CyberChef 可以解出来
[Week 1]Vigenère
密文如下
https://www.dcode.fr/vigenere-cipher
维吉尼亚密码解密,将密文丢进上述链接中,并设置
可以发现当 Key 前三位为 KFC 时存在 flag{ ,故尝试让 Key 就等于 KFC ,发现就是 flag。
[Week 1]babyencoding
密文如下
前两个用 CyberChef 可以一把梭,结果如下。
第三部分使用的是 UUEncode 编码
http://www.atoolbox.net/Tool.php?Id=731
解密后可以得到第三部分
[Week 1]Small d
https://github.com/pablocelayes/rsa-wiener-attack
题目中的 e 很大,说明 d 就会很小,通过 Wiener 攻击来解出 d。
[Week 1]babyrsa
题目描述:很容易分解的n
http://factordb.com/
题目描述中给出 hint ,通过 factordb 分解 n ,可以得到以下数组。
分解所得均为素数,通过计算出 phi 即可得出结果。
[Week 1]babyxor
知道明文前五位为 flag{ ,通过异或密文前五位来得出 key ,python 脚本如下
可以得出 key 为 \x8f ,通过遍历异或整串密文就可以得到 flag,脚本如下
[Week 1]Affine
通过将明文的每个字符与 key[0] 相乘再加上 key[1] 模 256即可得到密文,因此把过程倒过来即可得到 flag。
加密过程: $(key[0] * f + key[1])\ mod\ 256$
因为进行模运算,逆过来需要先求出逆元,通过求出逆元就可以逆推得出 flag。
解密过程: $key[0]^{-1} * (c-key[1])\ mod\ 256 $
根据已知明文 flag{ 爆破出逆元后通过解出的 key[0] 和 key[1] 代入求解即可,脚本如下
[Week 1]babyaes
由于 key 是由一段随机 16bit 的值复制两次拼接出来的值,并且给出了 $key\ \oplus\ iv\ \oplus\ 1$ 的值,因此可以先异或 1 得到 $key\ \oplus\ iv$ 的值。
由于此时的 key 为 32bit,而 iv 为 16bit,因此解出来的值得前半段就是 key 值,再通过将前半段异或后半段即可得到 iv 值,脚本如下
将解出的 key 和 iv 丢进 AES 中进行解密即可得到 flag,完整脚本如下
Reverse
[Week 1]easy_RE
用 ida64 打开可以得到前半部分 flag ,如下图

通过按 F5 反编译可以得到后半部分 flag ,如下图
故 flag 如下
[Week 1]咳
题目描述中存在壳,用查壳软件看看,如下图

需要使用 upx 去壳,如下
去壳完成后用 ida64 打开,通过反编译可以得到以下内容
并且可以找到
通过分析可得该函数将密文是由明文的每个字符转ascii值后加一得到的,要得到明文则将每个字符的ascii值减一即可。
[Week 1]Segments
百度 IDA的Segments窗口要怎么打开呢 ,可以得到结果 Shift+F7 ,将 Segments 窗口中的 name 拼凑起来就是 flag。
[Week 1]ELF
用 ida64 打开,通过反编译可以得到以下内容
通过分析可知密文是由明文的每个字符与 0x20 进行异或后加 16 并进行 base64 编码得到的,要得到明文则先进行 base64 解码后将所得的每个位减去 16 再和 0x20 异或即可,脚本如下。
[Week 1]Endian
用 ida64 打开,通过反编译可以得到以下内容
并且 array 数组内容如下
通过分析可知密文是通过将明文每四个为一组和 0x12345678 进行异或后得到的,但由于是低位存储,所以需要将每一组逆向过来的值进行反向即可得到 flag,脚本如下
[Week 1]AndroXor
https://apktool.org/
https://github.com/skylot/jadx
可以在上述引用中下载 apktool ,下载后使用 apktool 进行逆向
逆向后使用 jadx 打开进行 Java 反编译,在 com/chick.androxor/MainActivity 中存在以下内容
通过分析可得明文长度为 25,并且代码将循环遍历明文每一个字符,并使用每个字符与第二个参数字符串(happyx3)的对应位置字符进行异或运算,将得到的新字符添加到 cArr2 中,并且还会将cArr2中的字符与cArr中的对应位置字符进行比较。
因此要获得明文需要对应位置逐个异或运算推回来即可,先将 cArr 数字中的其他值都转化为 ascii 值形态,再进行异或运算,将运算结果转回字符即可,脚本如下
[Week 1]EzPE
下载附件后用查壳工具查发现无法查出来,用 010 打开和其他 exe 文件对比发现缺失了文件头部分,需将文件头部分进行修复。

用 ida64 打开,通过反编译可以得到以下内容
并且 data 数组内容如下
通过分析可得密文由将明文的每个字符与其下一个字符以及当前 index 值进行异或运算,并将结果赋值给当前字符,因此要逆向回来只需要倒转反过来即可,脚本如下
[Week 1]lazy_activtiy
https://github.com/liaojack8/AndroidKiller
使用 AndroidKiller 打开后搜索 flag 即可得到 flag。

Last updated