1.漏洞概述
PHP代码执行漏洞指应用程序本身过滤不严格,用户可以通过请求将代码注入到程序中执行,类似于SQL注入漏洞,可以把SQL语句通过网页注入到SQL服务执行,而PHP代码执行漏洞则是可以把代码注入应用到网站后端中,如果漏洞没有特殊的过滤,相当于直接有一个web后门存在,该漏洞主要由动态代码执行函数的参数过滤不严格导致。
2.技术概述
执行PHP代码写入WebShell
3.风险概述
控制网站甚至服务器
4.黑盒测试
在自己搭建的平台上表单处键入 phpino()语句
这条语句在后端中没有被当做正常字符串信息显示出来而是当做PHP代码执行
接下来我们在键入一个能写webshell的语句
显示正常
服务器中已经被写入了一个webshell
5.查看源码,可以看见动态代码执行函数eval,该函数将字符串直接以PHP代码形式执行,反斜杠‘\’作为转义符号将从表单提交的数据转义成了字符串,这样就构成了代码注入的漏洞,即输入的代码被转义为字符串又被eval以php形式执行。
6.修复方案
业内最新的修复方案基于黑名单的思想,将一些函数必有的符号进行过滤。
<?php
//判断字符串包含函数
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['submit']) && !checkstr($_REQUEST['name'],';') && !checkstr($_REQUEST['name'],'(') && !checkstr($_REQUEST['name'],')') && !checkstr($_REQUEST['name'],'_')&& !checkstr($_REQUEST['email'],';') && !checkstr($_REQUEST['email'],'(') && !checkstr($_REQUEST['email'],')') && !checkstr($_REQUEST['email'],'_')&& !checkstr($_REQUEST['message'],';') && !checkstr($_REQUEST['message'],'(') && !checkstr($_REQUEST['message'],')') && !checkstr($_REQUEST['message'],'_')){
/*用filter过滤特殊编码*/
//filter 函数编码,过滤特殊字符HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。
$name = filter_var($_REQUEST["name"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函数编码,过滤特殊字符HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。
$email = filter_var($_REQUEST["email"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函数编码,过滤特殊字符HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。
$message = filter_var($_REQUEST["message"],FILTER_SANITIZE_SPECIAL_CHARS); //filter 函数编码,过滤特殊字符HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。
@eval("\$var1 = $name;");
echo $var1;
@eval("\$var2 = $email;");
echo $var2;
@eval("\$var3 = $message;");
echo $var3;
}else{
echo "<b>请勿提交非法字符</b>";
}
?>