分类:[技术分析]
标签: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 结果
大家多多尝试一下有没有更好的方法吧!
互动环节
- 各位大佬们是否有更优的实现方式?欢迎分享代码
- 评论区聊聊吧~