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;
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;
$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注入攻擊。網站預設的管理者背景位址可以修改為比較繁瑣的位址。