尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

[buuctf]cat flag题解

[buuctf]cat flag题解 [BUUCTF] cat flag 题解1. 题目源码题目给出的 PHP 源代码如下?phpif(isset($_GET[cmd])){$cmd$_GET[cmd];if(!preg_match(/flag/i,$cmd)){$cmdescapeshellarg($cmd);system(cat .$cmd);}}else{highlight_file(__FILE__);}?逻辑分析程序通过GET方式接收cmd参数。使用正则preg_match(/flag/i, $cmd)对字符串中的flag关键字不区分大小写进行过滤。若未触发正则拦截则对$cmd调用escapeshellarg()函数进行转义最后拼接至system(cat . $cmd)并执行命令。2. 漏洞原理与延伸1.escapeshellarg()剥离非法 UTF-8 字符绕过escapeshellarg()的设计初衷是为字符串两端包裹单引号并转义已有的单引号使得整个字符串作为单一安全参数传递给 Shell防止命令注入。但是在PHP 7.3某些具体版本中escapeshellarg()在处理包含非法 UTF-8 字符字节例如%80/\x80的字符串时会将该非法字节直接从结果中剥离删除。绕过正则传入fl%80ag时原始输入字符串为fl\x80ag不匹配正则表达式flag从而顺利绕过preg_match(/flag/i, $cmd)黑名单检测。执行命令经过escapeshellarg()处理后0x80字节被系统剔除处理后的字符串恢复为flag最终拼接为cat flag并成功执行。2. 知识点拓展escapeshellarg()escapeshellcmd()经典组合漏洞在 CTF 题目中经常会见到将这两个转义函数组合使用的场景例如?phpif(isset($_SERVER[HTTP_X_FORWARDED_FOR])){$_SERVER[REMOTE_ADDR]$_SERVER[HTTP_X_FORWARDED_FOR];}if(!isset($_GET[host])){highlight_file(__FILE__);}else{$host$_GET[host];$hostescapeshellarg($host);$hostescapeshellcmd($host);$sandboxmd5(glzjin.$_SERVER[REMOTE_ADDR]);echoyou are in sandbox .$sandbox;mkdir($sandbox);chdir($sandbox);echosystem(nmap -T5 -sT -Pn --host-timeout 2 -F .$host);}产生机制escapeshellarg()率先把$host转义并用单引号包裹成单一参数。紧接着对处理结果调用escapeshellcmd()后者会再次转义字符串中的 Shell 元字符如 | ; \及未配对的单引号。这破坏了原本建立的单引号边界。危害后果攻击者可利用单引号配对错位拆分参数形成参数注入Argument Injection例如向nmap注入追加参数以实现任意文件写入/命令执行而非直接通过;进行简单的指令拼接。3. 解题过程Step 1. 尝试绕过限制并读取 flag构造包含非法 UTF-8 字节的 Payload 绕过黑名单限制?cmd/fl%80ag页面返回提示我们并没有完整拿到 flag。Step 2. 抓包分析 HTTP 响应头抓包查看完整的 HTTP 响应包数据从响应头中可注意到Server: openresty。这表明服务器使用了 OpenResty/Nginx 架构提示我们可以尝试读取 Nginx 的日志文件来获取更多线索。Step 3. 读取日志定位真实 Flag 文件利用cmd参数读取默认的 Nginx 访问日志文件access.log?cmd/var/log/nginx/access.log在日志记录中成功找到真实的 flag 文件名this_is_final_flag_e2a457126032b42d.php。Step 4. 读取真实 Flag 文件源码再次结合%80字符绕过黑名单读取目标 PHP 文件?cmdthis_is_final_fl%80ag_e2a457126032b42d.php由于目标文件是.php文件内容会被 PHP 解析执行或被浏览器当作 HTML 隐藏按下Ctrl U查看网页源代码CTF2{f02ea6b9-aa0b-442e-907b-213b82b99107}成功获取最终 Flag
返回列表