0x00 前言

大胆假设,小心求证。本篇文章会细致分析每个环节的逻辑,但是CTF有时不太需要逻辑,反而需要些灵感。所以,没有思路时,不妨胡乱比划一下。赛后,再好好分析灵感的逻辑。

0x01 题目

无源码,直接扫。存在flag.php,访问无果,0B的信息可见一斑,应该是障眼法。

看看题目:

image-20240803173149732

存在GET参数num,是表单参数。

0x02 分析

对题目的了解差不多了,我们只能从num入手。

我对两个方向思考:

  • 参数注入,也就是不玩游戏。
  • 利用游戏bug,也就是玩游戏。

参数注入

注入的原理无非就是:输入流从数据流侵略到控制流

想知道怎么注入,最好要知道流程代码。本题没有源码可以看,只能猜。但是这绝非SQL注入等,代码异常灵活,很难猜。所以先不考虑参数注入。

利用游戏bug

看来只能玩游戏了。先思考游戏逻辑:如果我输入的数字对上了,是不是就可以得到flag?不妨试一试。

众所周知,CTFer不会好好玩游戏。em,我刚开始真想好好玩。

碰撞

我认为这是好好玩游戏

我设想,服务器处理需要时间,如果我极快地发包,能不能竞争一下,脚本如下:

1
2
3
4
5
6
7
8
9
import requests
from time import sleep

url = 'http://challenge-1919adb7a8424f20.sandbox.ctfhub.com:10800/index.php?num='

for i in range(101):
r = requests.get(url+str(i))
print(r.text)
sleep(.00)

但是每次随机数都会变,采用多线程:

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
from concurrent.futures import ThreadPoolExecutor

url = 'http://challenge-6fda29f9e3d6c76d.sandbox.ctfhub.com:10800/index.php?num='

def fetch_random_number(i):
r = requests.get(url + str(i))
return r.text

with ThreadPoolExecutor(max_workers=10) as executor:
futures = [executor.submit(fetch_random_number, i) for i in range(101)]
for future in futures:
print(future.result())

还是一样,为什么呢?以后想想。

等于

如果只能玩一次成功,那么核心在于等于二字。num等于随机数,才能完成游戏。

不妨先想想这段代码会是什么样子,进行比较的代码会不会用一些特殊的函数,比如MD5?那我得先看看PHP特性了。

PHP特性

这是我的一个弯路。我在笔记里寻找类似的题目,但是始终没有符合的PHP特性。

类型转换

运气

其实不需要把代码想得那么复杂。当时我并没有思路,苦闷之际往输入框里输入一堆字符乱码,正好下一个随机数是0······flag出来了。

诚然,有运气成分,但是这点还是可以推理出来的。

推理

上面说过:

其实不需要把代码想得那么复杂。

代码的逻辑也可以是简单的等于

我们希望两个数的对比有一方是可控的,很明显随机数是不可控的,那么只能使num可控。要使num可控,不难联想到强制类型转换,不要因为这道题是数字对比就只会输入数字,CTFer不按常理出牌!

以上的推理并不难,慢慢消化即可。

既然num可控,那么只要不断循环即可碰到0,脚本如下:

1
2
3
4
5
6
7
8
9
import requests

url = 'http://challenge-1919adb7a8424f20.sandbox.ctfhub.com:10800/index.php?num='

while True:
r = requests.get(url+"manbaout")
if "ctfhub" in r.text:
print(r.text)
break

成功得到flagctfhub{e4be0f277101db19c0512c4a}

0x03 小结

整理一下逻辑树:

  • 游戏
    • 玩(利用bug)
      • PHP特性(无果)
      • 类型转换(成功)
    • 不玩(注入)(无果)

还有一些很重要的经验:

  • 开局先试试几个文件,后台dirsearch直接扫

  • 大胆猜代码,善于猜代码

  • CTFer不走寻常路,不接受一些暗示

  • 没思路时,不妨多胡乱试试