1. 程式人生 > 其它 >軟體測試之SQL注入

軟體測試之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''='漏洞。