在網路安全領域中,「注入攻擊」一直都是一個非常重要的話題。可以通過惡意注入攻擊從正常的應用程序或網站中竊取數據,或者更具破壞性地篡改或刪除數據。在這裡,我們將重點關注「盲注攻擊」以及如何使用它來進行資料庫注入。盲注攻擊是一種注入攻擊,它是通過構造一個特定的查詢方法對資料庫進行操作,從而泄漏敏感信息或篡改數據,而在這個過程中並不會拋出兩個SQL語句不一樣的異常錯誤。
一、盲注攻擊概述
1、什麼是盲注攻擊?
盲注攻擊又稱為布爾盲注式攻擊,在一定程度上是一種黑客攻擊技術。在直接披露資料庫版本和表名的經典SQL注入技術難以實現時,盲注便可派上用場。
2、盲注攻擊原理理解
盲注攻擊能夠成功的核心原理就是對於』 if a then b else c』 這種條件語句進行猜測,如果條件成立,會返回真,如果條件不成立,則會返回假。在SQL注入過程中,黑客通過類似的方法,來進行猜測和判斷。黑客常常向資料庫發出一些條件語句,而資料庫則會根據傳入的條件判斷結果進行返回。因此,攻擊者可以通過構建條件語句,來獲取一些敏感性數據或進行資料庫的篡改。
3、盲注攻擊特點
盲注攻擊的特點就是不需要對目標進行過多的說明。可以說,盲注階段披露的信息很少,信息比較難以獲取。相比於其他的攻擊方式,盲注攻擊更加隱匿。
二、盲注攻擊常見方式
1、bool盲注
bool盲注式是盲注攻擊中經典的一種方式。正如其名,它是基於布爾類型函數運算的注入方式。攻擊者通過在網站表單輸入已經構造好的語句,如果返回頁面對語句的判斷結果是true,則表示存在該語句,否則表示沒有該語句。
2、time盲注
time盲注是基於數據查詢時間差的注入方式。在判斷查詢結果時,如果查詢結果與預期的結果一致,那麼查詢的時間差應該是相同的。攻擊者通過發送構造的延時函數,判斷SQL查詢的時間差,從而得出信息是否正確。
3、error-based注入
error-based注入是掃描器內置的一種檢查SQL注入方式。它的基礎是對查詢效果和錯誤提示信息的對比分析。關鍵在於拋出各種錯誤的提示信息。
三、盲注攻擊繞過技巧
1、閉合字元漏洞注入
閉合字元是指一個輸入框由於少輸入了引號等特殊字元,導致引號或其他正則符被丟失,從而產生注入。黑客可通過此方式很容易的進行一些字元串的盲注,獲取數據或進行資料庫篡改。
例如JavaScript中拼接SQL語句,前提是要有閉合字元。而當輸入一些字元導致自身未閉合的情況下,JS就會將其認為是SQL語句的拼接,從而產生注入。
<?php
$sql="select * from user where name='".$_POST['name']."' and password='".$_POST['password']."'";
2、寬字元編碼注入
寬字元編碼漏洞注入,是對編碼方式的一種攻擊方式,在網站開發和維護中廣泛存在。黑客可以通過一些方法構造代碼,來繞過驗證碼和過濾器,進行數據篡改等操作。
例如,MySQL中GB2312的編碼是一個雙位元組的字元編碼,如果黑客將數據提交到PHP上,此時會出現SQL注入漏洞。這是因為PHP默認是UTF-8編碼,而MySQL是GB2312編碼,黑客通過修改編碼方式,就可以達到繞過SQL語句的目的。
<?php
//當數據編碼為gb2312時,以下為一個簡單的 SQL 注入示例
//1.用 substr 函數截取出字元串: ' or 1=1-- 可以使用 Javascript 技術進行
$sql="select * from user where name='".substr($_POST['name'],0,1)."' and password='".$_POST['password']."'";
//2.當編碼為 UTF-8 時,把 ' 轉換為 %EF%BF%BD
$sql="select * from user where name='".urlencode($_POST['name'])."' and password='".$_POST['password']."'";
四、盲注攻擊防範措施
1、參數化查詢
參數化查詢就是在運行 SQL 之前,將 SQL 中所有的參數全部傳入,或者在運行 SQL 之後,將 SQL 計劃(執行計劃)與參數一起綁定。參數化查詢可以有效地避免 SQL 注入攻擊,因為在 SQL 執行計劃中,參數都是字元串,而沒有 SQL 成分了。
$insert = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
$insert->bind_param('ss', $username, $password);
$insert->execute();
2、過濾用戶輸入
過濾用戶輸入可以有效地防止有惡意用戶在表單中輸入特殊字元以執行 SQL 注入攻擊。在編寫代碼時,可以使用 PHP 內置的函數(如`htmlspecialchars()`和`filter_input()`)對用戶輸入進行過濾,然後在將輸入傳遞給資料庫之前對其進行驗證。
$username = htmlspecialchars($_POST["username"]);
$password = htmlspecialchars($_POST["password"]);
//使用PDO類
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR);
$stmt->execute();
五、總結
作為一名程序開發人員或安全工程師,如何保證自己的網站應用程序的安全性,避免注入攻擊是非常重要的。使用盲注攻擊可以非常快速地從受攻擊的網站上獲取敏感信息或者篡改資料庫信息。因此,我們需要加強安全意識,並結合各種技術手段,從不同的層面上保證自己的網站做到足夠的安全性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/155069.html