第四課-WEB應(yīng)用安全攻防實(shí)訓(xùn)-SQL注入攻擊-第二講_第1頁(yè)
第四課-WEB應(yīng)用安全攻防實(shí)訓(xùn)-SQL注入攻擊-第二講_第2頁(yè)
第四課-WEB應(yīng)用安全攻防實(shí)訓(xùn)-SQL注入攻擊-第二講_第3頁(yè)
第四課-WEB應(yīng)用安全攻防實(shí)訓(xùn)-SQL注入攻擊-第二講_第4頁(yè)
第四課-WEB應(yīng)用安全攻防實(shí)訓(xùn)-SQL注入攻擊-第二講_第5頁(yè)
已閱讀5頁(yè),還剩21頁(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)介

1、WEBWEB應(yīng)用安全攻防實(shí)訓(xùn)應(yīng)用安全攻防實(shí)訓(xùn) 之四之四SKLIOS概覽概覽p4.1 4.1 什么是什么是SQLSQL注入攻擊注入攻擊p4.2 SQL4.2 SQL注入攻擊過(guò)程注入攻擊過(guò)程p 漏洞診斷方法p 典型數(shù)據(jù)庫(kù)攻擊技巧p4.3 4.3 專業(yè)注入工具專業(yè)注入工具p 4.4 4.4 如何防范如何防范SQLSQL注入攻擊注入攻擊SKLIOS需求分析需求分析設(shè)計(jì)設(shè)計(jì)實(shí)現(xiàn)實(shí)現(xiàn)測(cè)試測(cè)試安全需求工程安全需求工程設(shè)計(jì)安全設(shè)計(jì)安全發(fā)布發(fā)布安全編碼安全編碼補(bǔ)丁管理補(bǔ)丁管理配置加固配置加固軟件黑盒測(cè)試軟件黑盒測(cè)試滲透性測(cè)試滲透性測(cè)試代碼安全審計(jì)代碼安全審計(jì)編碼階段:安全編碼規(guī)范(輸入編碼階段:安全編碼規(guī)范(輸

2、入驗(yàn)證、遵循安全驗(yàn)證、遵循安全SQL編碼規(guī)范)編碼規(guī)范)測(cè)試階段:代碼審計(jì)、測(cè)試階段:代碼審計(jì)、SQL注入注入測(cè)試等,可手工,也可以結(jié)合自測(cè)試等,可手工,也可以結(jié)合自動(dòng)工具動(dòng)工具部署階段:數(shù)據(jù)庫(kù)安全加固、部署階段:數(shù)據(jù)庫(kù)安全加固、Web應(yīng)用防火墻、應(yīng)用防火墻、IDS/IPSp 安全軟件開發(fā)生命周期依然是安全軟件開發(fā)生命周期依然是WebWeb安全的基石安全的基石如何預(yù)防如何預(yù)防SQLSQL注入攻擊?注入攻擊?SKLIOS常用常用SQLSQL注入解決方案注入解決方案p 1 1,檢查輸入數(shù)據(jù)的合法性;檢查輸入數(shù)據(jù)的合法性;p 2 2,處理特殊字符;處理特殊字符;p 3 3,使用參數(shù)代碼機(jī)制;使用參數(shù)

3、代碼機(jī)制;p 4 4,屏蔽錯(cuò)誤信息;屏蔽錯(cuò)誤信息;p 5 5,加固數(shù)據(jù)庫(kù);加固數(shù)據(jù)庫(kù);p 6 6,加密存儲(chǔ)敏感信息;加密存儲(chǔ)敏感信息;p 7 7,檢測(cè)并修復(fù)檢測(cè)并修復(fù)SQLSQL注入漏洞;注入漏洞;p 8 8,其它方法。其它方法。SKLIOS1,1,檢查輸入數(shù)據(jù)的合法性檢查輸入數(shù)據(jù)的合法性pnet userpxp_cmdshellp/addpexec master.dbo.xp_cmdshellpnet localgroup administratorspselectpcountpAscpcharpmidpp:p“pinsertpdelete frompdrop tablepupdateptr

4、uncatepfromp%SKLIOS示例示例1_1_檢查輸入數(shù)據(jù)的合法性檢查輸入數(shù)據(jù)的合法性dim rsdim rsadmin1=request(admin)admin1=request(admin)password1=request(password)password1=request(password)set rs=server.CreateObject(ADODB.RecordSet)set rs=server.CreateObject(ADODB.RecordSet)rs.open rs.open select select * * from admin where admin= &

5、amp; admin1 & and password=& from admin where admin= & admin1 & and password=& password1 &,password1 &,conn,1conn,1if rs.eof and rs.bof thenif rs.eof and rs.bof thenresponse.writealert(response.writealert(用戶名或密碼不正確!用戶名或密碼不正確!););response.writejavascript:history.go(-1)resp

6、onse.writejavascript:history.go(-1)response.endresponse.endelseelsesession(admin)=rs(admin)session(admin)=rs(admin)session(password)=rs(password)session(password)=rs(password)session(aleave)=rs(aleave)session(aleave)=rs(aleave)response.redirect admin.aspresponse.redirect admin.aspend ifend ifrs.clos

7、ers.closeset rs=nothing set rs=nothing SKLIOS示例示例1 1(續(xù)續(xù)1 1)p 分析:分析:p 在用戶名和密碼那里都填入 OR = ,p SQL語(yǔ)句被構(gòu)造成select select * * from admin where from admin where admin= admin= OROR = = andand password= password= OROR = = p 意思是當(dāng)admin為空或者空等于空,password為空或者空等于空的時(shí)候整個(gè)查詢語(yǔ)句就為真。 SKLIOS示例示例1 1(續(xù)續(xù)2 2) p 如何修補(bǔ)漏洞?如何修補(bǔ)漏洞?p 過(guò)

8、濾掉其中的特殊字符。p 這里我們就過(guò)濾掉其中的“”,即是把程序的頭兩行改為:admin1=replace(trim(request(admin),)password1=replace(trim(request(password),) SKLIOS示例示例2_2_檢查輸入數(shù)據(jù)的合法性檢查輸入數(shù)據(jù)的合法性Dim Tc_Post,Tc_Get,Tc_In,Tc_Inf,Tc_XhDim Tc_Post,Tc_Get,Tc_In,Tc_Inf,Tc_Xh定義需要過(guò)濾的字串定義需要過(guò)濾的字串Tc_In=|;|and|(|)|exec|insert|select|delete|update|count|T

9、c_In=|;|and|(|)|exec|insert|select|delete|update|count|* *|%|chr|mid|master|or|%|chr|mid|master|or|char|declare char|declare Tc_Inf = split(Tc_In,|)Tc_Inf = split(Tc_In,|)處理處理postpost數(shù)據(jù)數(shù)據(jù)If Request.Form ThenIf Request.Form ThenFor Each Tc_Post In Request.FormFor Each Tc_Post In Request.FormFor Tc_Xh

10、=0 To Ubound(Tc_Inf)For Tc_Xh=0 To Ubound(Tc_Inf)If Instr(LCase(Request.Form(Tc_Post),Tc_Inf(Tc_Xh)0 ThenIf Instr(LCase(Request.Form(Tc_Post),Tc_Inf(Tc_Xh)0 ThenResponse.Write alert(Response.Write alert(請(qǐng)不要在參數(shù)中包含非法字符嘗請(qǐng)不要在參數(shù)中包含非法字符嘗試注入!試注入!););處理處理getget數(shù)據(jù)數(shù)據(jù)If Request.QueryString ThenIf Request.Query

11、String ThenFor Each Tc_Get In Request.QueryStringFor Each Tc_Get In Request.QueryStringFor Tc_Xh=0 To Ubound(Tc_Inf)For Tc_Xh=0 To Ubound(Tc_Inf)If Instr(LCase(Request.QueryString(Tc_Get),Tc_Inf(Tc_Xh)0 ThenIf Instr(LCase(Request.QueryString(Tc_Get),Tc_Inf(Tc_Xh)0 ThenResponse.Write alert(Response.W

12、rite alert(請(qǐng)不要在參數(shù)中包含非法字符嘗請(qǐng)不要在參數(shù)中包含非法字符嘗試注入!試注入!); ); SKLIOS1,1,檢查輸入數(shù)據(jù)的合法性檢查輸入數(shù)據(jù)的合法性p 服務(wù)器端正式處理之前服務(wù)器端正式處理之前p 所有可能的用戶輸入點(diǎn):所有可能的用戶輸入點(diǎn):GetGet,PostPost,CookieCookie,其他其他HTTPHTTP頭,頭, p 客戶端客戶端& &服務(wù)器端服務(wù)器端p TipsTipsp 確認(rèn)每種數(shù)據(jù)的類型,比如數(shù)字型的數(shù)據(jù)就必須是數(shù)字,數(shù)據(jù)庫(kù)中的存儲(chǔ)字段必須對(duì)應(yīng)為int型。p 限定輸入數(shù)據(jù)長(zhǎng)度,使較長(zhǎng)的SQL注入語(yǔ)句無(wú)法正確執(zhí)行。p 栓查提取數(shù)據(jù)的查詢所返

13、回的記錄數(shù)量。如果程序只要求返回一個(gè)記錄,但實(shí)際返回的記錄卻超過(guò)一行,那就當(dāng)作出錯(cuò)處理。SKLIOS2,2,處理特殊字符處理特殊字符p ;“ “ & / & /* * * */ - / - p 在在UIUI部分檢查部分檢查p 轉(zhuǎn)義轉(zhuǎn)義p 編碼轉(zhuǎn)換編碼轉(zhuǎn)換p 刪除刪除p TipsTipsp 替換單引號(hào),即把所有單獨(dú)出現(xiàn)的單引號(hào)改成兩個(gè)單引號(hào),防止攻擊者修改SQL命令的含義。p 刪除用戶輸入中注釋符號(hào),防止攻擊者構(gòu)造出下類查詢:SELECT * from Users WHERE login = mas - AND password =SKLIOS示例示例3_3_處理特殊字符處理特殊

14、字符p private static string ConvertSql(string sql)private static string ConvertSql(string sql) sql = sql.Replace(, ); / sql = sql.Replace(, ); / ADO.NET已經(jīng)做了,不要自己做 sql = sql.Replace(, ); / sql = sql.Replace(, ); / 這句話一定要在下面兩個(gè)這句話一定要在下面兩個(gè)語(yǔ)句之前,否則作為轉(zhuǎn)義符的方括號(hào)會(huì)被當(dāng)作數(shù)據(jù)被再次處理語(yǔ)句之前,否則作為轉(zhuǎn)義符的方括號(hào)會(huì)被當(dāng)作數(shù)據(jù)被再次處理p sql = sql.R

15、eplace(_, _);sql = sql.Replace(_, _); sql = sql.Replace(%, %); sql = sql.Replace(%, %); return sql; return sql; SKLIOSPHPPHP:magic_quotes_gpcmagic_quotes_gpc但是在上面的代碼示范中,攻擊者可以利用但是在上面的代碼示范中,攻擊者可以利用%2527%2527繞過(guò)這項(xiàng)過(guò)濾。繞過(guò)這項(xiàng)過(guò)濾。原因是服務(wù)器首先原因是服務(wù)器首先URLURL解碼將解碼將%2527%2527解碼為解碼為%27%27,然后經(jīng)過(guò),然后經(jīng)過(guò)magic_quotes_gpcmagic

16、_quotes_gpc過(guò)濾時(shí)不做處理,最后在代碼處又進(jìn)行一次過(guò)濾時(shí)不做處理,最后在代碼處又進(jìn)行一次urldecodeurldecode,%27%27被解碼為被解碼為,從而繞開了,從而繞開了PHPPHP缺省的過(guò)濾機(jī)制。缺省的過(guò)濾機(jī)制。$magic_quotes_runtime = “on”;$url = urldecode($_REQUESTurl);$query = “INSERT INTO tbl_links (type, url) VALUES(1, $url)”;高版本高版本PHP缺省設(shè)置缺省設(shè)置magic_quotes_gpc為打開,這樣一切為打開,這樣一切g(shù)et,post,cooki

17、e中的中的,null都將被特殊處理為都將被特殊處理為,0,可以防范大多數(shù)可以防范大多數(shù)字符串字符串SQL注入注入以及空字節(jié)注入。以及空字節(jié)注入。SKLIOS3,3,使用參數(shù)代碼機(jī)制使用參數(shù)代碼機(jī)制p 所有的查詢語(yǔ)句都使用數(shù)據(jù)庫(kù)提供的參數(shù)化查詢接口所有的查詢語(yǔ)句都使用數(shù)據(jù)庫(kù)提供的參數(shù)化查詢接口,參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶輸入變量嵌入,參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶輸入變量嵌入到到SQLSQL語(yǔ)句中語(yǔ)句中p 當(dāng)前幾乎所有的數(shù)據(jù)庫(kù)系統(tǒng)都提供了參數(shù)化當(dāng)前幾乎所有的數(shù)據(jù)庫(kù)系統(tǒng)都提供了參數(shù)化SQLSQL語(yǔ)句語(yǔ)句執(zhí)行接口執(zhí)行接口p 使用此接口可以非常有效的防止使用此接口可以非常有效的防止SQLSQL

18、注入攻擊。注入攻擊。SKLIOS示例示例4_4_使用參數(shù)代碼機(jī)制使用參數(shù)代碼機(jī)制p string sql = SELECT T2.dep_code, T2.dep_name from DEP ;string sql = SELECT T2.dep_code, T2.dep_name from DEP ;sql += WHERE T2.dep_name like (%+ sql += WHERE T2.dep_name like (%+ Param + %) ;Param + %) ;SqlCommand sqlCommand = new SqlCommand(sql,cn);SqlComman

19、d sqlCommand = new SqlCommand(sql,cn);sqlCommand.Parameters.Add(new SqlParameter(Param,s);sqlCommand.Parameters.Add(new SqlParameter(Param,s);p 其中的其中的ParamParam就是參數(shù)名,就是參數(shù)名,s s則是用戶輸入的查詢條件字串。則是用戶輸入的查詢條件字串。 使用這種參數(shù)化查詢的辦法,防止使用這種參數(shù)化查詢的辦法,防止SQLSQL注入的任務(wù)就交給注入的任務(wù)就交給ADO.NETADO.NET了。了。p 問題:?jiǎn)栴}:查詢結(jié)果是否正確?查詢結(jié)果是否正確?

20、SKLIOS示例示例4 4(續(xù)續(xù)1 1)- -消除參數(shù)化查詢對(duì)結(jié)果正確性的影響消除參數(shù)化查詢對(duì)結(jié)果正確性的影響p 通配符問題:通配符問題:_ %_ %p WHERE T2.name like (%+ WHERE T2.name like (%+ ParamParam + %) + %)p 用戶輸入包括通配符時(shí),結(jié)果可能不正確p 處理方法處理方法p 通配符轉(zhuǎn)義為普通數(shù)據(jù):WHERE T2.name like (%+ _ + %)p 代碼解決方法代碼解決方法p SqlCommand sqlCommand = new SqlCommand(sql,cn);s = s = s.Replaces.Rep

21、lace(%, %);s = (%, %);s = s.Replaces.Replace(_, _);(_, _);sqlCommand.Parameters.Add(new SqlParameter(Param,s);SKLIOS示例示例4 4(續(xù)續(xù)2 2)- -消除參數(shù)化查詢對(duì)結(jié)果正確性的影響消除參數(shù)化查詢對(duì)結(jié)果正確性的影響p 問題問題p 用戶輸入包括“”而不包括“ ”時(shí),結(jié)果可能不正確p WHERE T2.name like (%+ + %) 等價(jià)于 WHERE T2.name like (%+ + %)p 處理方法處理方法p “”轉(zhuǎn)義:s = s.Replace(, );p 代碼解決方

22、法代碼解決方法p SqlCommand sqlCommand = new SqlCommand(sql,cn);s = s = s.Replaces.Replace(, );(, ); s = s.Replace(%, %);s = s.Replace(_, _);sqlCommand.Parameters.Add(new SqlParameter(Param,s);SKLIOSJSPJSP:PreparedStatementPreparedStatement在在JSPJSP中要禁止使用中要禁止使用StatementStatement,如下的代碼會(huì)導(dǎo)致,如下的代碼會(huì)導(dǎo)致SQLSQL注入:注入:

23、BubbleString sql = “select * from Users where name=” + name; PreparedStatement pstmt = con.prepare(sql);String sql = “select * from product where cat=? and price ?”PreparedStatement pstmt = con.prepare(sql);pstmt.setInt(1, request.getParameter(“cat”);pstmt.setString(2, request.getParameter(“price”);

24、ResultSet rs = pstmt.executeQuery(); Statement stmt = con.createStatement(); stmt.executeUpdate(select * from Users where name= + name); 應(yīng)當(dāng)全部使用應(yīng)當(dāng)全部使用PreparedStatementPreparedStatement來(lái)防止來(lái)防止SQLSQL注入注入但是在使用但是在使用PreparedStatementPreparedStatement,也要注意符合編碼規(guī)范,如下的方法,也要注意符合編碼規(guī)范,如下的方法也會(huì)導(dǎo)致也會(huì)導(dǎo)致SQLSQL注入:注入:安全安

25、全危險(xiǎn)危險(xiǎn)危險(xiǎn)危險(xiǎn)SKLIOSASP.NETASP.NET:SqlParameterCollectionSqlParameterCollection在在ASP.NETASP.NET中要使用中要使用SqlParameterCollectionSqlParameterCollection來(lái)防止來(lái)防止SQLSQL注入:注入:BubbleSqlDataAdapter myDataAdapter = new SqlDataAdapter( SELECT au_lname, au_fname FROM Authors WHERE au_id = au_id, connection); myCommand.

26、SelectCommand.Parameters.Add(au_id, SqlDbType.VarChar, 11); myCommand.SelectCommand.Parametersau_id.Value = SSN.Text; myDataAdapter.Fill(userDataset); JSP實(shí)例中的實(shí)例中的setInt, setString,ASP.NET實(shí)例中的實(shí)例中的SlqDbType.VarChar 都充分利用了語(yǔ)言本身提供的功能去進(jìn)行強(qiáng)類型檢都充分利用了語(yǔ)言本身提供的功能去進(jìn)行強(qiáng)類型檢查。而最早的查。而最早的ASP就缺乏這種機(jī)制,這也是為何就缺乏這種機(jī)制,這也是為何AS

27、P是最容易進(jìn)行是最容易進(jìn)行SQL注入的語(yǔ)言。注入的語(yǔ)言。SKLIOS, ,屏蔽錯(cuò)誤信息屏蔽錯(cuò)誤信息p 避免網(wǎng)站顯示避免網(wǎng)站顯示SQLSQL錯(cuò)誤信息,比如類型錯(cuò)誤、字段錯(cuò)誤信息,比如類型錯(cuò)誤、字段不匹配等,防止攻擊者利用這些錯(cuò)誤信息進(jìn)行一些不匹配等,防止攻擊者利用這些錯(cuò)誤信息進(jìn)行一些判斷。判斷。p 調(diào)整調(diào)整IEIE的配置:由的配置:由IEIE菜單依次進(jìn)入菜單依次進(jìn)入 工具工具-Internet-Internet選選項(xiàng)項(xiàng) 高級(jí)高級(jí) 瀏覽瀏覽 ,勾選,勾選“顯示友好顯示友好HTTPHTTP錯(cuò)誤信錯(cuò)誤信息息”。SKLIOS安全編碼安全編碼p 安全編碼不難,真正困難的是如何做到全面安全,安全編碼不難,真正困難的是如何做到全面安全,這需要良好的程序設(shè)計(jì)以及編碼習(xí)慣。支離破碎的這需要良好的程序設(shè)計(jì)以及編碼習(xí)慣。支離破碎的設(shè)

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論