webshell免杀之浅谈phpwebshell中如何控制传入内容
真爱和自由 WEB安全 202浏览 · 2025-03-26 17:48

webshell免杀之浅谈phpwebshell中如何控制传入内容

前言

对webshell的研究还是有一个星期了,来总结一下我们应该如何控制外来的参数内容

毕竟webshell需要任意命令执行的话,不得不实现任意参数的传入,下面是我自己总结的一些方法,重点是研究如何出传入参数,所给出的webshell的重点也是在如何传入参数

必须知道的基础

有些常见的,比如

1 $_GET:

用于收集通过 URL 查询字符串传递的数据。它是一个关联数组,包含了 URL 中的所有查询参数。

例如,访问 example.com/page.php?name=John&age=25,则 $_GET['name']John$_GET['age']25

1 $_POST:

用于收集通过 HTTP POST 方法发送的数据。通常用于表单提交。

例如,表单中有一个字段 username,提交后可以通过 $_POST['username'] 获取其值。

1 $_COOKIE:

用于访问客户端存储的 cookie 数据。它是一个关联数组,包含了所有可用的 cookie。

例如,若设置了一个 cookie user,可以通过 $_COOKIE['user'] 获取其值。

1 $_REQUEST:

包含了 $_GET$_POST$_COOKIE 中的数据。它是一个合并的数组,允许访问所有请求数据。

例如,若同时通过 GET 和 POST 发送了相同的参数,$_REQUEST['param'] 将返回 POST 中的值。

1 $_SERVER:

包含了关于服务器和执行环境的信息。它是一个关联数组,提供了许多服务器变量,如请求方法、用户代理等。

例如,$_SERVER['REQUEST_METHOD'] 可以获取请求方法(GET、POST等),$_SERVER['HTTP_USER_AGENT'] 可以获取用户的浏览器信息。

1 $_FILES:

用于处理通过 HTTP POST 上传的文件。它是一个关联数组,包含了上传文件的信息,如文件名、类型、大小等。

例如,若表单中有一个文件上传字段 file,可以通过 $_FILES['file'] 获取文件的相关信息。

1 $GLOBALS:

是一个超级全局数组,用于访问全局作用域中的变量。它包含了所有全局变量的名称和值。

例如,若在函数中定义了一个全局变量 $var,可以通过 $GLOBALS['var'] 访问它。

这里强调一下$_SERVER

因为它内部还包含了许多的可以传入参数的点

比如这里随便拿一个例子来举HTTP_ACCEPT

比如我前段时间构造的一个webshell

就是通过

`$$string1['HTTP_ACCEPT']也就是

来传入参数的

get_meta_tags

分析

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

官方的例子

我们基于这个思路该如何构造一个简单的webshell呢?

首先可控点我们需要抓住,就是外部的文件,其中标签我们也可以控制,那岂不是就可以值了

webshell例子

1.html内容如下

webshell

图片加载失败


成功执行

getallheaders()

分析

getallheaders — 获取全部 HTTP 请求头信息

官方的例子

效果

图片加载失败


可以发现是把全部的header都取出来了

如果用这个构造webshell,那我们只需要控制header就可以了

webshell的例子

就是获取header的key和value,然后按照动态命令执行去组装

图片加载失败


返回内容如下

可以发现是执行了命令

get_defined_vars

分析

get_defined_vars — 返回由所有已定义变量所组成的数组

返回值

图片加载失败


比如其中有些值我就可以拿来使用

其中有一个这样的内容

C:\Program Files\nodejs;C:\WINDOWS\system32

system就有了

参数如何控制?

["SCRIPT_NAME"]=> string(6) "/1.php" ["REQUEST_URI"]=> string(6) "/1.php

我们可以选择控制文件名对吧

而且获取的有_SERVER,其实很多就可以控制了

webshell例子

我在本地是

输出

然后只需要组装就好了

注意

不过在webshell检测中一般会忽略文件名,当然我们还可以通过查询string去访问,反正办法很多

filter_input

分析

filter_input — 通过名称获取特定的外部变量,并且可以通过过滤器处理它

官方的例子

以上示例的输出类似于:

我们的构造思路其实就来了,input是可以从url获取的

那我们就可以控制传入的值了

看下它的各种参数

INPUT_GET, INPUT_POST, INPUT_COOKIE, **INPUT_SERVER**或 **INPUT_ENV**之一。

待获取的变量名。

要应用的过滤器 ID。过滤器类型 手册页面列出了可用的过滤器。

如果省略,将使用 FILTER_DEFAULT,默认等同于 ``FILTER_UNSAFE_RAW。这将导致不进行任何默认过滤。

一个选项的关联数组,或者按位区分的标示。如果过滤器接受选项,可以通过数组的 "flags" 位去提供这些标示。

通过type就知道传入参数的方法很多了

然后还可以自定义方法,这也是我们的关键

看如下例子

可以通过FILTER_CALLBACK设置自定义的处理方法,通过options来选择

webshell例子

图片加载失败


0 条评论
某人
表情
可输入 255

没有评论