ThinkPHP 5.0是目前最新的版本,歷經多年的升級完善,深受網站設計公司
的喜歡,在互聯網上也是一個開源的,免費、多個功能插件、API接口功能強悍的PHP
語言開發的一款程序,ThinkPHP從設計以來一直秉承簡潔實用的設計原則,在保證出
色的性能和至簡的代碼的同時,也很注重實用性。
eSafe白帽資安網公司在對其最新版本的程序進行網站安全審計的時候,發現該程序存在數據
庫密碼信息洩露漏洞,在PDO PHP查詢中可以阻止大多數的惡意參數攻擊,而且
ThinkPHP 5.0框架要求的是在php 5.4版本上運行,這也就防止了php在5.3.6版本下
的SQL查詢注入的漏洞。
在對其代碼進行安全審計,其實這是一個SQL注入點,可以查詢到一些數據庫的賬號
以及密碼等安全信息。Thinkphp5.0里代碼設計裡調用到了函數input來替代3.2.3版
本裡的I函數,利用該函數,控制了in語句的數值位置,即可通過傳入一個數組並帶
入惡意的參數,來構造SQL注入語句,進行獲取數據庫的賬號密碼。
在$bindName參數里我們對網站進行了詳細的網站安全檢測,將$k數值寫進到了
$bindName裡,並在$value數值確實為一個數組的同時,這裡邊會遍歷全部的$value
的數值,也就是說我們控制了預編譯SQL語句中的鍵名,也是可以控制了預編譯的SQL
語句,這個在理論上來說是一個SQL注入漏洞。
這漏洞過程當中涉及到預編譯的執行過程了。通常PDO PHP預編譯執行過程分三步:
一、prepare($SQL) 編譯SQL語句
二、bindValue($param, $value) 將value綁定到param的位置上
三、execute() SQL語句執行
這個漏洞實際上就是控制了第二步的$param變量,這個變量如果是一個SQL語句的話
,那麼在第二步的時候是會拋出錯誤的:eSafe白帽資安網公司是一家專注於:主機安全、
網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務
提供商。
看頁面提示是有SQL注入漏洞的,筆者在這裡也嘗試著使用MYSQL報錯注入,但結果失
敗的,值得一提的是這種數據庫賬戶和密碼洩漏的前提是SQL語句執行失敗或者發生
異常的時候才會出現。如果非SQL語法錯誤的debug模式下是不會洩漏數據庫賬戶和密
碼的。
執行發現,雖然我只調用了prepare函數,但原SQL語句中的報錯已經成功執行:
究其原因,是因為我這裡設置了PDO::ATTR_EMULATE_PREPARES => false。
這個選項涉及到PDO的“預處理”機制:因為不是所有數據庫驅動都支持SQL預編譯,
所以PDO存在“模擬預處理機制”。eSafe白帽資安網公司是一家專注於:主機安全、網站
安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供
商。
如果說開啟了模擬預處理,那麼PDO內部會模擬參數綁定的過程,SQL語句是在最後
execute()的時候才發送給數據庫執行;如果我這裡設置了
PDO::ATTR_EMULATE_PREPARES => false,那麼PDO不會模擬預處理,參數化綁定整
個過程都是和Mysql交互進行的。