thinkphp在國內來講,不少站長以及平臺都在使用這套開源的系統來建站,爲何會這麼深受你們的喜歡,第一開源,便捷,高效,生成靜態化html,第二框架性的易於開發php架構,不少第三方的插件以及第三方的開發公司較多,模板能夠自定義設計,在thinkphp的基礎上能夠開發不少大型的虛擬幣平臺,以及會員平臺,商城系統,thinkPHP的官方在系統升級方面作的比較完善,及時更新與修復一些BUG。php
目前官方最新版本是ThinkPHP5.0.20版本,以前的ThinkPHP3.2,ThinkPHP3.一、ThinkPHP3.0都存在過網站漏洞,包括一些高危的遠程代碼執行漏洞,thinkphp sql注入漏洞,後臺管理員XSS跨站漏洞,任意文件上傳漏洞等等。目前咱們SINE安全於2018年9月5號,在平常的thinkphp網站安全檢測當中,發現某客戶使用的thinkphp系統存在着網站sql注入漏洞,危害性較高,一開始覺得客戶使用的是較低版本:thinkphp 3.2.3,纔會存在這種網站漏洞,可是在實際的安全檢測當中發現不單單是這個版本,還包含了目前最新版本5.0.20,關於該網站漏洞的詳情與poc利用,咱們一步一步來分析。html
網站安全檢測thinkphp漏洞產生原理linux
產生網站漏洞的文件存在於library文件夾下的think文件,裏面包含的db文件夾的sql
driver.class.php代碼中的第677行開始,在order處理分析的時候發現分析參數裏能夠插入非法的thinkphp
字符,在key賦值的時候並無作嚴格的安全限制與過濾,致使攻擊者可使用SQL注入語句進數據庫
行構造查詢數據庫裏的內容,包括能夠查選數據庫裏的管理員帳號密碼, 寫入數據庫等等的操做。windows
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注入攻擊。網站默認的管理員後臺地址能夠修改成比較繁瑣的地址。