1. 程式人生 > >談談PHP網站的防SQL註入

談談PHP網站的防SQL註入

效果 query 數據庫服務 data sqlite nbsp lds esc informix

SQL(Structured Query Language)即結構化查詢語言。SQL 註入,就是把 SQL 命令插入到 Web 表單的輸入域或頁面請求參數的查詢字符串中,在 Web表單向 Web 服務器提交 GET 或 POST 請求時,如果服務器端未嚴格驗證參數的有效性和合法性,將導致數據庫服務器執行惡意的 SQL 命令。

SQL 註入攻擊的過程:

(1)判斷 Web 應用是否可以進行 SQL 註入。

(2)尋找 SQL 註入點。

(3)猜解用戶名和密碼。

(4)尋找 Web 系統管理後臺入口。

(5)實施入侵和破壞。

一、 SQL註入漏洞測試工具

1. Sqlmap

Sqlmap 是一個自動化的 SQL 註入工具, 其主要功能是掃描,發現並利用給定的 URL 的 SQL 註入漏洞,日前支持的數據庫是MS SQL Server, MySQL, oracle 和 postgresql。 SQLMAP 采用四種獨特的 SQL 註入技術,分別是盲推理 SQL 註入, UNION 查詢 SQL 註入,堆查詢和基於時間的 SQL 盲註入。其廣泛的功能和選項包括數據庫指紋,枚舉, 數據庫提取,訪問目標文件系統,並在獲取完全操作權限時實行任意命令。

1.1 sqlmap 常用命令介紹

Target(目標):至少需要設置其中一個選項,設置目標 URL。

-d DIRECT 直接連接到數據庫。

-u URL,--url=URL 目標 URL。

Request(請求):這些選項可以用來指定如何連接到目標 URL。

――data=DATA 通過 POST 發送的數據字符串。

――cookie=COOKIE HTTP Cookie 頭。

Optimization(優化):這些選項可用於優化 sqlmap 的性能。

-o 開戶所有優化開關

--threads=THREADS 最大的 HTTP( S)請求並發量(默認為 1)。

Injection(註入):這些選項可以用來指定測試哪些參數。

-p TESTPARAMETER 可測試的參數。

--prefix=PREFIX 註入 payload 字符串前綴。

2 SQLIer

SQLIer可以找到網站上一個有SQL註入漏洞的URL,並根據有關信息來生成利用SQL註入漏洞,但它不要求用戶的交互。通過這種方法,它可以生成一個UNION SELECT查詢,進而可以強力攻擊數據庫口令。這個程序在利用漏洞時並不使用引號,這意味著它可適應多種網站。

SQLIer通過“true/false” SQL註入漏洞強力口令。借助於“true/false” SQL註入漏洞強力口令,用戶是無法從數據庫查詢數據的,只能查詢一個可返回“true”、“false”值的語句。

據統計,一個八個字符的口令(包括十進制ASCII代碼的任何字符)僅需要大約1分鐘即可破解。

2.1 其使用語法如下,sqlier [選項] [URL]

其選項如下:

-c :[主機] 清除主機的漏洞利用信息

-s :[秒]在網頁請求之間等待的秒數

-u:[用戶名]從數據庫中強力攻擊的用戶名,用逗號隔開

-w:[選項]將[選項]交由wget

此外,此程序還支持猜測字段名,有如下幾種選擇:

--table-names [表格名稱]:可進行猜測的表格名稱,用逗號隔開

--user-fields[用戶字段]:可進行猜測的用戶名字段名稱,用逗號隔開

--pass-fields [口令字段]:可進行猜測的口令字段名稱,用逗號隔開

3 Pangolin

Pangolin是一款幫助滲透測試人員進行SQL註入(SQL Injeciton)測試的安全工具。Pangolin與JSky(Web應用安全漏洞掃描器、Web應用安全評估工具)都是NOSEC公司的產品。Pangolin具備友好的圖形界面以及支持測試幾乎所有數據庫(Access、MSSql、MySql、Oracle、Informix、DB2、Sybase、PostgreSQL、Sqlite)。Pangolin能夠通過一系列非常簡單的操作,達到最大化的攻擊測試效果。它從檢測註入開始到最後控制目標系統都給出了測試步驟。Pangolin是目前國內使用率最高的SQL註入測試的安全軟件。

二、 防範SQL註入攻擊

1. 對輸入的數據進行過濾(過濾輸入)

a) 對於動態構造SQL查詢的場合,可以使用替換字符和刪除特殊字符的方法。

b) 檢查用戶輸入的合法性,防止非法數據輸入。數據檢查應當在客戶端和服務器端執行。執行服務器端驗證,是為了彌補客戶端驗證機制的不足。

c) 限制表單或查詢字符串輸入的長度範圍。

d) 加密用戶登錄名稱、 密碼等數據。

2. 對發送到數據庫的數據進行轉義(轉義輸出)

盡量使用為自定義數據庫設計的轉義函數。如果沒有,使用函數addslashes()是比較好的方法,對字符串型參數使用mysql_real_escape_string函數、對數字型參數使用intval,floatval函數強制過濾則更好。當所有用於建立一個 SQL 語句的數據被正確過濾和轉義時,實際上也就避免了 SQL註入的風險。

3. 參數化查詢

參數化查詢(Parameterized Query)指的是 Web 程序在實施數據庫查詢時,在需提交數值或數據的地方避免直接賦值,而是采用參數來傳遞給值。

使用參數化查詢技術,數據庫服務器不會將參數的內容視為 SQL 指令的一個組成部分來處理,在數據庫系統完成對 SQL 指令的編譯後,再載入參數運行。因此,即使參數中含有指令,也不會被數據庫編譯運行。

4. 使用存儲過程

存儲過程存儲在數據庫系統內部, Web 應用程序通過調用來執行存儲過程, 該技術允許用戶定義變量、有條件執行以及其它豐富的編程功能。程序開發者利用存儲過程事先構建好的 SQL 查詢語句代碼,然後在使用中通過參數傳輸數值。存儲過程在使用時起到三點安全作用:首先,存儲過程執行前要進行預編譯,編譯出錯不予執行;其次,對於數據的授權訪問是基於存儲過程而不是直接訪問基本表,攻擊者無法探測到 select 語句;最後,存儲過程可以指定和驗證用戶提供的值類型。

但是,存儲過程也存在一定的局限,如果存儲過程中執行的命令是拼接字符串,則會存在被註入攻擊的隱患。此外,存儲過程並不支持所有的數據庫平臺。

5. 使用PDO連接數據庫

防止SQL註入最好的方法就是不要自己設置SQL 命令和參數,而是用PDO的prepare和bind,原理就在於要把SQL查詢命令和傳遞的參數分開。使用prepare的時候,DB server會把SQL語句解析成SQL命令。使用bind的時候,只是動態傳遞DB Server解析好的 SQL 命令。

三、 總結

除了以上介紹的防範SQL註入攻擊方法之外,還有URL重置技術、頁面靜態化、屏蔽出錯信息、使用web應用防火墻等措施。通過以上措施,SQL註入才能防患於未然。

談談PHP網站的防SQL註入