【BUUCTF系列】[GXYCTF2019]Ping Ping Ping 1
本文仅用于技术研究,禁止用于非法用途。
Author:枷锁
文章目录
- 初步观察
- 漏洞特征分析
- 后续验证建议
- 关键限制条件
- 过滤规则(黑名单)
- 漏洞利用思路
- 绕过技巧(实战PoC)
题目分析与初步判断
初步观察
- 功能识别:
- 打开靶机网址后,显示一个
/?ip=
像一个get的参数访问 - 我们再查看网页源代码也未发现明显提示信息
源码如下
- 基本测试:
- 结合题目名称,我们在url上拼接是这个参数输入
?ip=127.0.0.1
进行PING测试 - 成功收到PING响应结果,确认基础功能正常运作
漏洞特征分析
- 技术实现推测:
- 根据返回结果的特征和题目的名称,推测后端可能使用了命令执行函数
- 这些函数能够直接调用系统shell执行命令
- 漏洞类型判断:
- 基于"用户输入直接拼接系统命令"的典型模式
- 结合题目提示和初步实验结果
- 初步判定存在命令注入漏洞(Command Injection)
- 验证方向:
- 需要进一步测试是否存在命令分隔符注入可能
- 验证是否能够执行非PING相关系统命令
后续验证建议
- 基础注入测试:
-
输入
127.0.0.1
有正常ping返回 -
尝试添加命令分隔符如
127.0.0.1; ls
测试响应
发现没有返回有用结果 -
再次尝试尝试添加命令分隔符如
127.0.0.1|ls
测试响应
我们发现了两个文件夹flag.php,index.php,有 flag 我们尝试访问 flag。
127.0.0.1; tac /flag
我们发现根据这里的英文提示,本题它过滤了一些符号
所以我们换一种 空格的过滤方法:
?ip=127.0.0.1|cat$IFS$1flag.php
这里我们发现了不对劲,提示的中文翻译是我们的flag文件被过滤掉了。
我们回头看看
这里有两个文件,我们尝试访问这个index的文件,看能不能找到什么线索
?ip=127.0.0.1|cat$IFS$1index.php
好的,这里的源码如果我们看不懂,就直接把他丢给ai,让ai辅助我们分析
如果输入的 IP 存在(非空),代码会先检查它:
• 若包含 空格 → 返回 fxck your space;
• 若包含 bash → 返回 fxck your bash;
• 还会过滤其他特殊字符和敏感词(如 flag),通过后才执行 ping 命令。
漏洞背景
- 目标是一个PHP脚本,接收用户通过
GET
参数ip
传入的值(例如?ip=127.0.0.1
)。 - 脚本会对
ip
参数进行黑名单过滤(检测特殊符号、空格、bash
、flag
等),但过滤逻辑存在缺陷。 - 最终会执行命令:
即:将用户输入的shell_exec("ping -c 4 ".$ip);
ip
值直接拼接到ping -c 4
命令后面执行(命令注入漏洞)。
关键限制条件
- 只能输入4个字符? ❌(误解澄清)
- 实际上,
ip
参数可以输入任意长度的内容(如127.0.0.1;恶意命令
),但系统会先进行黑名单过滤(检测特殊符号、空格、bash
、flag
等)。 - 如果输入包含被过滤的内容(如空格、
flag
),会直接返回错误(如fxck your space
)。 - 真正的限制是:必须绕过所有过滤规则,才能注入恶意命令。
过滤规则(黑名单)
系统会对ip
参数依次检测以下内容,任意一项匹配则终止执行:
- 特殊符号(
&
,|
,>
,<
,'
,"
,(
,)
,[
,]
,{
,}
, ASCII控制字符等)→ 返回fxck your symbol
。 - 空格(
fxck your space
。 bash
关键词 → 返回fxck your bash
。flag
关键词(正则匹配f.*l.*a.*g
,如fl ag
、f.l.a.g
)→ 返回fxck your flag
。
漏洞利用思路
由于shell_exec("ping -c 4 ".$ip)
直接拼接用户输入,如果输入未被过滤,可以注入额外命令(如;cat flag.php
)。
但直接输入flag
或空格会被拦截,因此需要巧妙构造Payload绕过所有过滤规则。
绕过技巧(实战PoC)
目标:执行cat flag.php
,但需绕过:
- 空格 → 用
$IFS$1
(Shell内部字段分隔符,等效于空格)代替。 flag
关键词 → 将flag
拆分成变量(如a=g;fla$a.php
→ 实际拼成flag.php
)。- 特殊符号 → 避免使用
&
,|
,>
,<
等。
最终Payload:
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
访问后查看源码
即可获得我们的flag
构造原理详解:
1. 命令分隔绕过:
- 使用分号(;)分隔多个命令
- 第一个命令: 127.0.0.1 (ping正常执行)
- 第二个命令: a=g (定义变量a的值为"g")
- 第三个命令: cat$IFS1fla1fla1flaa.php (读取flag.php文件)
2. 空格绕过:
- 使用$IFS代替空格
- $IFS是bash中的内部字段分隔符变量,默认值包含空格
3. 关键字绕过:
- 将"flag"拆分为"fla" + 变量$a
- 避免在输入中直接出现连续的"f"“l”“a”“g”
- 实际执行时: fla$a.php => flag.php
4. 特殊字符绕过:
- 避免使用被过滤的字符(& / ? * < > ’ " \ ( ) [ ] { }等)
- 使用合法的bash语法构造命令
执行流程:
ping -c 4 127.0.0.1;a=g;cat$IFS1fla1fla1flaa.php
=> ping -c 4 127.0.0.1 (正常ping命令)
=> a=g (bash变量赋值)
=> cat $IFS 1fla1 fla1flaa.php (实际为cat flag.php)
宇宙级免责声明
🚨 重要声明:本文仅供合法授权下的安全研究与教育目的!🚨
1.合法授权:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果(包括但不限于刑事指控、民事诉讼及巨额赔偿)。
2.道德约束:黑客精神的核心是建设而非破坏。请确保你的行为符合道德规范,仅用于提升系统安全性,而非恶意入侵、数据窃取或服务干扰。
3.风险自担:使用本文所述工具和技术时,你需自行承担所有风险。作者及发布平台不对任何滥用、误用或由此引发的法律问题负责。
4.合规性:确保你的测试符合当地及国际法律法规(如《计算机欺诈与滥用法案》(CFAA)、《通用数据保护条例》(GDPR)等)。必要时,咨询法律顾问。
5.最小影响原则:测试过程中应避免对目标系统造成破坏或服务中断。建议在非生产环境或沙箱环境中进行演练。
6.数据保护:不得访问、存储或泄露任何未授权的用户数据。如意外获取敏感信息,应立即报告相关方并删除。
7.免责范围:作者、平台及关联方明确拒绝承担因读者行为导致的任何直接、间接、附带或惩罚性损害责任。
🔐 安全研究的正确姿势:
✅ 先授权,再测试
✅ 只针对自己拥有或有权测试的系统
✅ 发现漏洞后,及时报告并协助修复
✅ 尊重隐私,不越界
⚠️ 警告:技术无善恶,人心有黑白。请明智选择你的道路。
希望这个教程对你有所帮助!记得负责任地进行安全测试。