1. 程式人生 > >ThinkPHP 3.1中的SQL注入漏洞分析----論ThinkPHP 3.1中的半吊子的PDO封裝

ThinkPHP 3.1中的SQL注入漏洞分析----論ThinkPHP 3.1中的半吊子的PDO封裝

我總結ThinkPHP的PDO封裝可以用買櫝還珠來下結論,表面上封裝了PDO支援,但實際卻並沒有使用到PDO的精髓部分,這不是買櫝還珠是什麼呢?

花了一些時間瞭解到ThinkPHP 3.1框架,其官方網站上對其描述得相當不錯,但隨著我閱讀其程式碼,事實並不是想象的那麼好,特別是PDO封裝這一部分,處理得相當糟糕,遠不如使用原生態的PDO安全只是簡單地使用addslashes處理使用者提交的資料,並沒有使用到PDO的精髓部分:prepare預處理和引數化查詢。這樣帶來的SQL注入的風險更大,建議對安全性要求較高的環境,不要使用addslashes處理使用者提交的內容,如有可能不要使用

ThinkPHP框架了,請使用PDO引數化查詢從根本上杜絕SQL注入,或使用安全性處理更好的Yii 框架。

首先,分析為何addslashes會在特定條件下造成注入漏洞

請閱讀以下幾個文章,可得知為何變數使用addslashes處理後仍然造成SQL注入,

PHP字元編碼繞過漏洞--addslashesmysql_real_escape漏洞 

http://blog.csdn.net/zhuizhuziwo/article/details/8525789

addslashes:會導致SQL注入漏洞 

http://blog.csdn.net/felio/article/details/1226569

可以說,從這點上來看,ThinkPHP框架自吹的水分很多,遠不如想象的那麼好。另外 PHPCMS v9網上暴露的SQL注入漏洞超多,也是因為其依賴addslashes防止SQL注入(結果證明漏洞更多)。



 

 

另外,為了從根本上防止SQL注入,PHP手冊上給出的說明:

Prepared statements and stored procedures

Many of the more mature databases support the concept of prepared statements. 

What are they? They can be thought of as a kind of compiled template for the SQL 

that an application wants to run, that can be customized using variable parameters. 

Prepared statements offer two major benefits: 

The query only needs to be parsed (or prepared) once, but can be executed multiple times 

with the same or different parameters. When the query is prepared, the database will analyze, 

compile and optimize its plan for executing the query. For complex queries this process can 

take up enough time that it will noticeably slow down an application if there is a need to 

repeat the same query many times with different parameters. By using a prepared statement 

the application avoids repeating the analyze/compile/optimize cycle. 

This means that prepared statements use fewer resources and thus run faster.

The parameters to prepared statements don't need to be quoted; the driver automatically handles this. 

If an application exclusively uses prepared statements, 

the developer can be sure that no SQL injection will occur 

(however, if other portions of the query are being built up with unescaped input, SQL injection is 

still possible). 

Prepared statements are so useful that they are the only feature that PDO will emulate for 

drivers that don't support them. This ensures that an application will be able to use 

the same data access paradigm regardless of the capabilities of the database. 

也就是說,PHP官方強烈推薦使用PDOprepare機制,使用引數化查詢,即SQL查詢模板與變數分離提交,使用bindValue, bindParam的方式處理使用者提交資料,一方面可提升效能,另一方面可從根本上杜絕SQL注入問題。

但很可惜的是 ThinkPHP仍然使用addslashes方式處理變數,可見其處理方法極其陳舊,充滿SQL注入的風險。

事實上,這套框架在此方面處理的相當糟糕。

讓我們追蹤ThinkPHP程式碼,找到其處理資料的方式

Model::save($data='',$options=array())方法用於儲存資料,實際上呼叫了 $this->db->update($data,$options)

再觀察DbPdo::update()方法,由Db類繼承而來,關鍵點是:$this->parseSet($data)

protected function parseSet($data) {

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

            $value   =  $this->parseValue($val);

            if(is_scalar($value)) // 過濾非標量資料

                $set[]    = $this->parseKey($key).'='.$value;

        }

        return ' SET '.implode(',',$set);

    }

parseValue方法中,關鍵點是escapeString, DbPdo的方法中:

public function escapeString($str) {

         switch($this->dbType) {

            case 'PGSQL':

            case 'MSSQL':

            case 'SQLSRV':

            case 'MYSQL':

return addslashes($str);

            case 'IBASE':                

            case 'SQLITE':

            case 'ORACLE':

            case 'OCI':

                return str_ireplace("'", "''", $str);

        }

}

即簡單地使用addslashes處理輸入變數。

我覺得ThinkPHP中雖然提供了PDO的支援,但實際上還是使用了addslashes方式處理變數,絲毫沒有使用到PDO的精髓部分, prepare預處理SQL, bindValue, bindParam繫結輸入變數。

我認為這只是自欺欺人的做法,表面上聲稱支援PDO,但完全是金玉其外,敗絮其中。 可以哄騙一些小白程式設計師而已,並不到達到其標稱的安全性目標。

如果您使用了ThinkPHP框架,我只能認為你相當的不幸,並默默為你祈禱你的站點沒有受到SQL注入攻擊了。

那麼,如何處理這個問題卻是留給我們的重大問題,如果你的專案使用了ThinkPHP,這時候修改框架或是換框架是相當不現實的,那麼只能從擴充套件ThinkPHP的資料庫訪問層類入手,對其進行處理了。

處理辦法如下:

重寫ThinkPHP的資料庫訪問層

1. 在專案目錄 lib中新建立檔案DbPdoMysql.class.php 在其中定義DbPdoMysql類,並實際crud的四大方法, 如:

class DbPdoMysql extends DbPdo {    

    public function delete($sql, array $params = array() ) {

    }

    public function update(array $data, array $options=array(), array $params=array()){

    }

    public function insert($data,$options=array(),$replace=false, array $params=array() ) {

    }

    public function select($options=array(), array $params=array() ) {

    }

}

然後,具體使用PDO作引數化查詢的處理,請查閱PHP手冊和ThinkPHP框架的資料庫處理流程。

然後,再建立新類,繼承自Moble,並重寫其四大CRUD處理,大致如下:

class DbPdoMysql extends DbPdo {

    public function delete($conditions='', array $params = array() ) {

    }

    public function update(array $data, $conditions='', array $params=array()){

    }

    public function insert(array $data,$options=array(),$replace=false) {

    }

    public function select($options=array(), array $params=array() ) {

    }

}

然後,我們在使用模型進行資料庫操作時,需要特殊處理一下,不能使用舊的方式處理資料庫,以免造成更嚴重的SQL注入問題。

查詢資料時:

$model -> select('where id = ? And name =?', array($_GET['id'], $_GET['name']) )

刪除資料時:

$model->delete('where id = ?',  array($_GET['id']))

插入資料時使用以前程式碼即可(DbPdoMysql類中應該完成引數化處理

強烈建議您根據本文提供的思路,對使用ThinkPHP的專案進行安全處理,以免造成潛在的安全隱患。

另外,關於PDO的防注入原理分析及使用注意事項,請參閱我的文章

PDO防注入原理分析以及使用PDO的注意事項

http://zhangxugg-163-com.iteye.com/blog/1835721

若有異議,請聯絡筆者信箱 [email protected], 歡迎探討交流。

相關推薦

ThinkPHP 3.1SQL注入漏洞分析----ThinkPHP 3.1半吊子PDO封裝

我總結ThinkPHP的PDO封裝可以用買櫝還珠來下結論,表面上封裝了PDO支援,但實際卻並沒有使用到PDO的精髓部分,這不是買櫝還珠是什麼呢? 花了一些時間瞭解到ThinkPHP 3.1框架,其官方網站上對其描述得相當不錯,但隨著我閱讀其程式碼,事實並不是想象的那

ThinkPHP 5.1.x SQL注入漏洞分析

一、背景引見 ThinkPHP 是一個疾速、複雜的基於 MVC 和麵向物件的輕量級 PHP 開發框架,遵照 Apache2 開源協議釋出。ThinkPHP從降生以來不斷秉承簡潔適用的設計準繩,在堅持出色的功能和至簡的程式碼的同時,也注重開發體驗和易用性,為 WEB 使用和 API 開發提供了強無

【程式碼審計】五指CMS_v4.1.0 copyfrom.php 頁面存在SQL注入漏洞分析

  0x00 環境準備 五指CMS官網:https://www.wuzhicms.com/ 網站原始碼版本:五指CMS v4.1.0 UTF-8 開源版 程式原始碼下載:https://www.wuzhicms.com/download/ 測試網站首頁:   0x01 程式碼

【程式碼審計】五指CMS_v4.1.0 後臺存在SQL注入漏洞分析

  0x00 環境準備 五指CMS官網:https://www.wuzhicms.com/ 網站原始碼版本:五指CMS v4.1.0 UTF-8 開源版 程式原始碼下載:https://www.wuzhicms.com/download/ 測試網站首頁:   0x01 程式碼

【程式碼審計】大米CMS_V5.5.3 SQL注入漏洞分析

  0x00 環境準備 大米CMS官網:http://www.damicms.com 網站原始碼版本:大米CMS_V5.5.3試用版(更新時間:2017-04-15) 程式原始碼下載:http://www.damicms.com/downes/dami.rar 測試網站首頁:  

CNVD-2018-20024——MetInfo 6.1.2 SQL注入漏洞

0x00漏洞簡介 metinfo是一個cms 6.1.2版本中存在一個sql盲注漏洞 0x01漏洞細節與漏洞利用 在\app\system\message\web\message.class.php的add函式。 get_one這裡有個columnid 這個地方是傳入int型別

Vtiger CRM 幾處SQL注入漏洞分析,測試工程師可借鑑

本文由雲+社群發表 0x00 前言 乾白盒審計有小半年了,大部分是業務上的程式碼,邏輯的複雜度和功能模組結構都比較簡單,幹久了收獲也就一般,有機會接觸一個成熟的產品(vtiger CRM)進行白盒審計,從審計的技術難度上來說,都比公司內的那些業務複雜得多,而真正要提高自己技術水平,更應該看的也是

ThinkCMF X2.2.2多處SQL注入漏洞分析

   1.     漏洞描述 ThinkCMF是一款基於ThinkPHP+MySQL開發的中文內容管理框架,其中X系列基於ThinkPHP 3.2.3開發,最後更新到2.2.2版本。最近剛好在滲透測試專案中遇到這個CMS,便審了下原始碼發現多處S

齊博CMS變數覆蓋導致sql注入漏洞分析

齊博CMS變數覆蓋導致sql注入漏洞分析 1. 根據阿里文章會員中心評論管理member/comment.php中存在變數cidDB未初始化,所以從此處開始利用對評論批量刪除,抓包檢視 2.exp利用全域性變數$_FILES的註冊變數控制不嚴,所以需要在request

SQL注入漏洞全接觸 入門篇 [1]

引  言 隨著B/S模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段

SQL注入漏洞全接觸--入門篇 [1]

引  言 隨著B/S模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越 多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用 程式存在安全隱患。使用者可以提交

【程式碼審計】CLTPHP_v5.5.3前臺XML外部實體注入漏洞分析

0x01 環境準備 CLTPHP官網:http://www.cltphp.com 網站原始碼版本:CLTPHP內容管理系統5.5.3版本 程式原始碼下載:https://gitee.com/chichu/cltphp 預設後臺地址: http://127.0.0.1/admin/login/index

思科修復Prime License Manager的關鍵SQL注入漏洞

思科剛剛修補了一個關鍵的SQL注入漏洞,該漏洞存在於Cisco Prime License Manager(PLM)的Web框架程式碼中,旨在幫助管理員在企業範圍內管理使用者許可。 在成功利用CVE-2018-15441安全問題之後,潛在的遠端攻擊者可以在脆弱的機器上執行任意SQL查詢。 根據思科在Cis

[分析]-DedeCMS全版本通殺SQL注入漏洞

[利用]: http://p2j.cn/?p=798 [補丁]: http://www.dedecms.com/pl/#u20140228_5 -----------------------------------------------------------------

墨者學院 - CMS系統漏洞分析溯源(第3題)

新雲網站內容管理系統是一套開源的WEB網站管理系統,採用目前非常成熟的ASP+Access/SQL開發而成。使用它,我們可以很方便的管理自己的網站,目前新雲網站內容管理系統最新的版本是v4.0.0 SP2。本文要介紹的捕洞就出在新雲網站內容管理系統v4.0.0 SP1以及未打官方最新補丁的v4.

SQL注入漏洞筆記

一:注入原理 SQL注入是一種常見的Web安全漏洞,攻擊者利用這個問題,可以訪問或修改資料,或者利用潛在的資料庫漏洞進行攻擊 SQL注入是一種將SQL語句插入或天機到應用(使用者)的輸入引數中的攻擊,之後再將這些引數傳遞給後臺的SQL伺服器加以解析並執行 常見的web架構 表示層 :訪問網址

CTFsql注入的一些知識

最近一直在學習sql注入的知識,感覺sql注入確實是漏洞中的一大難點。首先是自己對資料庫結構的不熟悉,所以構造的一些語句總是不能理解。其次是沒有對自己學習的知識做好總結,看了很多視訊、部落格、題目,每次我都感覺自己好像知道要怎麼去做了,可是再拿到一道題目,我還是隻會加單引號,甚至在單引號沒有報錯的時

PHP程式碼審計-SQL注入漏洞挖掘

SQL注入經常出現在登入頁面,HTTP頭(user-agent/client-ip/cookies等),訂單處理等地方,在發生多個互動的地方經常會發生二次注入。 普通注入 $uid = $_GET[‘id’]; $sql = “select * from user where id=$

PHP SQL注入漏洞防範

在PHP中採用魔術引號進行過濾,但是PHP5.4之後被取消了,同時在遇到int型注入也不會那麼有效,所以用的最多的還是過濾函式和類(例如discuz,dedecms,phpcms),如果單純的過濾函式寫的不嚴謹,就會出現繞過的情況,最好的解決方法還是預編譯的方式。 GPC/runtime魔術

怎麼修復網站漏洞之metinfo遠端SQL注入漏洞修補

2018年11月23日SINE網站安全檢測平臺,檢測到MetInfo最新版本爆出高危漏洞,危害性較大,影響目前MetInfo 5.3版本到最新的 MetInfo 6.1.3版本,該網站漏洞產生的主要原因是MetInfo的上傳程式碼裡的引數值沒有進行安全過濾,導致上傳路徑這裡進行偽造路徑,並可以插入惡意的程式碼