20192406樑健 2021-2022-2 《網路與系統攻防技術》實驗八實驗報告
20192406樑健 2021-2022-2 《網路與系統攻防技術》實驗八實驗報告
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)安裝Webgoat或類似平臺,並完成SQL注入、XSS、CSRF攻擊。
2.實驗過程
(1)Web前端HTML
1.能正常安裝、啟停Apache。
- 正常安裝
- 啟停Apache
啟動
停止
2.理解HTML,理解表單,理解GET與POST方法
- HTML
超文字傳輸協議(HTTP)的設計目的是保證客戶端與伺服器之間的通訊。
HTTP 的工作方式是客戶端與伺服器之間的請求-應答協議。
web 瀏覽器可能是客戶端,而計算機上的網路應用程式也可能作為伺服器端。
- 表單
表單在網頁中主要負責資料採集功能。一個表單有三個基本組成部分: 表單標籤:這裡麵包含了處理表單資料所用CGI程式的URL以及資料提交到伺服器的方法。 表單域:包含了文字框、密碼框、隱藏域、多行文字框、複選框、單選框、下拉選擇框和檔案上傳框等。 表單按鈕:包括提交按鈕、復位按鈕和一般按鈕;用於將資料傳送到伺服器上的CGI指令碼或者取消輸入,還可以用表單按鈕來控制其他定義了處理指令碼的處理工作。
- GET方法
GET請求會顯示請求指定的資源。一般來說GET方法應該只用於資料的讀取,而不應當用於會產生副作用的非冪等的操作中。
GET會方法請求指定的頁面資訊,並返回響應主體,GET被認為是不安全的方法,因為GET方法會被網路蜘蛛等任意的訪問。
- POST方法
POST請求會 向指定資源提交資料,請求伺服器進行處理,如:表單資料提交、檔案上傳等,請求資料會被包含在請求體中。POST方法是非冪等的方法,因為這個請求可能會建立新的資源或/和修改現有資源。
3.編寫一個含有表單的HTML。
程式碼如下:
<!DOCTYPE html> <!--登入程式碼--> <html> <body> <form name="form1" action="login" method="post"> 使用者名稱:<br> <input type="text" name="username" value="20192406樑健"> <br> 密碼:<br> <input type="password" name="password" value="11111"> <br><br> <input type="button" value="Submit"> </form> </body> </html>
(2)Web前端javascipt
1.理解JavaScript的基本功能,理解DOM。
1、嵌入動態文字於HTML頁面
2、對瀏覽器事件作出響應
3、讀寫HTML元素
4、在資料被提交到伺服器之前驗證資料
5、檢測訪客的瀏覽器資訊
6、控制cookies,包括建立和修改等
- DOM
文件物件模型 (DOM) 是HTML和XML文件的程式設計介面。它提供了對文件的結構化的表述,並定義了一種方式可以使從程式中對該結構進行訪問,從而改變文件的結構,樣式和內容。DOM 將文件解析為一個由節點和物件(包含屬性和方法的物件)組成的結構集合。簡言之,它會將web頁面和指令碼或程式語言連線起來。
一個web頁面是一個文件。這個文件可以在瀏覽器視窗或作為HTML原始碼顯示出來。但上述兩個情況中都是同一份文件。文件物件模型(DOM)提供了對同一份文件的另一種表現,儲存和操作的方式。 DOM是web頁面的完全的面向物件表述,它能夠使用如 JavaScript等指令碼語言進行修改。
2.在(1)的基礎上,編寫JavaScript驗證使用者名稱、密碼的規則。在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”
程式碼如下:
<!DOCTYPE html>
<!--登入程式碼-->
<html>
<script type="text/javascript">
function lgcheck() {
//判斷使用者名稱是否為空
if(form1.username.value==""||
form1.password.value==""){
alert("使用者名稱或密碼不能為空!")
}else{
document.write("歡迎"+form1.username.value)
}
}
</script>
<body>
<form name="form1" action="login" method="post">
使用者名稱:<br>
<input type="text" name="username" value="20192406樑健">
<br>
密碼:<br>
<input type="password" name="password" value="11111">
<br><br>
<input type="button" value="Submit" onclick="lgcheck()">
</form>
</body>
</html>
3.嘗試注入攻擊:利用回顯使用者名稱注入HTML及JavaScript。
- 注入HTML
注入的程式碼如下:
<p>20192406樑健HTML注入</p>
- 注入JavaScript
注入的程式碼如下:
<script type="text/javascript"> alert("20192406樑健JavaScript注入") </script>
(3)Web後端:MySQL基礎
1.正常安裝
2.啟動MySQL
- 啟動服務指令:
net start mysql
- 登入指令:
mysql -u root -p
3.建庫
指令:create database lj;
4.建立使用者
指令:CREATE USER dbadmin@localhost IDENTIFIED BY 'pwd123';
5.修改密碼
指令:ALTER user 'dbadmin'@'localhost' IDENTIFIED BY '20192406';
6.建表
指令:CREATE TABLE IF NOT EXISTS tasks ( task_id INT(11) NOT NULL AUTO_INCREMENT, subject VARCHAR(45) DEFAULT NULL, start_date DATE DEFAULT NULL, end_date DATE DEFAULT NULL, description VARCHAR(200) DEFAULT NULL, PRIMARY KEY (task_id) ) ENGINE=InnoDB;
(4)Web後端
1.編寫PHP網頁
修改的前端程式碼:
<!DOCTYPE html>
<!--登入程式碼-->
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript">
function lgcheck() {
//判斷使用者名稱是否為空
if(form1.username.value==""||
form1.password.value==""){
alert("使用者名稱或密碼不能為空!")
}else{
alert("歡迎"+form1.username.value)
form1.submit();
}
}
</script>
</head>
<body>
<center>
<form name="form1" action="login.php" method="post">
使用者名稱:<br>
<input type="text" name="username" value="20192406樑健">
<br>
密碼:<br>
<input type="password" name="password" value="11111">
<br><br>
<input type="button" value="Submit" onclick="lgcheck()">
</form>
</center>
</body>
</html>
後端程式碼:
<?php
//支援中文
header("Content-type:text/html;charset=utf-8");
$loginTel=$_POST["username"];
$loginPwd=$_POST["password"];
//測試用例
// $loginId="20192406樑健";
// $loginPwd="11111";
$conn=mysqli_connect("localhost","root","root");
mysqli_select_db($conn, "lj");
$result1=mysqli_query($conn,"select * from user where uname='$loginTel' and passwd='$loginPwd'");
$result2=mysqli_query($conn, "select * from user where uname='$loginTel'");
//1表示使用者名稱存在密碼正確,2表示使用者名稱存在密碼錯誤,0表示使用者名稱不存在
if(mysqli_num_rows($result1)==1){
echo "使用者名稱密碼正確,登陸成功";
echo "歡迎 ";
echo $loginTel;
}else if(mysqli_num_rows($result2)==1){
echo "使用者名稱正確,密碼錯誤";
}else if(mysqli_num_rows($result2)==0){
echo "使用者名稱不存在";
}
mysqli_close($conn);
?>
2.連線資料庫
PHP中連線資料庫的程式碼如下:
$conn=mysqli_connect("localhost","root","root");
mysqli_select_db($conn, "lj");
....
mysqli_close($conn);
3.進行使用者認證
PHP中使用者認證的程式碼如下:
$result1=mysqli_query($conn,"select * from user where uname='$loginTel' and passwd='$loginPwd'");
$result2=mysqli_query($conn, "select * from user where uname='$loginTel'");
//1表示使用者名稱存在密碼正確,2表示使用者名稱存在密碼錯誤,0表示使用者名稱不存在
if(mysqli_num_rows($result1)==1){
echo "使用者名稱密碼正確,登陸成功";
echo "歡迎 ";
echo $loginTel;
}else if(mysqli_num_rows($result2)==1){
echo "使用者名稱正確,密碼錯誤";
}else if(mysqli_num_rows($result2)==0){
echo "使用者名稱不存在";
}
4.網頁效果
資料庫中的資訊如下:
uname | passwd |
20192406樑健 | 11111 |
admin | admin |
- 輸入正確使用者名稱和密碼
- 輸入正確使用者名稱和錯誤密碼
- 輸入錯誤使用者名稱
(5)最簡單的SQL注入,XSS攻擊測試
1.最簡單的SQL注入測試
測試輸入內容如下:
' or '1'='1
2.XSS攻擊測試
測試輸入內容如下:
<script type="text/javascript">alert('XSS攻擊')</script>
(6)安裝Webgoat或類似平臺,並完成SQL注入、XSS、CSRF攻擊。
本實驗使用WebGoat平臺完成一下實驗內容。
1.SQL注入
題目:SQL Injection (intro)->12頁
這關利用查詢鏈(分號;)破壞資料完整性,也就是修改非授權資料。兩個框都可以是注入點,因此有兩種解法:
Name框:Smith
TAN框:3SL99A';UPDATE employees SET salary=200000 WHERE last_name='Smith
或者
Name框:Smith';UPDATE employees SET salary=200000 WHERE last_name='Smith';-- ss
TAN框不填
2.XSS攻擊
題目:Cross Site Scripting->7頁
點選一下UpdateCart,會發現下方將credit cart number顯示出來了,那麼credit cart number的輸入框應該是一個攻擊點。
<script type="text/javascript">alert('XSS')</script>
3.CSRF攻擊
題目:Cross-Site Request Forgeries->3頁
使用Burpsuite攔截並修改內容重發
3.問題及解決方案
- 問題1:在執行PHP的Web後端程式碼時,發現無法執行。
- 問題1解決方案:原因是,程式碼的函式呼叫和PHP版本不符合,解決方法是修改呼叫函式的名稱和引數,這樣就可以執行PHP的後端程式碼。
- 問題2:在進行mysql使用時,我的mysql版本為8,所以在使用修改密碼指令時出錯。
- 問題2解決方案:解決方法是查詢正確的指令寫法,並執行。最後成功了。
4.學習感悟、思考等
通過本次實驗,我學習了很多Web安全的內容,主要學習了很多Web攻擊方式,並在不同的平臺進行實踐,在實踐過程中我遇到了一些問題,在問題的查詢和解決過程中,發現了很多的不足,在學習程式碼的時候也發現自己之前學習的內容過了一段時間,也容易忘記,總是出錯。所以應該時常複習,並且要熟練運用搜索工具,也應該收集和整理一些常見問題,並把解決方案記錄下來。總的來說,網路空間的安全是脆弱的,我們要努力學習網路安全技術,只有掌握了更多的內容才能更加清晰的認知,對不同的網路攻擊都有所瞭解才能在遇到問題時,可以做到不慌不忙,儘量解決問題。