thinkphp在國內來說,很多站長以及平台都在使用這套開源的系統來建站,為什麼會這麼
深受大家的喜歡,第一開源,便捷,高效,生成靜態化html,第二框架性的易於開發php架構,
很多第三方的插件以及第三方的開發公司較多,模板可以自定義設計,在thinkphp的基礎上可
以開發很多大型的虛擬幣平台,以及會員平台,商城系統,thinkPHP的官方在系統升級方面做
的比較完善,及時更新與修復一些BUG。
目前官方最新版本是ThinkPHP5.0.20版本,之前的ThinkPHP3.2,ThinkPHP3.1、ThinkPHP3.0
都存在過網站漏洞,包括一些高危的遠程代碼執行漏洞,thinkphp sql注入漏洞,後台管理員
XSS跨站漏洞,任意文件上傳漏洞等等。目前我們eSafe白帽資安網於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漏洞代碼如下:
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語句,查詢數據庫,操作數據庫。
賦值於key值中,可以摻入sql注入語句執行攻擊網站,並可以拼接方式繞過sql安全過濾,導致
可以執行sql語句,查詢數據庫,操作數據庫。
thinkphp漏洞利用詳情:
thinkphp漏洞修復建議:
如果是低版本的thinkphp 3.*的系統,請盡快升級到thinkphp最高版本。
如果是高版本的thinkphp 5.*的系統,請盡快升級到thinkphp最高版本。
如果網站被攻擊了,請盡快做好網站的安全備份,查找網站存在木馬後門,對其代碼裡被篡改的代
碼進行修復,並做好網站安全加固,對一些緩存文件夾進行安全權限設置,如果對網站漏洞修復不
是太懂的話可以找專業的網站安全公司去處理,國內eSafe白帽資安網公司,綠盟安全,啟明星辰都是比較
專業的。如果網站使用的是單獨服務器比如linux系統、windows系統,可以部署網站防火牆,來
防止sql注入攻擊。網站默認的管理員後台地址可以修改為比較繁瑣的地址。
碼進行修復,並做好網站安全加固,對一些緩存文件夾進行安全權限設置,如果對網站漏洞修復不
是太懂的話可以找專業的網站安全公司去處理,國內eSafe白帽資安網公司,綠盟安全,啟明星辰都是比較
專業的。如果網站使用的是單獨服務器比如linux系統、windows系統,可以部署網站防火牆,來
防止sql注入攻擊。網站默認的管理員後台地址可以修改為比較繁瑣的地址。