作者:w50251898 | 来源:互联网 | 2023-09-23 18:49
1.漏洞概述
PHP代码执行漏洞指应用程序本身过滤不严格,用户可以通过请求将代码注入到程序中执行,类似于SQL注入漏洞,可以把SQL语句通过网页注入到SQL服务执行,而PHP代码执行漏洞则是可以把代码注入应用到网站后端中,如果漏洞没有特殊的过滤,相当于直接有一个web后门存在,该漏洞主要由动态代码执行函数的参数过滤不严格导致。
2.技术概述
执行PHP代码写入WebShell
3.风险概述
控制网站甚至服务器
4.黑盒测试
在自己搭建的平台上表单处键入 phpino()语句
这条语句在后端中没有被当做正常字符串信息显示出来而是当做PHP代码执行
接下来我们在键入一个能写webshell的语句
显示正常
服务器中已经被写入了一个webshell
5.查看源码,可以看见动态代码执行函数eval,该函数将字符串直接以PHP代码形式执行,反斜杠‘\’作为转义符号将从表单提交的数据转义成了字符串,这样就构成了代码注入的漏洞,即输入的代码被转义为字符串又被eval以php形式执行。
6.修复方案
业内最新的修复方案基于黑名单的思想,将一些函数必有的符号进行过滤。
function checkstr($str,$find){$find_str = $find;$tmparray = explode($find_str,$str); //explode()函数把字符串通过某个指定的字符拆分为数组。$str为原始字符串 $findstr为 if(count($tmparray)>1){ //要查找的字符,如果存$findstr 那么这个字符串就会被拆分成两份或者两份以上 那么数组里的元素就在两个或者两个以上return true;} else{return false;}
}/*判断请求表单字段含下划线,左括号,右括号,分号 */
if(isset($_REQUEST[&#39;submit&#39;]) && !checkstr($_REQUEST[&#39;name&#39;],&#39;;&#39;) && !checkstr($_REQUEST[&#39;name&#39;],&#39;(&#39;) && !checkstr($_REQUEST[&#39;name&#39;],&#39;)&#39;) && !checkstr($_REQUEST[&#39;name&#39;],&#39;_&#39;)&& !checkstr($_REQUEST[&#39;email&#39;],&#39;;&#39;) && !checkstr($_REQUEST[&#39;email&#39;],&#39;(&#39;) && !checkstr($_REQUEST[&#39;email&#39;],&#39;)&#39;) && !checkstr($_REQUEST[&#39;email&#39;],&#39;_&#39;)&& !checkstr($_REQUEST[&#39;message&#39;],&#39;;&#39;) && !checkstr($_REQUEST[&#39;message&#39;],&#39;(&#39;) && !checkstr($_REQUEST[&#39;message&#39;],&#39;)&#39;) && !checkstr($_REQUEST[&#39;message&#39;],&#39;_&#39;)){/*用filter过滤特殊编码*/ //filter 函数编码&#xff0c;过滤特殊字符HTML 转义字符 &#39;"<>& 以及 ASCII 值小于 32 的字符。$name &#61; filter_var($_REQUEST["name"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函数编码&#xff0c;过滤特殊字符HTML 转义字符 &#39;"<>& 以及 ASCII 值小于 32 的字符。 $email &#61; filter_var($_REQUEST["email"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函数编码&#xff0c;过滤特殊字符HTML 转义字符 &#39;"<>& 以及 ASCII 值小于 32 的字符。$message &#61; filter_var($_REQUEST["message"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函数编码&#xff0c;过滤特殊字符HTML 转义字符 &#39;"<>& 以及 ASCII 值小于 32 的字符。&#64;eval("\$var1 &#61; $name;"); echo $var1; &#64;eval("\$var2 &#61; $email;"); echo $var2; &#64;eval("\$var3 &#61; $message;"); echo $var3;}else{echo "请勿提交非法字符";}?>