1. 题目背景与核心考点解析
这道来自GXYCTF 2019的"Ping Ping Ping"题目,是一个典型的Web安全挑战题。题目环境模拟了一个带有输入框的Web界面,用户可以通过输入IP地址或域名来执行ping操作。表面上看是个简单的网络工具,实则暗藏多个安全漏洞等待挖掘。
核心考点集中在以下几个方面:
- 命令注入漏洞(Command Injection)
- PHP的shell_exec函数安全风险
- 过滤绕过技巧
- 系统命令黑名单绕过
- 特殊字符的利用方式
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 初始分析与基础探测
当我第一次看到这个题目时,首先尝试了最基本的ping功能测试。在输入框输入"127.0.0.1"后,页面正常返回了ping命令的执行结果。这说明后端确实是通过系统ping命令来处理用户输入的。
接下来我尝试输入"127.0.0.1;ls",发现返回了错误信息,显示存在某种过滤机制。通过反复测试,发现以下几种情况:
- 分号(;)被过滤
- 与符号(&)被过滤
- 管道符(|)被过滤
- 反引号(`)被过滤
3. 过滤机制分析与绕过
3.1 空格过滤绕过
测试发现空格也被过滤了,这在命令注入中很常见。常见的绕过方式包括:
- 使用${IFS}替代空格
- 使用%09(Tab的URL编码)
- 使用重定向符号<>替代
在本题中,${IFS}被成功识别为空格分隔符。例如:
code复制127.0.0.1${IFS}&&cat${IFS}index.php
3.2 黑名单关键字绕过
题目设置了flag关键字过滤,直接尝试读取flag文件会失败。通过测试发现以下绕过方式有效:
- 使用通配符:fla*
- 使用变量拼接:a=fl;b=ag;cat $a$b.php
- 使用base64编码:
echo "ZmxhZy50eHQ=" | base64 -d
4. 完整利用链构建
4.1 第一步:确认文件位置
通过目录遍历确认flag文件位置:
code复制127.0.0.1${IFS}&&ls${IFS}/
发现flag文件位于根目录下,名为flag.txt。
4.2 第二步:绕过flag过滤
使用变量拼接法成功读取:
code复制127.0.0.1${IFS}&&a=fl;b=ag;cat${IFS}/$a$b.txt
4.3 第三步:获取完整flag
最终payload:
code复制127.0.0.1${IFS}&&cat${IFS}/fl''ag.txt
成功获取到flag内容。
5. 防御方案与安全建议
5.1 输入验证
- 严格限制输入字符,只允许IP地址格式
- 使用正则表达式验证:
/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
5.2 安全函数使用
避免直接使用shell_exec等危险函数,改用:
- escapeshellarg()对参数进行转义
- proc_open()配合适当的参数绑定
5.3 其他防护措施
- 设置严格的PHP安全配置
- 使用Docker等容器技术限制命令执行权限
- 部署WAF防护常见注入攻击
6. 题目延伸思考
这道题目虽然简单,但涵盖了Web安全中几个重要概念:
- 永远不要信任用户输入
- 黑名单过滤往往存在绕过可能
- 系统命令执行需要格外小心
- 防御需要多层防护,不能依赖单一机制
在实际开发中,类似的功能应该考虑使用专门的网络库来实现ping功能,而不是直接调用系统命令。
