20222406 2024-2025-2 《網路與系統攻防技術》實驗八實驗報告

20222406王瑞發表於2024-12-07

20222406 2024-2025-2 《網路與系統攻防技術》實驗八實驗報告

1.實驗內容

本次實驗涵蓋Web前端HTML(安裝啟停Apache、理解運用HTML表單及GET/POST方法)、Web前端JavaScript(理解功能與 DOM,編寫驗證規則及進行注入攻擊)、Web後端MySQL基礎(安裝啟動、建庫建表等操作)、Web後端編寫PHP網頁連線資料庫進行使用者認證,還進行了SQL隱碼攻擊、XSS攻擊測試以及在DVWA平臺上完成SQL隱碼攻擊、XSS、CSRF攻擊等內容。

2.實驗過程

2.1 Web前端HTML

能正常安裝、啟停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。
理解HTML:
HTML是用於建立網頁的標準標記語言。它透過一系列的標籤來描述網頁的結構和內容。例如,標籤是整個HTML文件的根標籤,所有其他標籤都包含在它裡面。標籤用於包含文件的後設資料,如文件標題、樣式錶連結、指令碼等,而標籤則包含了網頁中所有可見的內容,像文字、影像、連結等。

理解表單:
表單是HTML中用於收集使用者輸入資訊的元素。它提供了一種互動方式,讓使用者能夠向伺服器傳送資料,例如登入資訊、註冊資訊、搜尋內容等。一個表單可以包含各種輸入欄位,如文字框、密碼框、單選按鈕、核取方塊、下拉選單等。

理解GET方法:
GET 方法主要用於請求資料,比如獲取網頁內容、搜尋結果等。

理解POST方法:
POST 方法用於向伺服器提交資料。

2.1.1 安裝並啟動Apache

輸入命令systemctl start apache2開啟Apache:

在kali的瀏覽器中輸入127.0.0.1

2.1.2 編寫含有表單的HTML並開啟

找到/var/www/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>

如圖所示:

瀏覽器開啟編輯的網頁,例如我的就是127.0.0.1/2406.html

2.1.3 關閉Apache

輸入命令systemctl stop apache2即可:

2.2 Web前端javascipt

理解JavaScript的基本功能,理解DOM。
在2.1的基礎上,編寫JavaScript驗證使用者名稱、密碼的規則。在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”
嘗試注入攻擊:利用回顯使用者名稱注入HTML及JavaScript。

理解JavaScript的基本功能:
在 JavaScript 中,可以使用var、let或const來宣告變數,可以使用函式宣告或函式表示式來定義函式,可以根據條件執行不同的程式碼塊,也可以執行迴圈語句等。

理解DOM:
DOM 是一種用於 HTML 和 XML 文件的程式設計介面。它將網頁文件表示為一個樹形結構,其中每個標籤、文字節點等都是這個樹的節點。透過 DOM,JavaScript 可以訪問和操作網頁的內容、結構和樣式。

2.2.1 編寫JavaScript驗證使用者名稱、密碼的規則,在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”

對2.1中的檔案進行修改,新增以下程式碼:

點選檢視程式碼
<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 !== "password") {
	    alert("Your password is wrong!");
	    return;
	    }

	    // 顯示歡迎資訊
	    document.body.innerHTML = "Welcome, " + username + "!";
      }
</script>

如圖所示:

2.2.2 瀏覽器開啟編輯的網頁

訪問127.0.0.1/2406.html

當輸入的賬號或者密碼為空,會提示username or password can not be null!

如果輸入的密碼錯誤,則會提示:Your password is wrong!

輸入密碼正確,則登陸成功,提示Welcome,使用者名稱!(其中使用者名稱輸入什麼無所謂,密碼對了就行):

2.2.3 嘗試注入攻擊

注入html,在網頁的賬號的文字框中輸入<h1>20222406</h1>,進行HTML注入,密碼不變:

可見整個字號都大了。
注入JavaScript,在網頁的賬號的文字框中輸入<script>alert("20222406")</script>,密碼不變:

2.3 Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、建立使用者、修改密碼、建表

2.3.1 開啟kali中安裝並啟動MySQL

輸入命令systemctl start mysqlsystemctl status mysql

再輸入命令,
service mysql start
mysql_secure_installation

按著提示輸入apt install mariadb-client-compat

再重新輸入mysql_secure_installation

又出現了問題,此時需要輸入兩個命令systemctl status mariadbsystemctl restart mariadb

然後再次輸入mysql_secure_installation,這裡面涉及到一個密碼,需要記住,我設定的是20222406:

繼續輸入命令:
mysql -u root -p
use mysql
show databases;(這個英文分號一定要加):

2.3.2 建立使用者、資料庫、表

輸入create user '20222406'@'%' IDENTIFIED BY 'password';建立使用者,允許該使用者從任何主機連線到資料庫,並使用密碼password進行身份驗證。具體如下圖所示:

輸入create database 20222406rui;命令建立資料庫,再輸入use 20222406rui命令使用該資料庫:

輸入create table user (username VARCHAR(30),password VARCHAR(20));命令建立一個名為user的表,該表包含兩個欄位:username和password:

使用insert into user values('wangrui','20222406');指令實現插入資料,插入操作成功後可以輸入select * from user;命令檢視資料表中的內容,具體如下圖所示:

2.3.3 授權

輸入如下命令,允許使用者從任何主機連線到資料庫,並對名為2022206rui的資料庫擁有所有許可權,
GRANT ALL PRIVILEGES ON 20222406rui.* TO '20222406'@'%';
FLUSH PRIVILEGES;

2.4 Web後端:編寫PHP網頁,連線資料庫,進行使用者認證

2.4.1 編寫程式碼

輸入vi /var/www/html/2406.php命令建立一個php檔案,
再將以下程式碼輸入:

點選檢視程式碼
<?php  
  
// 設定資料庫伺服器的名稱  
$servername = "localhost";  
  
// 設定連線資料庫的使用者名稱  
$username = "root";  
  
// 設定連線資料庫的密碼  
$password = "20222406";  
  
// 設定要連線的資料庫名  
$dbname = "20222406rui";  
 
// 使用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();  
?>

再將2406.html進行修改,程式碼如下:

點選檢視程式碼
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>20222406</title>
    <script>
        function login() {
            const usrname = document.getElementById("username").value;
            const password = document.getElementById("password").value;
        }
    </script>
</head>

<body>
    <h1>Login</h1>
    <form name="20222406" action="2406.php" 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.5 最簡單的SQL隱碼攻擊,XSS攻擊測試

2.5.1 SQL隱碼攻擊

在賬號的文字框中輸入admin' or 1=1 #,使用者名稱何密碼輸入的都是錯誤的,但此時仍然提示正確:

這個賬號資料庫中並沒有,但是因為1=1始終為真,並且# 後面的內容被註釋掉了,所以這個查詢將返回,SQL隱碼攻擊成功。

2.5.2 XSS攻擊

在賬號的文字框中輸入<script>alert("20222406")</script>,密碼隨便輸入,結果如下:

2.6 安裝DVWA或WebGoat平臺,並完成SQL隱碼攻擊、XSS、CSRF攻擊。

我使用的是DVWA。
首先,參考《DVWA安裝教程》進行安裝。
然後,參考《DVWA通關教程》進行實驗。

2.6.1 SQL隱碼攻擊

安裝完成後先開啟服務,輸入service apache2 startsystemctl start mariadb.service

在瀏覽器輸入127.0.0.1/dvwa/

首先將難度調整為low:

進入SQL隱碼攻擊頁面後首先輸入1

再輸入1 and 1=2

再輸入1'會跳轉:

除此以外,參考教程中還有許多可供嘗試。

2.6.2 xss攻擊

在這裡我用的是xss(DOM),找到介面後根據參考教程進行。
首先提交正常表單,觀察網址:

再將網址處的English替換為<script>alert(20222406)</script>

同樣,類似的有很多,可以根據不同的xss和難度來進行調整。

2.6.3 CSRF攻擊

首先找到對應頁面,輸入和重複密碼123456

此時可以在網址處看到我的密碼:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
若是我兩次輸入的密碼不同,便會顯示失敗:

此時將我的網址更改為http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=20222406&password_conf=20222406&Change=Change#就可以成功了:

可見攻擊成功了。

3.問題及解決方案

  • 問題1:在2.3.1處接連出現了許多問題。
  • 問題1解決方案:詳情請到2.3.1處檢視,如果是跟著該教程走的,就可以順利做出來。

4.學習感悟、思考等

從前端的HTML和JavaScript到後端的MySQL和PHP,每一部分都有其獨特的功能與挑戰。例如,在編寫表單時,理解GET和POST方法的差異讓我明白資料傳輸方式對安全性和功能實現的影響。而JavaScript雖強大,卻也因可被惡意注入HTML和JavaScript程式碼,凸顯出前端安全防護的重要性。在後端,MySQL的資料庫操作涉及使用者許可權管理、資料儲存等關鍵任務,任何一點疏忽都可能導致嚴重的安全漏洞,如簡單的SQL隱碼攻擊就可能使攻擊者獲取或篡改資料庫中的敏感資訊。這使我意識到在實際的Web開發中,必須嚴謹對待每一行程式碼,遵循安全規範,絕不能抱有僥倖心理。
從攻擊與防禦的角度來看,實驗中的SQL隱碼攻擊、XSS和CSRF攻擊讓我對網路安全攻防有了更直觀的感受。這些攻擊手段看似簡單卻極具破壞力,攻擊者只需巧妙利用輸入框或網址等使用者互動介面的漏洞,就能突破系統防線。這讓我明白,作為開發者,不能僅僅滿足於功能的實現,更要站在攻擊者的角度審視自己的程式碼,提前做好防禦措施,如對使用者輸入進行嚴格的過濾和驗證、採用安全的程式設計框架和加密技術等。同時,安全防護並非一勞永逸,隨著技術的發展和攻擊者手段的不斷升級,我們需要持續學習和更新安全知識,及時修補系統漏洞。
此次實驗也讓我對網路安全的重要性有了更深層次的理解。在當今數字化時代,Web應用廣泛涉及個人隱私、企業機密和社會公共利益等重要資訊。一次安全事故可能導致使用者資訊洩露、企業聲譽受損甚至社會秩序混亂。因此,網路安全不僅是技術問題,更是涉及法律、道德和社會責任的綜合性問題。我們作為網路技術的學習者和未來的從業者,肩負著保障網路安全的重要使命,應時刻保持警惕,為構建安全可靠的網路環境貢獻自己的力量。

參考資料

  • 《DWVA安裝教程》
  • 《DVWA通關教程》

相關文章