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 mysql
、systemctl status mysql
:
再輸入命令,
service mysql start
,
mysql_secure_installation
:
按著提示輸入apt install mariadb-client-compat
:
再重新輸入mysql_secure_installation
:
又出現了問題,此時需要輸入兩個命令systemctl status mariadb
、systemctl 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 start
、systemctl 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通關教程》