参加了ctfshow组织的菜鸡杯,自我感觉还是比较不错的,让自己学习了好多新东西。还有感谢师傅们的耐心解答。真的真的感谢。
这道题考察的是jsfuck
编码(参考),直接将编码放入浏览器的控制台进行解码。需要去掉最后的括号
这里解释一下原理:先说说jsfuck的格式:[]["filter"]["construtor"](CODE)()
差不多就是 [][乱七八糟](真实代码)()
所有我们可以直接取真实代码部分去输入控制台跑。
另一个方法就是去掉括号。我们可以看到上面照片的代码是if(1===2)但是1不可能等于2,所以说如果不去掉最后的括号就相当于执行这个函数也就不会执行。而如果去掉括号就是相当于定义函数表达式,会返回函数定义就可以看到函数的代码。如果代码是if(1!==2)就不需要修改直接出flag。
JavaScript函数用括号与没有括号区别
JavaScript函数定义
这道题让自己学习了好多。一个是crc校验循环冗余校验,另一个是斐波那契数列脚本读取文件。斐波那契数列
下载文件,里面是一张照片参考信息,可能是照片的长宽高隐写,这里可以使用crc暴力破解的脚本。参考链接
import zlib
import struct
filename = '1.png'
with open(filename, 'rb') as f:
all_b = f.read()
crc32key = int(all_b[29:33].hex(),16)
data = bytearray(all_b[12:29])
n = 4095 #理论上0xffffffff,但考虑到屏幕实际/cpu,0x0fff就差不多了
for w in range(n): #高和宽一起爆破
width = bytearray(struct.pack('>i', w)) #q为8字节,i为4字节,h为2字节
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print("宽为:",end="")
print(width)
print("高为:",end="")
print(height)
exit(0)
然后进行修改照片的高度
发现照片下面有一串文字
然后可以猜想是lsb隐写
根据提示可能是斐波那契数列来读取文件数据。保存数据为二进制。
直接使用师傅提供的payload,原理就是通过斐波那契数列来读取数据。
#coding=utf-8
def recur_fibo(n):
"""递归函数
输出斐波那契数列"""
if n <= 1:
return n
else:
return (recur_fibo(n - 1) + recur_fibo(n - 2))
# 获取用户输入
nterms = int(input("您要输出几项? "))
a = open('flag','rb').read()
#print(a)
s=''
# 检查输入的数字是否正确
if nterms <= 0:
print("输入正数")
else:
print("斐波那契数列:")
for i in range(nterms):
b=recur_fibo(i)
#print(b)
if(recur_fibo(i) == 0):
s+=chr(a[b])
else:
s+=chr(a[b-1])
print(s)
上源代码。
if(isset($_GET['url'])){
switch (strtolower(substr($_GET['url'], 0,4))) {
case 'file':
echo 'file protocol do not allow';
break;
case 'php:':
echo 'php protocol do not allow';
break;
case 'zlib':
echo 'zlib protocol do not allow';
break;
case 'ftp:':
echo 'zip protocol do not allow';
break;
case 'phar':
echo 'phar protocol do not allow';
break;
case 'ssh2':
echo 'ssh2 protocol do not allow';
break;
case 'data':
echo 'data protocol do not allow';
break;
case 'rar:':
echo 'rar protocol do not allow';
break;
case 'ogg:':
echo 'ogg protocol do not allow';
break;
case 'expe':
echo 'expe protocol do not allow';
break;
case 'http':
echo 'http protocol do not allow';
break;
case 'glob':
echo 'glob protocol do not allow';
break;
default:
if(!preg_match('/php|flag|zlib|ftp|phar|data|rar|ogg|expe|http|glob|ssh2|\(|\)|\[|\]|[0-9]|\,|\<|\>|\?|\/|\\\|\{|\[|\}|\]|\=|\+|\-|\_|\;|\:|\'|\"/i', $_GET['url'])){
eval("include ".$_GET['url'].";");
}else{
die('error');
}
break;
}
}else{
highlight_file(__FILE__);
}
这里自己应该是通过非预期进行的。
payload:?url=`cat *`
这道题和自己之前出的那个红包题nl有一点像红包题nl
正规解法好像是通过包含日志文件进行getshell的
从这道题自己学会了可以通过PHP中转进行连接mysql数据库。工具是adminer
网上有下载链接,直接下载通过蚁剑进行上传,链接数据库。
这里解释一下为什么自己使用navicat
链接不上,这是因为一般在做题目中我们使用的环境是docker创建的环境,每一个环境相当于一个虚拟环境虚拟沙箱。而docker仅会将指定的端口映射到服务器环境上。比如说这个题,docker里可用端口有80和3306,但是映射到服务器上的只有80,所以要想连到数据库就需要docker内部的程序才行。就是PHP程序。
所以adminer
刚刚就是通过PHP中转进行连接mysql数据库
下面就是这个题的解题过程
通过这里使用蚁剑链接,好像使用其他的工具链接不上。
根据题目提示我们需要获得后台邮箱内容就需要获得数据库。
查看数据库配置文件 用户名ctf 密码ctf 数据库ctf 端口3306。
之后我们就上传 adminer 源代码
然后进行访问url/adminer-4.7.7.php
进行连接
最后在kite_site_config表里面查看到flag
最后附上比赛成绩:师傅太强了
总结:
1.学习了crc校验和其暴破
2.学习了斐波那契数列和python的文件操作
3.学习了adminer工具进行PHP中转链接数据库
这次比赛还是学习了好多,感谢师傅们的耐心指导。其他的题目干不动了。过几天查看了wp在进行分析吧。