ctfshow写麻了写写新生赛,学习并记录。
web
喵喵喵´•ﻌ•`
简单的命令执行,先ls一下看看flag在哪
发现目标,对他使用喵喵喵(cat)!!!
md5绕过欸
话不多说,直接审计一下代码
第一层if
是否存在get上传的name和name2参数,和post上传的password和password2参数
存在的话就进入下一层循环(中间都是些赋值啥的东西,不用管)
不存在输出‘没看到参数啊’
第二层if
要使name和password不相等,还要确保他们的md5值弱相等
对了就下一层
不对就输出‘错啦错啦’
第三层if
使name2与password2相等,还要确保他们的md5值强相等
对了就输出flag
不对就输出‘再看看啊,马上就绕过勒’
就这么个意思,其实也很简单,md5绕过嘛
MD5绕过知识点
md5弱类型有两种绕过方法
1.数组绕过
md5不能加密数组,所以会返回null,当然强类型也可以通过这个方法绕过
2.科学计数法绕过
当md5加密过后的值为开头为0e时,php会当成0,从而绕过
md5强类型有也有两种绕过方法
1.数组绕过
2.md5碰撞
在网上找找工具,可以真的碰撞出两个不同的字符串,他们的md5值相等。
这里题目很简单,没有约束你使用数组,那么很简单,构造一下pylaod
难一点的题目会加一层循环,不让你传字符串。
HTTP 是什么呀
这道题为了了解一下这么些东西是啥
get,post就不多说
不过注意一下%要用%25来表示
cookie,user agent,Referer也可以用HackBar上传
最后一个ip需要打开bp抓包
在数据包里加上
Client-IP: 127.0.0.1
Forwarded-For: 127.0.0.1
Forwarded: 127.0.0.1
Forwarded-For: localhost
X-Forwarded-For-Original:127.0.0.1
X-Forwarded-For-Original: localhost
X-Forwarded-For: 127.0.0.1
X-Forwarded-For: localhost
X-Forwarded-Server: 127.0.0.1
X-Forwarded-Server: localhost
X-Forwarded: 127.0.0.1
X-Host:127.0.0.1
X-Host: localhost
X-HTTP-Host-Override:127.0.0.1
X-Originating-IP:127.0.0.1
X-Real-IP:127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Remote-Addr: localhost
X-Remote-IP: 127.0.0.1
这些都是表示本地ip的,咱也不知道哪个会被绕过,就直接一起梭哈
最后base64一下即可
A Dark Room
小游戏,看源码就行
Upload
文件上传类题目,简单来说就是依靠一些绕过手法,上传一个.php文件,里面有我们提前写好的php代码,然后在网页里读取这个文件,就可以进行文件执行了。
这里没有过滤,直接上传成功了
接下来需要找到路径,也很明显,就是uploads/.php
这里可以post进行命令执行,也可以蚁剑进行链接(密码就是接收post的值,这里是a)
根目录下找到flag
之后会写文件上传专题,会详细讲讲关于文件上传的绕过姿势
Aura 酱的礼物
第一关是读文件,需要读到Aura,这里看到file_get_contents()函数,这个可以通过data伪协议进行文件包含。
可以看到过关了,第二关是需要让challenge的值为http://jasmineaura.github.io
三关要在http://jasmineaura.github.io
里读到已经收到Kengwang的礼物啦
第这里可以通过@隔断,使@前面的http://jasmineaura.github.io
变成用户名。
然后接上127.0.0.1,就可以利用当前的这个页面来确保有“已经收到Kengwang的礼物啦”
最后就是一个include,对他使用伪协议把
这里data协议好像不行,也不知道后端过滤了啥,这里就用filter了
web小结
week1的题目都挺简单,要打好base。
Misc
Base
base32(都试试)一下
QmFzZUNURnt3ZTFjMG1lX3RvX2I0c2VjdGZ9
根本进不去啊!
看起来是DNS解析域名的题目,去阿里云看看(解析不出来的话可以在高级配置里选上txt的选项)
阿里云网站运维检测平台给个链接
倒计时? 海报!
这道题还挺没意思的,flag分别藏在十张海报里,通过photoshop改色彩来看到水印,即费眼又耗时。后面出题组也直接给了flag,这里就不多讲。
海上遇到了鲨鱼
附件是.pcapng文件,我们用wireshark打开
里面有很多条流量,在网页中发送请求报文,接受回应报文的时候被截取的流量。
先搜搜flag,很容易就可以找到flag.php,flag.jpg的字样
可以从导出看看是什么内容
也可以看看http回应了啥
可以找到反写的flag,网上找个工具逆向了就行
正着看还是反着看?
附件用010打开
观察后发现好像是反过来的?
FFD8FFE0是jpg的文件头
看来需要想办法把这个反向输出一下。
这边写一个脚本,倒数两位两位输出就行
不想写脚本也可以去cyberchef文本逆向一下
然后得到的东西新建一个十六进制文本放进去(改成.jpg文件)
得到了图片,接下来就是图片隐写环节。
看看010里有什么东西
发现了PK和flag.txt文件隐写没跑了
binwalk或foremost分离一下
人生苦短,我用Python
import base64
import hashlib
def abort(id):
print('You failed test %d. Try again!' % id)
exit(1)
print('Hello, Python!')
flag = input('Enter your flag: ')
if len(flag) != 38:
abort(1)
if not flag.startswith('BaseCTF{'):
abort(2)
if flag.find('Mp') != 10:
abort(3)
if flag[-3:] * 8 != '3x}3x}3x}3x}3x}3x}3x}3x}':
abort(4)
if ord(flag[-1]) != 125:
abort(5)
if flag.count('_') // 2 != 2:
abort(6)
if list(map(len, flag.split('_'))) != [14, 2, 6, 4, 8]:
abort(7)
if flag[12:32:4] != 'lsT_n':
abort(8)
if '😺'.join([c.upper() for c in flag[:9]]) != 'B😺A😺S😺E😺C😺T😺F😺{😺S':
abort(9)
if not flag[-11].isnumeric() or int(flag[-11]) ** 5 != 1024:
abort(10)
if base64.b64encode(flag[-7:-3].encode()) != b'MG1QbA==':
abort(11)
if flag[::-7].encode().hex() != '7d4372733173':
abort(12)
if set(flag[12::11]) != {'l', 'r'}:
abort(13)
if flag[21:27].encode() != bytes([116, 51, 114, 95, 84, 104]):
abort(14)
if sum(ord(c) * 2024_08_15 ** idx for idx, c in enumerate(flag[17:20])) != 41378751114180610:
abort(15)
if not all([flag[0].isalpha(), flag[8].islower(), flag[13].isdigit()]):
abort(16)
if '{whats} {up}'.format(whats=flag[13], up=flag[15]).replace('3', 'bro') != 'bro 1':
abort(17)
if hashlib.sha1(flag.encode()).hexdigest() != 'e40075055f34f88993f47efb3429bd0e44a7f479':
abort(18)
print('🎉 You are right!')
import this
给了很多if判断,只要满足所有的条件,最后得出的就是flag
这边借鉴一下官方的wp
-
检查flag长度是否为38
-
检查flag是否以
BaseCTF{
开头 -
检查flag的下标为10和11的字符是否为
Mp
(下标是从0开始的) -
检查flag的最后三个字符是否为
3x}
并重复8次
至此可得BaseCTF{**Mp***********************3x}
-
检查flag的最后一个字符的ASCII值是否为125(即
}
) -
检查flag中
_
字符的数量是否为4 -
检查flag按
_
分割后的每部分长度是否为[14, 2, 6, 4, 8] -
检查flag的第13到32个字符,每隔4个字符是否为
lsT_n
(Python用左闭右开区间)
至此可得BaseCTF{**Mpl*_*s_**T***_***n_*****3x}
-
检查flag前9个字符的大写形式用
😺
连接是否为B😺A😺S😺E😺C😺T😺F😺{😺S
-
检查flag倒数第11个字符是否为数字且其五次方是否为1024(如果不是数字,整个表达式一定为假,就不会转为整数计算了,这叫“逻辑短路”;Python中
**
是乘方,^
是异或) -
检查flag倒数第7到第3个字符的Base64编码是否为
MG1QbA==
至此可得BaseCTF{**Mpl*_*s_**T***_**4n_*0mPl3x}
-
检查flag每隔7个字符倒序后的十六进制编码是否为
7d4372733173
(开个新文件试一下flag = 'abcdefghijklmnopq'; print(flag[::-7])
就知道是最后一个字符,倒数第8个字符,……)
至此可得BaseCTF{*1Mpl*_*s_**T**r_**4n_C0mPl3x}
-
检查flag从第13个字符开始每隔11个字符是否为
l
或r
-
检查flag的第22到27个字符的ASCII编码是否为[116, 51, 114, 95, 84, 104](Python3中字符串str(可以用Unicode表示的)和字节串bytes(一列取值是0~255的整数)是不一样的,但可以转化)
至此可得BaseCTF{*1Mpl*_*s_**Tt3r_Th4n_C0mPl3x}
-
检查flag的第18个字符的ASCII值乘以20240815的0次方,第19个字符的ASCII值乘以20240815的1次方,第20个字符的ASCII值乘以20240815的2次方,加起来是否为41378751114180610(Python很适合大数运算)(虽然你可以爆破,但是这里可以写逆运算的,用除以20240815的商和余数)
至此可得BaseCTF{*1Mpl*_*s_BeTt3r_Th4n_C0mPl3x}
-
检查flag的第1个字符是否为字母,第9个字符是否为小写字母,第14个字符是否为数字(结合上面
😺
那步) -
检查
{whats} {up}
格式化后的字符串是否为bro 1
至此可得BaseCTF{s1Mpl3_1s_BeTt3r_Th4n_C0mPl3x}
-
检查flag的SHA1哈希值是否为
e40075055f34f88993f47efb3429bd0e44a7f479
你也喜欢圣物吗
打开附件发现一个png一个压缩包,压缩包里面需要密码
png丢进随波逐流里看看
这个是lsb隐写,发现key
打开之后里面的压缩包it is fake.zip也需要key
看看010,既然是fake的zip,那么试试伪加密
但是都是0900,不过还是试试把两个0900都改掉
之后用bandzip解压打开,这里不是bandzip等软件的话好像还要改一下压缩方式的字段,STORED (0) 表示仅存储,我们改回 DEFLATE (8) 表示已压缩,这样就能正常解压了
然后两次base64解码
捂住X只耳
题目是个音频,标题是捂住什么什么耳朵,那么肯定跟什么波形图无关。
先放进Audacity
捂住x只耳,左耳右耳,也许是左右声道不同
我们先把音频拆成左右耳的
然后选其中一个轨道调成反向
然后全选混音
明显看到有断点,说明方向对了,
把音量调大一点试试
这不就是摩斯嘛,手动记录一下解码即可
答案为BaseCTF{FOLLOWYOURHEART}
Misc小结
week1里Misc题量和难度都比web高一些,不过也还都是简单题,学习并记录。