1. 程式人生 > >2018-2019 20165208 網絡對抗 Exp8 Web基礎

2018-2019 20165208 網絡對抗 Exp8 Web基礎

alt 緩沖 輸入 用戶認證 exp 式表 信息 多行文本 update

目錄

  • 2018-2019 20165208 網絡對抗 Exp8 Web基礎
    • 實驗內容
    • 基礎問題回答
    • 實踐過程記錄
      • 1. Apache準備
      • 2. Web前端HTML
      • 3. Web前端javascipt
      • 4. Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表
      • 5. Web後端:編寫PHP網頁,連接數據庫,進行用戶認證
      • 6. SQL註入
      • 7. XSS攻擊測試
    • 實驗中遇到的問題
    • 實驗感想

2018-2019 20165208 網絡對抗 Exp8 Web基礎

實驗內容

(1)Web前端HTML(0.5分)

能正常安裝、啟停Apache。理解HTML,理解表單,理解GET與POST方法,編寫一個含有表單的HTML。

(2)Web前端javascipt(0.5分)

理解JavaScript的基本功能,理解DOM。編寫JavaScript驗證用戶名、密碼的規則。

(3)Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表(0.5分)

(4)Web後端:編寫PHP網頁,連接數據庫,進行用戶認證(0.5分)

(5)最簡單的SQL註入,XSS攻擊測試(0.5分)

功能描述:用戶能登陸,登陸用戶名密碼保存在數據庫中,登陸成功顯示歡迎頁面。

課題負責人需要完成:登陸後可以發貼;會話管理。

(6)報告評分 (1分)

基礎問題回答

(1)什麽是表單

表單是一個包含表單元素的區域,表單元素是允許用戶在表單中(比如:文本域、下拉列表、單選框、復選框等等)輸入信息的元素,表單在網頁中主要負責數據采集功能,一個表單有三個基本組成部分:表單標簽、表單域、表單按鈕;

表單標簽(

):這裏面包含了處理表單數據所用CGI程序的URL以及數據提交到服務器的方法;

表單域:包含了文本框、密碼框、隱藏域、多行文本框、復選框、單選框、下拉選擇框和文件上傳框等;

表單按鈕:包括提交按鈕、復位按鈕和一般按鈕,用於將數據傳送到服務器上的CGI腳本或者取消輸入,還可以用表單按鈕來控制其他定義了處理腳本的處理工作。

(2)瀏覽器可以解析運行什麽語言。

支持HTML(超文本標記語言)、XML(可擴展標記語言)以及Python、PHP、JavaScript、ASP等眾多腳本語言。

(3)WebServer支持哪些動態語言

JavaScript、ASP、PHP、Ruby等腳本語言,ASP基於IIS WEB SERVER,是微軟的服務器端腳本技術,PHP基於APACHE WEB SERVER,與ASP有幾分類似,都是一種在服務器端執行的嵌入HTML文檔的腳本語言。

實踐過程記錄

1. Apache準備

  • ‘sudo apt-get install apache2‘安裝Apache,發現已安裝
    技術分享圖片

  • 直接使用指令service apache2 start打開Apache服務,使用netstat -aptn查看一下端口占用。
    技術分享圖片

 Apache的工作目錄是/var/www/html
  • 測試:apache可正常工作

方法1:瀏覽器打開 127.0.0.1:8088可正常打開Apache介紹網頁
技術分享圖片

這裏有個小烏龍,英語bug我錯把介紹網頁當成了連接失敗,搞了好久,實際人家的意思是“這是在debian系統上安裝後測試apache2服務器正確操作的默認歡迎頁面。如果您可以讀取此頁面,則表示安裝在此站點的apache http服務器正在正常工作。您應該在繼續操作http服務器之前替換此文件(位於/var/htw/html/index.html)。
如果您是這個網站的正常用戶,不知道這個頁面是關於什麽的,這可能意味著由於維護,該網站目前不可用。如果問題依然存在,請與網站管理員聯系。”

方法2:apache可讀取工作目錄下的文件,vi /var/www/html/test.txt 隨意輸入字符串

技術分享圖片

瀏覽器打開 127.0.0.1:8088/test.txt
可看到test.txt的內容
技術分享圖片

2. Web前端HTML

  • 在/var/www/html目錄下編輯test1.html

    test1.html

<html>
<head>
<meta http-equiv="Content-Type" content="text1/html; charset=utf-8">
<title>圖書館登錄系統</title>
</head>
<body style= "background: url(1.JPG)">
    <div align="center" style="padding-top: 50px;">
        <form action="login" method="post" name="login" >
        <table  width="740" height="300"  >

        <tr height="30">
                <td colspan="2"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%">用戶名:</td>
                <td><input type="text" value="name" name="userName" id="userName"/></td>
                <td width="30%"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%">密  碼:</td>
                <td><input type="password" value="ps" name="password" id="password"/></td>
                <td width="30%"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%"><input type="submit" value="登錄"/></td>
                <td align="center"><input type="button" value="重置" onclick="resetValue()"/></td>
                <td width="30%"></td>
            </tr>
            
            
        </table>
        </form>
    </div>
</body>
</html>

技術分享圖片

技術分享圖片

3. Web前端javascipt

test2.html

<html>
<head>
<meta http-equiv="Content-Type" content="text2/html; charset=utf-8">
<title>圖書館登錄系統</title>
<script type="text/javascript">
    function resetValue(){
        document.getElementById("userName").value="";
        document.getElementById("password").value="";
    }
</script>

</head>
<body style= "background: url(1.JPG)">
    <div align="center" style="padding-top: 50px;">
        <form action="#" method="post" name="login" >
        <table  width="740" height="300"  >

                <td colspan="2"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%">用戶名:</td>
                <td><input type="text" value="name" name="userName" id="userName"/></td>
                <td width="30%"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%">密  碼:</td>
                <td><input type="password" value="ps" name="password" id="password"/></td>
                <td width="30%"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%"><input type="submit" name="login" value="登錄"onClick="return Login()" /></td>
                <td align="center"><input type="button" value="重置" onclick="resetValue()"/></td>
                <td width="30%"></td>
            </tr>
            
            
        </table>
        </form>
    </div>


    <script language="javascript">
    function Login(){
        var UName = document.login.userName.value ;
        var Pword = document.login.password.value ;
        if ((UName =="") || (Pword=="")){
            alert("用戶名或密碼為空!!!");
            return false ;
        }


    }
</script>
</body>
</html>

技術分享圖片

技術分享圖片

4. Web後端:MySQL基礎:正常安裝、啟動MySQL,建庫、創建用戶、修改密碼、建表

  • 輸入/etc/init.d/mysql start指令開啟mysql服務,輸入mysql -u root -p,並根據提示輸入密碼,默認密碼為[email protected],進入MySQL.
  • 對密碼進行修改:輸入use mysql;,選擇mysql數據庫;輸入update user set password=PASSWORD("20165208") where user=‘root‘;,修改密碼;輸入flush privileges;,更新權限;
    技術分享圖片

  • 接著輸入quit退出MySQL,重新進入,使用新密碼登錄成功,說明修改成功.
    技術分享圖片

  • 使用create database 庫名;建立一個數據庫;使用show databases;查看存在的數據庫;使用use 庫名;使用我們創建的數據庫

  • 使用create table 表名 (字段設定列表);建立數據表,數據表是數據庫中一個非常重要的對象,一個數據庫中可能包含若幹個數據表;使用show tables查看存在的數據表:
    技術分享圖片

  • 使用insert into 表名 values(‘值1‘,‘值2‘,‘值3‘...);插入數據;使用select * from 表名查詢表中的數據:
    技術分享圖片

下面是額外的操作,如果你想使用其他用戶登錄的話,可以將這個數據庫授權給另外一個用戶:
grant select,insert,update,delete on 數據庫名.* to 用戶名@登錄主機 identified by "密碼";
解釋一下命令,
grant,授權;
select,insert,update,delete,是權限的類別;
數據庫名.*,是數據庫xxx下的所有表;
to 用戶名@登錄主機,用戶名你自己的,可以是遠程用戶,登錄主機可以寫本機localhost,也可以是遠程IP地址;
identified by "密碼",相當於設置登錄密碼;
這樣寫的大概意思就是告訴MySQL,那個登錄名是xxx,密碼是xxx,地址是xxx的可以操作我的xxx數據庫,允許的操作是select,insert,update,delete。
登錄一下MySQL試一試:
![](https://img2018.cnblogs.com/blog/1283587/201905/1283587-20190513172439751-1417606653.png)

5. Web後端:編寫PHP網頁,連接數據庫,進行用戶認證

  • 在/var/www/html目錄下新建一個PHP測試文件。

    5208_test.php

<?php
  echo ($_GET["a"]);
  include($_GET["a"]);
  echo "This is 20165208 php test page!<br>";
?>
  • 瀏覽器打開localhost:80/5208_test.php?a=/etc/passwd可看到/etc/passwd文件的內容。
    技術分享圖片

  • 接下來,我們利用PHP和MySQL結合之前編的登錄網頁進行簡單的用戶身份認證

test2.html

<html>
<head>
<meta http-equiv="Content-Type" content="text2/html; charset=utf-8">
<title>圖書館登錄系統</title>
<script type="text/javascript">
    function resetValue(){
        document.getElementById("username").value="";
        document.getElementById("password").value="";
    }
</script>

</head>
<body style= "background: url(1.JPG)">
    <div align="center" style="padding-top: 50px;">
        <form action="test2login.php" method="post" name="login" >
        <table  width="740" height="300"  >

                <td colspan="2"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%">用戶名:</td>
                <td><input type="text" value="" name="username" id="username"/></td>
                <td width="30%"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%">密  碼:</td>
                <td><input type="password" value="" name="password" id="password"/></td>
                <td width="30%"></td>
            </tr>
            <tr height="1">
                <td width="40%"></td>
                <td width="5%"><input type="submit" name="login" value="登錄"onClick="return Login()" /></td>
                <td align="center"><input type="button" value="重置" onclick="resetValue()"/></td>
                <td width="30%"></td>
            </tr>
            
            
        </table>
        </form>
    </div>


    <script language="javascript">
    function Login(){
        var UName = document.login.username.value ;
        var Pword = document.login.password.value ;
        if ((UName =="") || (Pword=="")){
            alert("用戶名或密碼為空!!!");
            return false ;
        }


    }
</script>
</body>
</html>

test2login.php

<?php

$uname=($_POST["username"]);
$pwd=($_POST["password"]);

/* echo $uname; */

$query_str="SELECT * FROM kytable where username='{$uname}' and password='{$pwd}';";

/* echo "<br> {$query_str} <br>";*/

$mysqli = new mysqli("127.0.0.1", "kongyue", "20165208", "5208_test1");
$query_str1="use kytable;";

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
echo "connection ok!";
/* Select queries return a resultset */
if ($result = $mysqli->query($query_str1))
echo"<br>Success into database!";
echo$uname;
if ($result = $mysqli->query($query_str)) {
    if ($result->num_rows > 0 ){
            echo "<br> {$uname}:Welcome!!! <br> ";
    } 
    else {
        echo "<br> login failed!!!! <br> " ; }
    /* free result set */
    $result->close();
}
$mysqli->close();
?>
  • 先將之前編的登錄網頁的test2.html代碼中form的action屬性改成test2login.php,再在火狐瀏覽器中輸入localhost:80/test2.html訪問自己的登錄頁面。其中127.0.0.1是本機地址,kongyue是MySQL的用戶名,20165208是我之前設置的登錄密碼,5208_test1是數據庫的庫名。登錄時輸入表中帳號密碼進行匹配。
    技術分享圖片

  • 匹配成功
    技術分享圖片

  • 匹配不成功
    技術分享圖片

6. SQL註入

  • SQL註入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令註入到後臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
  • 在用戶名輸入框中輸入‘ or 1=1#,密碼隨便輸入,這時候的合成後的SQL查詢語句為select * from lxmtable where username=‘‘ or 1=1#‘ and password=‘‘,#相當於註釋符,會把後面的內容都註釋掉,而1=1是永真式,所以這個條件肯定恒成立,所以能夠成功登陸:
    技術分享圖片

7. XSS攻擊測試

  • XSS攻擊:跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。故將跨站腳本攻擊縮寫為XSS。XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。比如這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)。這種類型的漏洞由於被駭客用來編寫危害性更大的phishing攻擊而變得廣為人知。對於跨站腳本攻擊,黑客界共識是:跨站腳本攻擊是新型的“緩沖區溢出攻擊“,而JavaScript是新型的“ShellCode”。
  • 我們可以進行一個簡單的測試,在用戶名輸入框中輸入<img src="1.JPG" />20165208</a>讀取/var/www/html目錄下的圖片:
    技術分享圖片

實驗中遇到的問題

在利用PHP和MySQL結合之前編的登錄網頁進行簡單的用戶身份認證時,出現了無論輸入正確的用戶名密碼還是錯誤的,都顯示登錄失敗的情況
技術分享圖片

解決方法:添加$query_str1="use kytable;";即引用數據表。
技術分享圖片

實驗感想

網絡對抗這門課是個綜合性很強的課程,可以與很多我們學過或正在學習的課程融通,比如這次試驗就和上學期的網絡安全編程基礎關聯性很大。通過這次試驗我也溫故知新,復習了上學期所學的Web前端HTML、Web前端javascipt,同時對Web後端:MySQL有了更細的了解,新學習了 Web後端:編寫PHP網頁,收獲還是蠻大的。

2018-2019 20165208 網絡對抗 Exp8 Web基礎