網(wǎng)站安全之php防止注入攻擊代碼如何檢測SQ??L注入的存在?(圖)防止sql注入 php
2022-12-24
我們?nèi)绾伪Wo我們的代碼免受黑客和不良行為者的侵害?
SQL 注入是一種網(wǎng)絡(luò)安全漏洞,攻擊者可以利用它來更改對數(shù)據(jù)庫的 SQL 查詢。 這可用于檢索一些敏感信息,例如數(shù)據(jù)庫結(jié)構(gòu)、表、列及其基礎(chǔ)數(shù)據(jù)。
例如,假設(shè)應(yīng)用程序使用以下查詢來獲取某人的登錄詳細信息:
SELECT USERNAME,PASSWORD from USERS where USERNAME='' AND PASSWORD=' ';
這里, 和 是用戶提供的輸入。 假設(shè)攻擊者' OR '1'='1 在兩個字段中都給出了輸入。 所以 SQL 查詢類似于:
SELECT USERNAME,PASSWORD from USERS where USERNAME='' OR '1'='1' AND PASSWORD='' OR '1'='1';
查詢生成正確的語句,因此用戶已登錄。此示例描述了最基本的 SQL 注入類型。
SQL 注入可以在任何地方使用小程序開發(fā),從數(shù)據(jù)庫中獲取任何敏感信息。
注意:這是最基本的示例,僅供理解之用。 在現(xiàn)實世界中你幾乎找不到這樣的案例。
您可以使用此備忘單了解如何查詢不同的 SQL 數(shù)據(jù)庫提供程序。
如何檢測SQ??L注入的存在?
在大多數(shù)情況下,可以通過提供無效參數(shù)(例如',' 'a' 或 1=1--, "a"" 或 1=1--" 或 a = a, a' '0)輕松檢測到 SQL 注入:0:10'--, 1 '0:0:10'--, %26,' or like '%, etc. 然后你可以觀察應(yīng)用程序行為的變化。
您可以嘗試分析服務(wù)器響應(yīng)的長度以及發(fā)送響應(yīng)所需的時間。 ',a' 或 1=1-- 等有效載荷可能會顯示數(shù)據(jù)庫服務(wù)器響應(yīng)的變化。 但如果沒有變化網(wǎng)站安全之php防止注入攻擊代碼,那么我們會嘗試觸發(fā)一個時間延遲 a' '0:0:10'-- 使用這樣的有效負載。 這可能會在發(fā)送響應(yīng)之前延遲服務(wù)器一定時間。
在確定網(wǎng)站是否存在SQL漏洞后,我們可以嘗試從數(shù)據(jù)庫中提取一些敏感信息。
在此之前網(wǎng)站優(yōu)化,我們需要確定 of 查詢返回的是什么。 這很重要,因為如果我們嘗試獲取的列數(shù)不等于查詢實際返回的列數(shù),那么它將返回錯誤。
我們可以使用 by 命令確定列數(shù)。 例如:
[www.onlineshopping.com/products.php?pid=8](http://www.onlineshopping.com/products.php?pid=8) order by 1 -- // www.onlineshopping.com/products.php?pid=8 order by 2 -- //// If the parameter is a string then you need to add ' after it.www.onlineshopping.com/products.php?usr=b' order by 3 -- // www.onlineshopping.com/products.php?usr=a' order by 4 -- //
-- 的意義在于它是 SQL 中的注釋指示符,它使查詢的其余部分成為注釋。 現(xiàn)在為了保留 --,我們在它后面附加任何字符,以便它出現(xiàn)在 HTTP 中。 根據(jù) SQL 數(shù)據(jù)庫提供程序,我們還可以使用 # 或 /* */ 進行注釋。
繼續(xù)此過程,直到遇到錯誤。 如果按 5 使用負載時出現(xiàn)錯誤,但按 4 使用負載時沒有出現(xiàn)錯誤,這意味著查詢返回 4 列。
如何利用 SQL 注入
一旦您知道應(yīng)用程序易受 SQL 注入攻擊并且您確定了列數(shù)網(wǎng)站安全之php防止注入攻擊代碼,我們將嘗試查找有關(guān)數(shù)據(jù)庫的必要信息,例如數(shù)據(jù)庫名稱、數(shù)據(jù)庫用戶名、數(shù)據(jù)庫、所需表等。檢查 SQL注入備忘單以找到相應(yīng)的查詢。
基于錯誤的 SQL 注入類型:這種類型的 SQL 注入依賴于數(shù)據(jù)庫服務(wù)器拋出的錯誤,這可能會為我們提供一些有關(guān)數(shù)據(jù)庫結(jié)構(gòu)的有用信息。 基于聯(lián)合:此技術(shù)使用 SQL 運算符組合兩個查詢的結(jié)果并返回單個表。 通過將結(jié)果附加到對數(shù)據(jù)庫進行的原始查詢,攻擊者可以從其他表中提取信息。 盲注:當(dāng)應(yīng)用程序易受 SQL 攻擊但 SQL 的結(jié)果未在 HTTP 中返回時,就會發(fā)生這種情況。 在這種情況下,我們查詢數(shù)據(jù)庫中的任何 true/ 并查看 true 和條件的變化。 它有兩種類型: 基于內(nèi)容:在這種技術(shù)中,當(dāng)發(fā)送真實條件和條件時,將使用任何條件語句查詢數(shù)據(jù)庫服務(wù)器,并分析服務(wù)器中的條件差異。 基于時間:此技術(shù)依賴于注入 SQL 查詢,使數(shù)據(jù)庫根據(jù)指定條件等待特定時間。 服務(wù)器發(fā)回響應(yīng)所花費的時間決定了查詢是真還是假。 帶外注入(不常見):這不是一種非常常見的 SQL 類型,因為它取決于數(shù)據(jù)庫服務(wù)器上啟用的功能。 它依賴于數(shù)據(jù)庫服務(wù)器發(fā)出類似 HTTP、DNS 和 ftp 的 Web 請求的能力來向攻擊者發(fā)送數(shù)據(jù)。 如何保護您的代碼免受 SQL 注入攻擊? 切勿直接根據(jù)用戶輸入構(gòu)建查詢。 相反,使用參數(shù)化語句。 它們確保安全地處理傳遞給 SQL 查詢的輸入。 凈化用戶輸入總是一件好事。 此外,應(yīng)進行適當(dāng)?shù)妮斎腧炞C,例如姓名不能是數(shù)字或電話號碼不能是字母。 但是,它有時可以被繞過。 使用安全驅(qū)動程序與 SQL 數(shù)據(jù)庫交互。 它們會自動阻止所有 SQL 注入攻擊。 例如,適用于 . SQL Map 是一種用于處理和注入 SQL 漏洞的開源工具。 這個存儲庫上有一些很酷的 SQL 資源。 它包括一些備忘單和許多有用的有效載荷,可以根據(jù)用例使用。
譯自: