ISCTF2024 Web做题日记喵
[TOC]
1.0 1z_php
题目描述:一句话木马都有了,还要什么自行车
难度:签到
1 |
|
做题步骤:
1)遇到这道题,首先肯定要去找falg到底储存在哪里,所以利用system($call);先POST一个J=ls以及J=ls /
(其实已经找到flag了,但是Gloria眼瞎没看见QAQ,这里顺便讲一讲其他查找flag的方法,方便以后用到)
2)所以我们改用:
J=ls -al/➡查找根目录中的所有文件
J=find / -name "flag*"➡查找所有跟flag相关的文件
J=env或者J=printenv➡flag很可能不是文件而且藏在环境变量里
3)然后问了ai才知道flag有时候也会写成f14g➡_➡(Orz我孤陋寡闻了)
这里只贴使用J=ls /找到f14g的图了,其他的不贴了…(有点小懒喵…♪(´▽`)
4)下面只需要绕过一下黑名单就可以得到flag
●sort 命令通常用来排序文本,但也能直接输出文件内容:J=sort /f14g
●利用 \ 绕过 preg_match 对 cat 的过滤:J=c\at /f14g
●Base64 读取:J=base64 /f14g
●J=uniq /f14g
●J=rev /f14g(rev 读出来的内容是倒着的)
成功( ̄︶ ̄)↗
2.0 25时晓山瑞希生日会
题目描述:
瑞希是神山高校一年级生,《25时,在Nightcord。》的MV师。马上要到生日了。生日会邀请了很多人来参加。
此题在9.15就出好了,谁料会发生如此变故,sega我恨你;w;
难度:签到
做题步骤:
1)哦➡_➡…好明显的提示,没什么好说的,bp抓包修改User-Agent为Project Sekai
2)提示本地,那更没啥好说的了,在请求头添加X-Forwarded-For为127.0.0.1
3)第三步,提示时间,中,那不就是在请求头中添加Date嘛
因为题目说了是瑞希的生日,所以这道题结合了 Project Sekai (PJSK) 的游戏背景知识(真是为难死我了
角色: 晓山瑞希 (Akiyama Mizuki)
关键线索: 生日会
瑞希的生日: 8月27日
(这里date不太关注年份,所以先填了一个2023)
发现它提示太早了,再联系题目说是今年的生日会,所以改为了2025,并且提示是5点开始,所以把00:00:00改为了05:00:00
结果,又提示已经结束了➡_➡,好嘛,2025不行,2023也不行,所以尝试了一下2024,得到flag(还真让我给蒙出来了(/ω\)
3.0 ezrce
题目描述:命令执行(哦吼~最近刚学,拿你试试手<( ̄︶ ̄)↗[GO!])
难度:简单
1 |
|
你看你 又ban
步骤:
1)正常流程,先找flag藏在哪( ̄︶ ̄)↗ (不知道为什么用这些的,请看命令执行的做题日记喵~
ls被ban了,根本不慌,用\直接拿下
空格被ban了,根本不慌,%09轻松拿下
2)这还有啥好说的,cat被ban了?谁家好人用cat啊?直接上tac
不让我写flag?谁怕你啊?fl*直接拿下你好吧
4.0 小蓝鲨的冒险
题目描述:php特性,你能让小蓝鲨通关吗?
难度:简单
1 |
|
看着倒是挺复杂的,其实➡_➡…(抬手不是抱歉)
步骤:
1)第一关
1 | $a = "isctf2024"; |
来看这一段,再结合下面2),我们需要修改 $a 的值来通过下一关的校验
2)第二关
$a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')一眼就看到你了➡_➡,这是一个PHP弱比较(MD5弱比较):
条件1:数组$a中的第一个元素($a[0])的值不等于字符串’QNKCDZO’
条件2:但是他们的MD5值必须相等
原理:md5('QNKCDZO')的结果是0e830400...,在php弱比较中,以0e开头并且后面跟的全是数字的字符串会被当作科学计数法0处理
利用:所以,我们只需要找一个MD5也是0e开头,并且后面全是数字的字符串就可以,常用的碰撞字符串是240610708
所以,我们就构造?b=a[0]=240610708
3)第三关
再往下看,POST进了一个num参数,并且num不能包含字母a到z而且不能等于2024
看我们发现了什么?intval($num,0) == 2024
老熟人了(。・∀・)ノ゙嗨
intval($num, 0) == 2024 表示:
●将 $num 转换为整数,自动识别其进制
●使用弱类型比较判断是否等于 2024
1 | // 十进制 |
十进制、二进制、十六进制都被ban所以我们直接选八进制
构造POST参数:num=03750
4)第四关
1 | if (isset($_GET['which'])){ |
我们来看这里,我们需要执行 require_once $which.'.php' 来包含 flag 文件(通常文件名是 flag.php)
但是如果我们传which=1,它只会包含 1.php(但1.php根本不存在)
这看上去好像无解,但是➡
PHP 的 switch 使用的是 弱比较 (==)
PHP 7 及以下版本中,字符串 "flag" == 数字 0 是成立的(True)
所以,我们传入which=flag
这样就会匹配到case 0,而且,case 0后面没有break,程序会继续执行(穿透)下去,进入 case 1 和 case 2 的代码块,进而执行我们需要执行的 require_once $which.'.php',得到flag
最终的payload:
GET参数:?b=a[0]=240610708&which=flag
POST参数:num=03750
先做到这…太晚了喵…各位晚安喵~(o-ωq)).oO 困
Leave a comment