正题开始之前,先做点准备,一般情况下,今天要看这些命令执行函数都是被禁止的。
那么首先我们将这些被禁止的函数去掉,打开php.ini,搜索exec,如下图所示:
将disable_functions部分的函数注释掉
一:PHP命令执行函数
这里只简单看下上边注释的函数中的一部分。
1、system
string system(string command,int &return_var)
可以用来执行系统命令并直接将相应的执行结果输出
system() 输出并返回最后一行shell结果。
php
复制代码
<?php system("ipconfig",$result); echo "<br>"; echo "返回码:".$result; echo "<br>"; echo "------------------------------------------------------------------"; echo "<br>"; system("ping guanchao.site"); ?>
2、exec
string exec(string command,array &outpub,int &return_var)
command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。
bash
复制代码
// 执行命令,返回值存储至$result,返回状态码存至$code exec("ping guanchao.site",$result,$code); echo "<br>"; // 输出返回值 var_dump($result); echo "<br>"; // 输出返回状态码 echo "状态码".$code; echo "<br>";
注意:exec输出的是命令执行结果的最后一行内容。如果你需要获取未经处理的全部输出数据,请使用passthru()函数。
如果想要获取命令的输出内容,请确保使用output参数。
3、passthru
void passthru(string command, int &return_var)
command是要执行的命令,return_var存放执行命令后的状态值。
php
复制代码
// 执行命令,直接输出返回值,返回状态码存至$code passthru("ping guanchao.site",$code); echo " "; // 输出返回状态码 echo "状态码".$code; echo " ";
// 执行命令,直接输出返回值,返回状态码存至$code passthru("ping guanchao.site",$code); echo "<br>"; // 输出返回状态码 echo "状态码".$code; echo "<br>";
4、 shell_exec
string shell_exec(string command)
command是要执行的命令。shell_exec函数可执行但需要加echo才能显示结果
bash
复制代码
// shell_exec函数可执行但需要加echo才能显示结果 echo shell_exec("ping guanchao.site"); echo "<br>";
5、``运行符
PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回(例如,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。执行shell命令并返回输出的字符串。
bash
复制代码
$output = `ping guanchao.site`; echo "<pre>$output</pre>";
最开始遇见这个反引号是在数据的sql语句中,没想到这个在PHP中的作用这么强大
6、ob_start&&ob_end_flush
bool ob_start([callback outputcallback[,intoutput_callback[,int outputcallback[,intchunk_size[,bool $erase]]])
ob_start() - 打开输出控制缓冲
ob_get_length() - 返回输出缓冲区的长度
ob_get_level() - 返回输出缓冲区的嵌套级别
ob_get_status() - 返回输出缓冲区的状态(数组形式返回,默认返回最顶层,参数为true时返回所有)
ob_get_contents() - 返回输出缓冲区的内容
ob_get_clean() - 以字符串格式返回当前输出缓冲区并关闭输出缓冲(图片处理时常用)
ob_end_clean() - 清空(擦除)缓冲区并关闭输出缓冲
ob_get_flush() - 以字符串返回输出缓冲区内容并关闭缓冲
ob_end_flush() - 冲刷出(送出)输出缓冲区内容缓冲
php
复制代码
// 开启缓冲 ob_start(); echo 111; // 返回输出缓冲区的内容 $buf2 = ob_get_contents(); // 清空(擦除)缓冲区并关闭输出缓冲 ob_end_clean(); echo '<br/>'; echo $buf2;
二:PHP代码执行函数
这部分函数在php.ini中是没有禁止的,这个需要格外的注意。
1:eval
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
eval()里的引号必须是双引号,因为单引号不能解析字符串里的变量$str;
ini
复制代码
// 代码执行函数 $str = 'system("ping guanchao.site");'; eval($str);
2:assert
assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾,当然你加上也可以。
kotlin
复制代码
// assert 代码执行函数 assert(fun());// 会报警告 eval(fun());// 这个不会报警告 function fun() { echo "12345";; }
3、preg_replace()
preg_replace 函数执行一个正则表达式的搜索和替换。
mixed preg_replace ( mixed pattern,mixedpattern , mixed pattern,mixedreplacement , mixed subject[,intsubject [, int subject[,intlimit = -1 [, int &$count ]] )
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数。
删除空格
ini
复制代码
$str = 'runo o b'; $str = preg_replace('/s+/', '', $str); // 将会改变为'runoob' echo $str;
4:create_function()
create_function()主要用来创建匿名函数,有时候匿名函数可以发挥它的作用。
这个函数已经被弃用,在php7.2中。但是,在PHP5中依然可以使用。
语法:
string create_function ( string args , string args , string args ,string code )
代码注入例子:
bash
复制代码
//访问链接:http://127.0.0.1/index.php?id=2;}phpinfo();/* $id=$_GET['id']; $str2='echo '.$a.'test'.$id.";"; echo $str2; echo "<br/>"; echo "=============================="; echo "<br/>"; $f1 = create_function('$a',$str2); echo "<br/>"; echo "==============================";
5:array_map()
array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
ini
复制代码
// 代码注入 // 访问链接:http://127.0.0.1/index.php?str=phpinfo(); function cube($n) { eval($n); } $a = $_GET['str']; echo $a; $array[0] = $a; $b = array_map("cube", $array); // 使用array_map创建二维数组 $a = array(1, 2, 3, 4, 5); $b = array("one", "two", "three", "four", "five"); $c = array("uno", "dos", "tres", "cuatro", "cinco"); $d = array_map(null, $a, $b, $c); echo "<pre>"; var_dump($d);
6:call_user_func()
call_user_func — 把第一个参数作为回调函数调用
call_user_func将传入的参数作为assert函数的参数
ini
复制代码
// 访问链接:http://127.0.0.1/index.php?str=phpinfo(); $str = $_GET["str"]; call_user_func("assert",$str);
7:call_user_func_array()
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
将传入的参数作为数组的第一个值传递给assert函数
ini
复制代码
// 访问链接:http://127.0.0.1/index.php?str=phpinfo(); $str = $_GET["str"]; call_user_func("assert",$str); $array[0] = $_GET["str"]; call_user_func_array("assert",$array);
以上大概就是PHP中常见的代码执行函数及命令执行函数。
有好的建议,请在下方输入你的评论。
欢迎访问个人博客 guanchao.site
欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”