《Web安全程序設(shè)計(jì)與實(shí)踐》課件項(xiàng)目3_第1頁
《Web安全程序設(shè)計(jì)與實(shí)踐》課件項(xiàng)目3_第2頁
《Web安全程序設(shè)計(jì)與實(shí)踐》課件項(xiàng)目3_第3頁
《Web安全程序設(shè)計(jì)與實(shí)踐》課件項(xiàng)目3_第4頁
《Web安全程序設(shè)計(jì)與實(shí)踐》課件項(xiàng)目3_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

項(xiàng)目3萬能密碼登錄——Post型注入攻擊【項(xiàng)目描述】本項(xiàng)目對Post型SQL注入攻擊和防護(hù)進(jìn)行實(shí)訓(xùn)。本項(xiàng)目包含四個(gè)任務(wù),首先建立建立用戶信息數(shù)據(jù)庫,然后開發(fā)一個(gè)基于Session驗(yàn)證的用戶登錄功能網(wǎng)站,并在網(wǎng)頁表單使用Post的方式提交用戶參數(shù)。接下來實(shí)現(xiàn)基于SQL注入方式的萬能密碼登錄。最后通過分析萬能密碼SQL注入的原理,實(shí)現(xiàn)對Post型SQL注入攻擊的多種防護(hù)方式。通過本項(xiàng)目的實(shí)訓(xùn),可以解釋和分析萬能密碼登錄漏洞為例子的Post型SQL注入原理及危害,應(yīng)用多種方式實(shí)現(xiàn)SQL注入攻擊的防護(hù)。【知識儲備】HTML的Post與Get提交信息方式Post型SQL注入攻擊使用了HTML的Post提交信息方式。在HTML中,經(jīng)常會用表單<form>進(jìn)行信息的收集,然后提交給服務(wù)器進(jìn)行處理。HTML提交信息的方式有Get和Post兩種。Get方式Post方式在URL顯示表單參數(shù)的key/value值不在URL里顯示表單的數(shù)據(jù)長度有限制,只適合有少量參數(shù)的表單表單提交的信息沒有長度限制歷史參數(shù)保留在瀏覽器歷史中參數(shù)不會保存在瀏覽器歷史中可以通過保留URL的方式保存數(shù)據(jù)不能通過保留URL保存數(shù)據(jù)刷新不會重新提交刷新會重新提交表單的數(shù)據(jù)集的值必須為ASCII字符沒有限制表

3?1Post方式與Get方式的主要區(qū)別Session機(jī)制的原理HTTP協(xié)議是無狀態(tài)的,也就是說,客戶端的每個(gè)HTTP請求都是獨(dú)立的,與前面或者后面的HTTP請求都沒有直接聯(lián)系。這樣的好處是,服務(wù)器不需要為每個(gè)連接維持狀態(tài)而消耗大量資源。最初設(shè)計(jì)的HTTP協(xié)議只是用來瀏覽靜態(tài)文件,無狀態(tài)特點(diǎn)已經(jīng)足夠。但是隨著Web應(yīng)用的發(fā)展,需要變得有狀態(tài),比如需要保持用戶的登錄狀態(tài)。Session機(jī)制就是用來保存用戶登錄狀態(tài)的。用戶提交登錄信息并通過驗(yàn)證之后,在服務(wù)器將用戶信息保存在Session變量中,在用戶的瀏覽器則保存這個(gè)Session的ID(即SessionID)。當(dāng)用戶再次訪問這個(gè)服務(wù)器時(shí)會將此SessionID提交,服務(wù)器便可以驗(yàn)證此SessionID是否存在于Session變量中,進(jìn)而判斷是否為登錄用戶基于Session機(jī)制的Web登錄驗(yàn)證過程用戶賬號信息提交在Web服務(wù)器建立Session會話退出登錄萬能密碼SQL注入攻擊的原理所謂萬能密碼,就是通過在輸入的用戶名或者密碼構(gòu)造出一個(gè)特殊的SQL語句,破壞原有的SQL語句結(jié)構(gòu)和邏輯,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令,進(jìn)而繞過權(quán)限檢查登錄系統(tǒng)。由于用戶登錄基本都是使用HTML的Post方式提交賬號和密碼等信息,因此萬能密碼登錄是一種典型的Post型SQL注入攻擊。SQL注入攻擊的危害雖然Post型和Get型注入攻擊在方式上有所區(qū)別,但都是通過破壞正常的SQL語句結(jié)構(gòu),實(shí)現(xiàn)對數(shù)據(jù)庫非正常增刪改查。SQL注入攻擊的危害主要體現(xiàn)在:繞過登錄檢查;獲取、篡改數(shù)據(jù)庫信息;篡改網(wǎng)頁內(nèi)容、網(wǎng)頁掛馬;控制網(wǎng)站、甚至整個(gè)服務(wù)器等?!救蝿?wù)3-1】創(chuàng)建數(shù)據(jù)庫本任務(wù)采用SQL腳本的方式創(chuàng)建數(shù)據(jù)庫lab。并在該數(shù)據(jù)庫中建立表users,最后插入兩條記錄。在Apache的網(wǎng)站根目錄C:\Apache24\htdocs\下新建一個(gè)文件夾logintest作為本項(xiàng)目的網(wǎng)站目錄?;赟QL腳本的方式創(chuàng)建數(shù)據(jù)庫有兩個(gè)步驟,分別是:創(chuàng)建SQL腳本將腳本文件導(dǎo)入到數(shù)據(jù)庫【任務(wù)3-2】建立基于Session驗(yàn)證的用戶登錄網(wǎng)站在本任務(wù),分別創(chuàng)建用戶登錄HTML頁面和驗(yàn)證登錄的PHP后端頁面,以實(shí)現(xiàn)用戶登錄功能。用戶登錄成功之后會跳轉(zhuǎn)到歡迎頁面,并創(chuàng)建退出登錄頁面銷毀用戶Session。最后進(jìn)行功能測試,以驗(yàn)證所設(shè)計(jì)的功能。3-2-1任務(wù)實(shí)現(xiàn)創(chuàng)建用戶登錄頁面login.html設(shè)置編碼方式為UTF8并保存登錄驗(yàn)證后端頁面歡迎頁面銷毀session頁面3-2-2功能測試打開瀏覽器,在地址欄輸入服務(wù)器的地址和相對路徑以及文件名,即可訪問。本書默認(rèn)的瀏覽器客戶端都是在Web服務(wù)器的本地訪問,在地址欄輸入U(xiǎn)RL的主機(jī)地址都是localhost或者,比如輸入http://localhost/logintest/login.html打開登錄頁面在該頁面點(diǎn)擊超鏈接“歡迎訪問”,進(jìn)入welcome頁面在該頁面點(diǎn)擊超鏈接“退出登錄”,進(jìn)入logout頁面注銷登錄【任務(wù)3-3】萬能密碼SQL注入攻擊測試在本任務(wù),利用萬能密碼進(jìn)行Post型SQL注入攻擊測試,繞過登錄檢查進(jìn)入歡迎頁面。并對萬能密碼注入攻擊的原理進(jìn)行分析,最后討論其它形式的萬能密碼SQL注入及其原理。3-3-1測試過程用戶名注入在Username輸入:'or1=1or',Password隨便輸入(比如輸入123),點(diǎn)擊Submit按鈕則可以登錄進(jìn)入系統(tǒng)注意:引號為英文的單引號在歡迎登錄頁面,可以看到登錄用戶為admin密碼注入在Username隨便輸入(比如輸入admin),在Password輸入'or'1=1,也可以登錄系統(tǒng)其效果與用戶名注入方式相同3-3-2其它形式的萬能密碼'or''=''or‘注意都是單引號將其代入到SQL語句的變量后,則查詢語句變成了:select*fromuserswhereusername=''or''=''or''andpasscode='123'該語句的條件是恒成立的,因此查詢的結(jié)果也是users表的全部記錄--注釋也可以使用注釋的方式實(shí)現(xiàn)萬能密碼,比如'or1=1--'(注意:兩個(gè)連續(xù)的減號后面必須有一個(gè)空格)。將其代入到SQL語句的變量后,則查詢語句變成了:select*fromuserswhereusername=''or1=1--''andpasscode='123'在SQL語句中,兩個(gè)減號表示后面的語句被注釋掉。因此該查詢語句變成了:select*fromuserswhereusername=''or1=1該條件是恒成立的,查詢的結(jié)果也是users表的全部記錄#注釋注釋型的萬能密碼也可以說使用#(即英文的井號),比如'or1=1#。將其代入到SQL語句的變量后,則查詢語句變成了:select*fromuserswhereusername=''or1=1#'andpasscode='123'去掉注釋后的查詢語句變成了:select*fromuserswhereusername=''or1=1該語句的查詢效果與以上相同3-3-3測試分析在用戶名注入情況下,將字符串'or1=1or'代入到check_login.php頁面第16行的變量$username,將字符串123代入到變量$passwd,則SQL查詢語句select*fromuserswhereusername='$username'andpasscode='$passwd'變成了:select*fromuserswhereusername=''or1=1or''andpasscode='123'注意:''為兩個(gè)連續(xù)的單引號。可見,字符串'or1=1or'的第一個(gè)單引號閉合'$username'的第一個(gè)單引號,第二個(gè)單引號閉合'$username'的第二個(gè)單引號。查詢條件or1=1恒成立。在SQL查詢語句中,and的運(yùn)算優(yōu)先級大于or。故在上述SQL查詢語句的where子句中,雖然username=''為假,passcode='123'為假,但是1=1為真,故where子句的條件為永真。在第2種情況下,SQL查詢語句則變成了:select*fromuserswhereusername='admin'andpasscode=''or'1=1'其分析與上一種情況類似。從以上分析可以發(fā)現(xiàn),引起Post型SQL注入的根源在于,PHP代碼使用了SQL語句拼接的方式進(jìn)行數(shù)據(jù)庫操作,而拼接所使用的變量由Post方式提交。因此,用戶可以通過提交包含特殊SQL分界符等內(nèi)容,使得正常的SQL查詢、更新、插入等語句的結(jié)構(gòu)和邏輯功能發(fā)生變化,反而執(zhí)行了攻擊者設(shè)計(jì)的邏輯,造成對系統(tǒng)破壞或者非授權(quán)的訪問。【任務(wù)3-4】萬能密碼SQL注入攻擊防護(hù)在本任務(wù),實(shí)現(xiàn)對萬能密碼SQL注入攻擊的防護(hù)的四種方式,并驗(yàn)證防護(hù)效果。萬能密碼的防護(hù)需要限制用戶的輸入,可以從兩個(gè)方面著手。一方面,可以使用正則表達(dá)式限制用戶輸入;另一方面,可以使用PHP的安全函數(shù)。3-4-1使用正則表達(dá)式限制用戶輸入使用正則表達(dá)式將用戶輸入限制為指定字符組合。這種處理方式是很多網(wǎng)站普遍采用的方式。在用戶注冊時(shí),將用戶名限制為英文字母、數(shù)字和下劃線的組合,避免出現(xiàn)單引號等可以引起SQL注入的符號出現(xiàn),從而避免萬能密碼攻擊。正則表達(dá)式的規(guī)則說明:頭尾兩個(gè)斜杠/是正則表達(dá)式的限定符,表示兩個(gè)斜杠之間就是正則內(nèi)容;^和$是行定位符,分別用來匹配字符串的開頭和結(jié)尾;中括號括住的內(nèi)容只匹配一個(gè)單一的字符,比如[a-z]表示匹配a到z的單個(gè)字符;在花括號里面限制字符出現(xiàn)的個(gè)數(shù),比如[a-z]{5,16}表示匹配a到z的5到16個(gè)字符。使用正則表達(dá)式檢查用戶輸入的用戶名,需要在文件check_login.php中第14行開始添加如下內(nèi)容:intpreg_match(string$pattern,string$subject)函數(shù)用于執(zhí)行一個(gè)正則表達(dá)式匹配。其中參數(shù)$pattern為要搜索的模式,字符串形式;$subject為輸入的字符串。函數(shù)preg_match()在第一次匹配后將會停止搜索,如果出現(xiàn)不匹配的字符將返回0由于正則表達(dá)式限制為5到16個(gè)字母、數(shù)字、或者下劃線組合,如果在用戶名中輸入單引號,或者長度不在范圍,都會得到“用戶名輸入格式錯(cuò)誤”的提示。對輸入密碼的檢查可以使用同樣的方法。3-4-2使用PHP的轉(zhuǎn)義函數(shù)addslashes()函數(shù)addslashes()函數(shù)返回在預(yù)定義字符之前添加反斜杠的字符串mysql_escape_string()或者mysql_real_escape_string()函數(shù)二者都是實(shí)現(xiàn)轉(zhuǎn)義SQL語句中的字符串中的特殊字符,差別較小。在PHP5和PHP7中升級為mysqli_escape_string()和mysqli_real_escape_string()3-4-3MySQLi參數(shù)化查詢參數(shù)化查詢是指與數(shù)據(jù)庫連接并訪問數(shù)據(jù)時(shí),在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù)來給值。在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部分來處理,而是在數(shù)據(jù)庫完成SQL指令的編譯后,再代入?yún)?shù)運(yùn)行。因此就算參數(shù)中有惡意的指令,由于已經(jīng)編譯完成,就不會被數(shù)據(jù)庫運(yùn)行。這個(gè)方法目前已被視為最有效的SQL注入攻擊防護(hù)方式。PHP提供了三種訪問MySQL數(shù)據(jù)庫的擴(kuò)展,即MySQL,MySQLi和PDO。MySQL擴(kuò)展不支持參數(shù)化查詢,MySQLi和PHP數(shù)據(jù)對象(PHPDataObject,PDO)這兩個(gè)新擴(kuò)展都支持參數(shù)化查詢。3-4-4PDO參數(shù)化查詢MySQLi擴(kuò)展雖然比MySQL擴(kuò)展更加優(yōu)化且方便從MySQL擴(kuò)展遷移,但是它只支持MySQL數(shù)據(jù)庫。PDO擴(kuò)展對比MySQLi擴(kuò)展的優(yōu)點(diǎn)是,它是與關(guān)系數(shù)據(jù)庫類型無關(guān)的,可以支持十幾種數(shù)據(jù)庫擴(kuò)展,因此可以很方便的切換數(shù)據(jù)庫,比如從MySQL切換到PostgreSQL、MSSQLServer等。【項(xiàng)目總結(jié)】本項(xiàng)目以萬能密碼登錄為例,對Post型SQL注入進(jìn)行漏洞重現(xiàn)、攻擊測試和漏洞分析,給出了多種防護(hù)方案并進(jìn)行防護(hù)效果測試。攻擊測試分析表明,對HTMLPost方式提交的內(nèi)容,使用傳統(tǒng)字符串拼接方式訪問數(shù)據(jù)庫是Post型SQL注入漏洞的根源。使用基于白名單的正則表達(dá)式過濾用戶提交的用戶名和密碼(如果密碼進(jìn)行了加密或者散列處理則不需要過濾),可以防護(hù)萬能密碼登錄漏洞,但防護(hù)Post提交的其它變量內(nèi)容還需

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論