代码执行漏洞
什么是代码执行
当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这个字符串,将造成代码注入漏洞。
在php中:eval,assert, preg_replace(‘/*/e', '$ret = "\\1";',$data);
在asp中:eval, exevute,executeglobal
在jsp中:jsp中没有php中的eval函数,但是可以使用反射机制,使用基于反射机制的表达式引擎,如0GNL,SpEL,MVEL等
为什么会存在代码执行漏洞:
应用有时候会考虑代码的简洁性,灵活性,会在代码中调用eval之类的函数。
在phpcms中使用string2array():
$data字符串数组
function string2array($data) {
if($data == ‘’)
return array();
@eval("\$array = $data;");
return $array;
}
为什么要这样用:
应用的所有配置都在数据库中存储着,通过这个函数,直接读取配置,不需要使用正则之类的来一点一点读取配置。
发现代码执行
发现漏洞:
由于thinkphp存在代码执行漏洞,我们可以使用谷歌语法来搜索这类网站。
inurl:think.php
学习代码审计,自己找一些代码执行漏洞
利用代码执行
简单的代码执行:
<?php
$data = $_GET[‘data’];
eval("\$ret = strtolower(\"$data\");");
echo $ret;
?>
代码执行的防御方法
1、使用json保存数组,当读取时就不需要使用eval了
2、对于必须使用eval的地方,一定严格处理用户数据(白名单、黑名单)
3、字符串使用单引号包括可控代码,插入前使用addslashes转义(addslashes、魔数引号、htmlspecialchars、 htmlentities、mysql_real_escape_string)
4、放弃使用preg_replace的e修饰符,使用preg_replace_callback()替换(preg_replace_callback())
5、若必须使用preg_replace的e修饰符,则必用单引号包裹正则匹配出的对象(preg_replace+正则)