php代码执行漏洞

产生原因

因为对用户可控参数过滤不严,导致通过相关函数将php代码注入到Web应用中通过Web容器执行。

相关函数

PHP:eval()、assert()、call_user_func_array()、preg_replace()、call_user_func()等常规函数和动态函数$a($b) (比如$_GET($_POST["xxx"])

其中eval()和assert()区别

eval:eval() 函数把字符串按照 PHP 代码来计算和执行,该字符串必须是合法的 PHP 代码,且必须以分号结尾。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

<?php
$string = "beautiful";
$time = "winter";
 
$str = "This is a $string $time morning!";
echo $str. "<br />";
 
eval("\$str = \"$str\";");#等同于:$str = "$str";而双引号中的代码会优先执行并替换
echo $str;
?> 

值得注意的是:

1.eval函数的参数的字符串末尾一定要有分号,在最后还要另加一个分号(这个分号是php限制)。
2.注意单引号,双引号和反斜杠的运用。如果参数中带有变量时,并且变量有赋值操作的话,变量前的$符号前一定要有\来转义,如果没有赋值操作可以不需要。

assert:
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。程序员断言在程序中的某个特定点该的表达式值为真(为真才能继续执行)。如果该表达式为假,就中断操作.
assert ( mixed $assertion [, Throwable $exception ] )
漏洞:如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval(),和eval()函数区别在于参数不需要分号;结尾

eval(" phpinfo()"); <错误>
eval(" phpinfo();"); <正确>
assert(" phpinfo()"); <正确>

其他函数

preg_replace(),call_user_func(),动态函数,以及双引号引起的对内容的二次解释引发的代码执行漏洞。
参考https://blog.csdn.net/qq_45521281/article/details/106162786

zzzcms环境已搭,复现代码执行漏洞后再行修改。

posted @ 2021-10-10 02:03  0x00Guem-lulu  阅读(163)  评论(0编辑  收藏  举报