分类:[技术分析]
标签:CTF SHOW 刷题 新手
阅读时长:约 [2] 分钟
引言(前言)
日常CTF 做题记录,日常做题分享,希望能积累更多的知识!!!
CTFSHOW WEB142
1.1 题目及分析
highlight_file(__FILE__);
if(isset($_GET['v1'])){
$v1 = (String)$_GET['v1'];
if(is_numeric($v1)){
$d = (int)($v1 * 0x36d * 0x36d * 0x36d * 0x36d * 0x36d);
sleep($d);
echo file_get_contents("flag.php");
}
}- 题目分析
- 此题主要是代码审计,完全没有难度,所以算是摸鱼
1.2 思路
这段PHP代码的主要功能是根据GET参数v1的取值来决定是否输出flag.php的内容,具体分析如下:
代码逻辑拆解
highlight_file(__FILE__);作用是在页面上显示当前PHP文件的源代码,通常用于调试或展示代码本身。- 核心逻辑:
- 检查是否存在GET参数
v1(即通过URL传入的?v1=xxx)。 - 将
v1转换为字符串后,用is_numeric()判断其是否为数字(或数字字符串)。 - 若
v1是数字,计算$d的值:(int)($v1 * 0x36d^5)(0x36d是十六进制,对应十进制877,即877的5次方)。 - 执行
sleep($d):程序暂停$d秒。 - 暂停结束后,输出
flag.php的内容(通过file_get_contents("flag.php"))。
关键问题与利用方式
0x36d^5(877的5次方)是一个极大的数(约5.19×10¹⁴)。如果v1是正数,$d会非常大,导致sleep($d)的等待时间极长(例如v1=0.000000000001时,$d≈519,需要等待8分钟以上),几乎无法实际获取flag.php的内容。
当v1=0时,$v1 * 0x36d^5 = 0,因此$d=0,此时sleep(0)几乎不等待,程序会立即输出flag.php的内容。
利用方法
通过URL传入v1=0即可绕过漫长的等待,直接获取flag,例如访问:
http://目标地址/文件名.php?v1=0
1.3 结果
大家多多尝试一下有没有更好的方法吧!
互动环节
- 各位大佬们是否有更优的实现方式?欢迎分享代码
- 评论区聊聊吧~










