1.實驗內容
(1)Web前端HTML
能正常安裝、啟停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。
(2)Web前端javascipt
理解JavaScript的基本功能,理解DOM。在(1)的基礎上,編寫JavaScript驗證使用者名稱、密碼的規則。在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”
嘗試注入攻擊:利用回顯使用者名稱注入HTML及JavaScript。
(3)Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、建立使用者、修改密碼、建表
(4)Web後端:編寫PHP網頁,連線資料庫,進行使用者認證
(5)最簡單的SQL隱碼攻擊,XSS攻擊測試
(6)安裝DVWA或WebGoat平臺,並完成SQL隱碼攻擊、XSS、CSRF攻擊。
2.實驗過程
2.1Web前端HTML
2.1.1啟動Apache
輸入指令systemctl start apache2
開啟Apache服務
在瀏覽器輸入網址127.0.0.1
Apache開啟成功
2.1.2編寫含有表單的HTML
輸入命令vi /var/www/html/2403.html
編輯建立一個登陸介面,HTML程式碼如下:
點選檢視程式碼
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
<body>
<h1>Login</h1>
<form method="post">
<font>賬號:</font>
<input type="text" name="username" id="username"><br>
<font>密碼:</font>
<input type="password" name="password" id="password"><br>
<button onclick="login()">login</button>
</form>
</body>
</html>
2.1.3瀏覽器開啟編輯的網頁
在瀏覽器訪問網址 http://127.0.0.1/2403.html
2.2Web前端javascipt
在(1)的基礎上,編寫JavaScript驗證使用者名稱、密碼的規則。在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”
2.2.1編寫JavaScript驗證使用者名稱、密碼的規則,在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”
輸入命令vi /var/www/html/2403.html
新增以下程式碼:
點選檢視程式碼
<script>
function login() {
const username = document.getElementById("username").value;
const password = document.getElementById("password").value;
// 檢查賬號和密碼是否為空
if (username === "" || password === "") {
alert("Username or password cannot be null!");
return;
}
// 檢查密碼是否正確
if (password !== "20222403") {
alert("Wrong password!");
return;
}
// 顯示歡迎資訊
document.body.innerHTML = "Welcome, " + username + "!";
}
</script>
再次進入網頁http://127.0.0.1/2403.html
當輸入的賬號或者密碼為空,會提示 :username or password can not be null!
如果輸入的密碼錯誤,則會提示:Wrong password!
輸入密碼正確,則登陸成功,列印Welcome ***!
2.2.3嘗試注入攻擊:利用回顯使用者名稱注入HTML及JavaScript。
注入HTML,在網頁的賬號的文字框中輸入 <h1> QX </h1>
,進行HTML注入,密碼不變。結果如下:
注入JavaScript,在網頁的賬號的文字框中輸入<script>alert("QX")</script>
,密碼不變。結果注入成功。
2.3Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、建立使用者、修改密碼、建表
2.3.1 安裝、啟動MySQL
systemctl start mysql //開啟MySQL服務
systemctl status mysql //顯示MySQL服務的當前目前狀態
接下來進行:
service mysql start //啟動MySQL服務
mysql_secure_installation //MySQL安全安裝指令碼
mysql -u root -p //登入到MySQL資料庫
use mysql //切換大MySQL資料庫
show databases; //列出MySQL伺服器上的所有資料庫
2.3.2建立使用者、建庫、修改密碼、建表
-
輸入create user 'QX'@'%' IDENTIFIED BY '20222403';
建立一個名為QX的使用者,允許該使用者從任何主機連線到資料庫,並進行身份驗證。 -
輸入create database 20222403QX;
建立資料庫,再輸入use 20222403QX命令使用該資料庫 -
輸入create table user (username VARCHAR(30),password VARCHAR(20));
建立一個名為user的表,該表包含兩個欄位:username和password。
使用insert into user values('QX','20222403');指令實現插入資料,插入操作成功後可以輸入select * from user;命令檢視資料表中的內容, -
輸入如下命令,允許使用者QX從任何主機連線到資料庫,並對名為20222403QX的資料庫擁有所有許可權:
GRANT ALL PRIVILEGES ON 20222403QX.* TO 'QX'@'%'; //授予使用者所有許可權
FLUSH PRIVILEGES; //重新整理許可權
2.4Web後端:編寫PHP網頁,連線資料庫,進行使用者認證
輸入vi /var/www/html/20222403.php
建立一個php檔案,編寫程式碼具體如下:
點選檢視程式碼
<?php
// 設定資料庫伺服器的名稱
$servername = "localhost";
// 設定連線資料庫的使用者名稱
$username = "root";
// 設定連線資料庫的密碼
$password = "123456";
// 設定要連線的資料庫名
$dbname = "20222403QX";
// 使用mysqli建立一個新的資料庫連線
$conn = new mysqli($servername, $username, $password, $dbname);
// 檢查連線是否成功
if ($conn->connect_error) {
// 如果連線失敗,輸出錯誤資訊並停止指令碼執行
die("連線資料庫失敗: " . $conn->connect_error);
}
// 使用null合併運算子從POST請求中獲取使用者名稱,如果POST請求中沒有該值,則將其設定為空字串
$username = $_POST['username'] ?? '';
// 使用null合併運算子從POST請求中獲取密碼,如果POST請求中沒有該值,則將其設定為空字串
$password = $_POST['password'] ?? '';
// 建立一個SQL查詢語句,用於從user表中查詢與給定使用者名稱和密碼匹配的使用者
$sql = "SELECT * FROM user WHERE username = '$username' AND password = '$password'";
// 執行SQL查詢並獲取結果
$result = $conn->query($sql);
// 檢查查詢結果中的行數是否大於0,即是否找到了匹配的使用者
if ($result->num_rows > 0) {
// 如果找到了匹配的使用者,輸出登入成功的訊息
echo " 歡迎 ! 登陸成功!";
} else {
// 如果沒有找到匹配的使用者,輸出使用者名稱或密碼錯誤的訊息
echo "使用者名稱或密碼錯誤!";
}
// 關閉資料庫連線
$conn->close();
?>
修改之前的2403.html檔案,使用建立的PHP指令碼來處理登入驗證,
將表單的“action”屬性指向“20222403.php”具體如下所示:
開啟瀏覽器,訪問網址http://127.0.0.1/2403.html
輸入使用者名稱:QX,密碼:20222403。效果如下:
輸入錯誤:
成功實現使用者認證。
2.5最簡單的SQL隱碼攻擊,XSS攻擊測試
2.5.1SQL隱碼攻擊
在賬號框中輸入'or 1=1 #
,密碼隨便輸入。
結果:
資料庫中本來沒有這個賬號,但是因為1=1始終為真,並且# 後面的內容被註釋掉了,所以進行查詢時返回users表中的所有記錄,使得登入成功。SQL隱碼攻擊成功。
2.5.2 實現XSS攻擊
在賬號框中輸入,密碼隨便輸入 。
結果:
攻擊成功。
2.6安裝DVWA或WebGoat平臺,並完成SQL隱碼攻擊、XSS、CSRF攻擊。
先下載webgoat.jar檔案,將檔案拖入kali。
使用指令java -jar webgoat-2023.8.jar啟動webgoat。
當所有的輸出結束之後,在kali的瀏覽器中輸入http://localhost:8080/WebGoat/login
進入網頁,註冊使用者名稱和密碼
進入主頁面
2.6.1SQL隱碼攻擊
按順序選擇:A3->SQL injection(Intro)->9
選擇“ Smith'”“ or ”和“ '1'='1”填入
觀察查詢語句,SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + “’
;要顯示符合條件的人的所有資訊,即使first_name且last_name為真,first_name已經固定,所以只需last_name為真。讓格式成為‘Smith','1'='1’即可,成功獲取資訊。
2.6.2XSS攻擊
選擇左側欄A3→Cross Site Sorpting→7
輸入
提示框告警彈出,提示20222403XSS,攻擊成功。
2.6.3CSRF攻擊
選擇左側欄A10-> Cross-Site Request Forgeries→8
保持此網頁開啟,然後在另一個網頁中根建立一個使用者字首為csrf-20222403qx。
用此新使用者訪問這道題目,點選提交solved看到題目已經透過
攻擊成功!
3.問題及解決方案
- 問題1:編寫好web後端php檔案後,從瀏覽器進入網址,輸入使用者名稱和密碼,跳轉後白屏。
- 問題1解決方案: 仔細檢查php檔案中連線的資料庫名,和html檔案中 action語句的指向檔名。
4.學習感悟、思考等
透過SQL隱碼攻擊、跨站指令碼(XSS)、跨站請求偽造(CSRF)等攻擊手段,我深刻意識到,安全意識是防範Web安全威脅的第一道防線。無論是開發者還是使用者,都需要時刻保持警惕,瞭解常見的安全漏洞和攻擊手段,以便及時採取措施進行防範。