一道ctfhub题引起的思考
0x00 前言
大胆假设,小心求证。本篇文章会细致分析每个环节的逻辑,但是CTF
有时不太需要逻辑,反而需要些灵感。所以,没有思路时,不妨胡乱比划一下。赛后,再好好分析灵感的逻辑。
0x01 题目
无源码,直接扫。存在flag.php
,访问无果,0B
的信息可见一斑,应该是障眼法。
看看题目:
存在GET
参数num
,是表单参数。
0x02 分析
对题目的了解差不多了,我们只能从num入手。
我对两个方向思考:
- 参数注入,也就是不玩游戏。
- 利用游戏bug,也就是玩游戏。
参数注入
注入的原理无非就是:输入流从数据流侵略到控制流。
想知道怎么注入,最好要知道流程代码。本题没有源码可以看,只能猜。但是这绝非SQL
注入等,代码异常灵活,很难猜。所以先不考虑参数注入。
利用游戏bug
看来只能玩游戏了。先思考游戏逻辑:如果我输入的数字对上了,是不是就可以得到flag
?不妨试一试。
众所周知,CTFer
不会好好玩游戏。em,我刚开始真想好好玩。
碰撞
我认为这是好好玩游戏
我设想,服务器处理需要时间,如果我极快地发包,能不能竞争一下,脚本如下:
1 | import requests |
但是每次随机数都会变,采用多线程:
1 | import requests |
还是一样,为什么呢?以后想想。
等于
如果只能玩一次成功,那么核心在于等于二字。num
等于随机数,才能完成游戏。
不妨先想想这段代码会是什么样子,进行比较的代码会不会用一些特殊的函数,比如MD5
?那我得先看看PHP
特性了。
PHP特性
这是我的一个弯路。我在笔记里寻找类似的题目,但是始终没有符合的PHP
特性。
类型转换
运气
其实不需要把代码先想得那么复杂。当时我并没有思路,苦闷之际往输入框里输入一堆字符乱码,正好下一个随机数是0······flag出来了。
诚然,有运气成分,但是这点还是可以推理出来的。
推理
上面说过:
其实不需要把代码先想得那么复杂。
代码的逻辑也可以是简单的等于。
我们希望两个数的对比有一方是可控的,很明显随机数是不可控的,那么只能使num
可控。要使num
可控,不难联想到强制类型转换,不要因为这道题是数字对比就只会输入数字,CTFer不按常理出牌!
以上的推理并不难,慢慢消化即可。
既然num
可控,那么只要不断循环即可碰到0,脚本如下:
1 | import requests |
成功得到flag:ctfhub{e4be0f277101db19c0512c4a}
0x03 小结
整理一下逻辑树:
- 游戏
- 玩(利用bug)
PHP
特性(无果)- 类型转换(成功)
- 不玩(注入)(无果)
- 玩(利用bug)
还有一些很重要的经验:
开局先试试几个文件,后台
dirsearch
直接扫大胆猜代码,善于猜代码
CTFer
不走寻常路,不接受一些暗示没思路时,不妨多胡乱试试