軟體測試之SQL注入
一、SQL注入的概念
SQL 注入是一種非常常見的資料庫攻擊手段,SQL 注入漏洞也是網路世界中最普遍的漏洞之一,SQL 注入其實就是惡意使用者通過在表單中填寫包含 SQL 關鍵字的資料來使資料庫執行非常規程式碼的過程
二、模擬SQL注入
1、環境搭建
軟體環境:作業系統、DBMS、語言、瀏覽器、WEB應用伺服器
作業系統:win10
DBMS:MYSQL5.6.12
語言:PHP
瀏覽器:GOOGLE
WEB應用伺服器:Apache
硬體環境:CPU、記憶體、網路環境
CPU:i5-7200
記憶體:鎂光8G
網路環境:單機
2、模擬SQL注入
(1)環境的安裝
安裝Wampserver2.4
(2)資料庫的準備(SQL指令碼)
Create database login charset=gbk; Use login; Create table users(username char(20) primary key,password char(32) not null) charset=gbk; Insert into users value(‘admin’,’admin’) Select * from users;
(3)登入頁面程式的開發(PHP指令碼)
<form action="login_process.php" method="post"> 使用者名稱:<input type="text" name="username" /> <br/> 密碼: <input type="password" name="password" /> <br/> <input type="submit" value="登入"> </from>
(4)登入處理程式的開發(PHP指令碼)
<?php header("Content-Type:text/html;charset=gbk"); $username = $_POST["username"]; $password =$_POST["password"]; $sql = "select * from users where username='$username' and password='$password'"; echo $sql; echo "<br/>"; $con = mysqli_connect("localhost","root",""); mysqli_select_db($con,"login"); $result = mysqli_query($con,$sql); var_dump($result); $num = mysqli_num_rows($result); if($num>0){ echo "登陸成功"; }else{ echo "登陸失敗"; } ?>
(5)設計測試用例,測試應用程式(列舉詳細步驟)
依次輸入符合條件的字元(包括數字,特殊字元,英文字母等)
發現在登入介面將密碼賬號輸入為“ 'or''='” 可以直接登陸成功
or 是一個邏輯運算子,作用是在判斷兩個條件的時候,只要其中一個條件成立,那麼
等式將會成立.而在語言中,是以1來代表真的(成立).那麼在這行語句中,原語句的"and"驗證將不再繼續,而因為"1=1"和"or"令語句返回為真值.。
三、分析產生SQL注入的原因
在B/S模式中,使用者可以通過Get或Post等方式,對伺服器發出HTTP請求。在伺服器端,對資料庫執行查詢操作,將查詢的結果返回瀏覽器端。黑客利用上述過程,將精心構造的請求放到傳入的變數引數中,讓伺服器端執行惡意程式碼,從而達到了讀取資料庫中敏感資訊的效果在B/S模式中,使用者可以通過Get或Post等方式,對伺服器發出HTTP請求。在伺服器端,對資料庫執行查詢操作,將查詢的結果返回瀏覽器端。黑客利用上述過程,將精心構造的請求放到傳入的變數引數中,讓伺服器端執行惡意程式碼,從而達到了讀取資料庫中敏感資訊的效果,甚至將資料庫刪除
四、修改應用程式,避免SQL注入
<?php header("Content-Type:text/html;charset=gbk");
//使用str_replace將瀏覽器端的使用者輸入的引號替換成轉義引號 $username = str_replace("'","\'",$_POST["username"]); $password =str_replace("'","\'",$_POST["password"]); $sql = "select * from users where username='$username' and password='$password'"; echo $sql; echo "<br/>"; $con = mysqli_connect("localhost","root",""); mysqli_select_db($con,"login"); $result = mysqli_query($con,$sql); var_dump($result); $num = mysqli_num_rows($result); if($num>0){ echo "登陸成功"; }else{ echo "登陸失敗"; } ?>
這裡,我將瀏覽器端的使用者輸入的引號替換成轉義引號,避免出現'or''='漏洞。