Thinkphp5 sql注入分析

2022-09-17 05:54:11 字數 2594 閱讀 9269

影響版本:

5.0.13<=thinkphp<=5.0.15 、 5.1.0<=thinkphp<=5.1.5 。

0x01漏洞觸發點:

導致這個漏洞的函式為builder類的parsedata函式

這個函式的前半段主要作用為獲取資料表的字段,然後進入乙個迴圈,我們重點看第二個elseif處

這裡有三個switch的case,我們可以看到如果$val[0]為exp時,$val[1]會直接拼接到$result中,其餘兩種情況則是會經過parsekey()處理之後再拼接上去,我們跟進parsekey()

parsekey()直接返回了$key,那麼其實和第一種情況一樣,也是直接將$val[1]拼接到了$result中,此時我們知道,如果$val可控,則$result的值可控。

知道了上述情況後,我們在builder類裡搜尋一下,看有什麼函式用到了parsedata(),經過搜尋得出,insert()和update()用到了parsedata()

我們可以看到,insert()和update()都是將$data傳入parsedata()後直接將結果替換到先前定義好的sql語句中,然後直接返回

我們再在query類中搜尋看看有哪個函式用到了insert()和update(),經過搜尋發現,query類的insert()和update()用了這兩個函式

我們可以看到,$data傳入後經過array_merge()拼接後直接傳入了builder類的insert()中,上面我們分析過,insert()返回的結果我們是可控的,$options['fetch_sql']值也為空,所以最後sql語句會直接執行,造成注入。同理,update()也會將sql語句直接執行,所以update()也存在注入。

0x02漏洞利用

如果方法的寫法為

$username = request()->get('username/a');

db('admin')->insert(['username' => $username]);

$username = request()->get('username/a');

db('admin')->where("id")->update(['username' => $username]);

$username = $_get['username'];

db('admin')->insert(['username' => $username]);

$username = $_get['username'];

db('admin')->where("id")->update(['username' => $username]);

等,則存在注入。第二種的payload比第一種多了$val[0]為exp的注入,因為第一種使用了request類中的get()方法,而get()中呼叫了filterexp(),會在exp後新增空格,這樣就匹配不到case為exp的情況,所以第二種的payload比第一種多了$val[0]為exp的注入。

poc:

s=index/index/sql&username[0]=inc&username[1]=updatexml(1,concat('~',user(),'~'),1)&username[2]=233

Thinkphp防止SQL注入

防止sql注入 對於web應用來說,sql注入攻擊無疑是首要防範的安全問題,系統底層對於資料安全方面本身進行了很多的處理和相應的防範機制,例如 user m user 例項化user物件 user find get id 即便使用者輸入了一些惡意的id引數,系統也會強制轉換成整型,避免惡意注入。這是...

thinkphp 防止sql注入

對於web應用來說,sql注入攻擊無疑是首要防範的安全問題,系統底層對於資料安全方面本身進行了很多的處理和相應的防範機制,例如 user m user 例項化user物件 user find get id 即便使用者輸入了一些惡意的id引數,系統也會強制轉換成整型,避免惡意注入。這是因為,系統會對資...

ThinkPHP 3 1 3 SQL注入漏洞復現

return array 配置項 配置值 新增資料庫配置資訊 db type mysql 資料庫型別 db host localhost 伺服器位址 db name security 資料庫名 db user root 使用者名稱 db pwd root 密碼 db port 3306,埠 db p...