1. 程式人生 > >網站安全檢測 漏洞檢測 對thinkphp通殺漏洞利用與修復建議

網站安全檢測 漏洞檢測 對thinkphp通殺漏洞利用與修復建議

thinkphp在國內來說,很多站長以及平臺都在使用這套開源的系統來建站,為什麼會這麼深受大家的喜歡,第一開源,便捷,高效,生成靜態化html,第二框架性的易於開發php架構,很多第三方的外掛以及第三方的開發公司較多,模板可以自定義設計,在thinkphp的基礎上可以開發很多大型的虛擬幣平臺,以及會員平臺,商城系統,thinkPHP的官方在系統升級方面做的比較完善,及時更新與修復一些BUG。

目前官方最新版本是ThinkPHP5.0.20版本,之前的ThinkPHP3.2,ThinkPHP3.1、ThinkPHP3.0都存在過網站漏洞,包括一些高危的遠端程式碼執行漏洞,thinkphp sql注入漏洞,後臺管理員XSS跨站漏洞,任意檔案上傳漏洞等等。目前我們SINE安全於2018年9月5號,在日常的thinkphp網站安全檢測當中,發現某客戶使用的thinkphp系統存在著網站sql注入漏洞,危害性較高,一開始以為客戶使用的是較低版本:thinkphp 3.2.3,才會存在這種網站漏洞,但是在實際的安全檢測當中發現不僅僅是這個版本,還包含了目前最新版本5.0.20,關於該網站漏洞的詳情與poc利用,我們一步一步來分析。

網站安全檢測thinkphp漏洞產生原理

產生網站漏洞的檔案存在於library資料夾下的think檔案,裡面包含的db資料夾的

driver.class.php程式碼中的第677行開始,在order處理分析的時候發現分析引數裡可以插入非法的

字元,在key賦值的時候並沒有做嚴格的安全限制與過濾,導致攻擊者可以使用SQL注入語句進

行構造查詢資料庫裡的內容,包括可以查選資料庫裡的管理員賬號密碼, 寫入資料庫等等的操作。

thinkphp 3.2.3漏洞程式碼如下:

/**

* order分析

* @access protected

* @param mixed $order

* @return string

*/

protected function parseOrder($order) {

if(is_array($order)) {

$array = array();

foreach ($order as $key=>$val){

if(is_numeric($key)) {

$array[] = $this->parseKey($val);

}else{

$array[] = $this->parseKey($key).' '.$val;

}

}

$order = implode(',',$array);

}

return !empty($order)? ' ORDER BY '.$order:'';

}

ThinkPHP 5.1.22漏洞程式碼存在於library資料夾下的think檔案裡的db/query.php

程式碼裡的第1514行,程式碼如下:

/**

* 指定排序 order('id','desc') 或者 order

(['id'=>'desc','create_time'=>'desc'])

* @access public

* @param string|array $field 排序欄位

* @param string $order 排序

* @return $this

*/

public function order($field, $order = null)

{

if (empty($field)) {

return $this;

} elseif ($field instanceof Expression) {

$this->options['order'][] = $field;

return $this;

}

if (is_string($field)) {

if (!empty($this->options['via'])) {

$field = $this->options['via'] . '.' . $field;

}

if (strpos($field, ',')) {

$field = array_map('trim', explode(',', $field));

} else {

$field = empty($order) ? $field : [$field => $order];

}

} elseif (!empty($this->options['via'])) {

foreach ($field as $key => $val) {

if (is_numeric($key)) {

$field[$key] = $this->options['via'] . '.' . $val;

} else {

$field[$this->options['via'] . '.' . $key] = $val;

unset($field[$key]);

}

}

從以上thinkphp 3.2.3 、thinkphp 5.0的程式碼裡可以分析出來,當order在分析關聯函式的時候會賦值於key值中,可以摻入sql注入語句執行攻擊網站,並可以拼接方式繞過sql安全過濾,導致可以執行sql語句,查詢資料庫,操作資料庫。

thinkphp漏洞利用詳情:

thinkphp漏洞修復建議:

如果是低版本的thinkphp 3.*的系統,請儘快升級到thinkphp最高版本。

如果是高版本的thinkphp 5.*的系統,請儘快升級到thinkphp最高版本。

如果網站被攻擊了,請儘快做好網站的安全備份,查詢網站存在木馬後門,對其程式碼裡被篡改的程式碼進行修復,並做好網站安全加固,對一些快取資料夾進行安全許可權設定,如果對網站漏洞修復不是太懂的話可以找專業的網站安全公司去處理,國內SINE安全公司,綠盟安全,啟明星辰都是比較專業的。如果網站使用的是單獨伺服器比如linux系統、windows系統,可以部署網站防火牆,來防止sql注入攻擊。網站預設的管理員後臺地址可以修改為比較繁瑣的地址。