# 20222403 2024-2025-1 《網路與系統攻防技術》實驗八實驗報告

20222403乔旭發表於2024-12-05

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安全威脅的第一道防線。無論是開發者還是使用者,都需要時刻保持警惕,瞭解常見的安全漏洞和攻擊手段,以便及時採取措施進行防範。

相關文章