首先,我們還是來回顧下ASP腳本中Request對象的知識吧,Request對象獲取客戶端提交數(shù)據(jù)常用的是GET和POST二種方式,同時(shí)request對象可以不通過集合來獲得數(shù)據(jù),即直接使用"request("name")"但它的效率低下,容易出錯(cuò),當(dāng)我們省略具體的集合名稱時(shí),ASP是按QueryString,from,cookie,servervariable,集合的順序來搜索的,在request對象成員中集合cookies,它的意思是"讀取用戶系統(tǒng)發(fā)送的所有cookie值,我們從第二講關(guān)于"cookies欺騙入侵和原理"中知道,cookies是保存在客戶端計(jì)算機(jī)的一個(gè)文本文件,可以進(jìn)行修改,這樣一來,我們就可以使用Request.cookie方式來提交變量的值,從而利用系統(tǒng)的漏洞進(jìn)行注入攻擊.
我們首先還是來看看中網(wǎng)景論壇的最新版本"(CNKBBS2007)中網(wǎng)景論壇2007v5.0 "官方下載地址"http://www.cnetking.com/websys2.asp?id=26"發(fā)布時(shí)間是2007-06-06,打開系統(tǒng)的源代碼后,在"user_RxMsg_detail.asp"文件中,有如下代碼:
(調(diào)用opendb.asp文件)
<%
Call CheckUserLogin(username)
Dim action,s,id
id=request("id") (獲取客戶提交的變量,并賦值給id,并沒過濾,也沒有指定采用那種方式提交)
if id<>"" then Call IsNum(bid) (這是程序員的出現(xiàn)地方,注意bid<>id)
conn.execute("update cnk_Users_RxMsg set readed=1 where id="&id) '設(shè)置已讀
rs.open "select * from cnk_users_RxMsg where id="&id,conn,1,3
我們再打開"opendb.asp"文件
<%Option Explicit
Response.Buffer = true%>
(調(diào)用fzr.asp文件)
..................
以現(xiàn)它是連接數(shù)據(jù)庫的文件,其中調(diào)用了fzr.asp文件,我們再打開fzr.asp文件
<%
'--------版權(quán)說明------------------
'SQL通用防注入程序
'Aseanleung
'--------定義部份------------------
Dim Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr
Dim fso1,all_tree2,file1,files,filez,fs1,zruserip
If Request.QueryString<>"" Then (對Request.QueryString提交(客戶采用GET方式提交)的數(shù)據(jù)進(jìn)行判斷,并沒有指明對其它方式提交的數(shù)據(jù)進(jìn)行判斷)
'自定義需要過濾的字串,用 "|" 分隔
Fy_In = "'|;|%|*|and|exec|insert|select|delete|update|count|chr|mid|master|truncate|char|declare|script" (阻止了常用的SQL注入的語句)
Fy_Inf = split(Fy_In,"|")
For Each Fy_Get In Request.QueryString
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then
zruserip=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If zruserip="" Then zruserip=Request.ServerVariables("REMOTE_ADDR")
Response.Write "內(nèi)容含有非法字符!請不要有'或and或or等字符,請去掉這些字符再發(fā)。
"
Response.Write "如是要攻擊網(wǎng)站,系統(tǒng)記錄了你的操作↓
"
Response.Write "操作IP:"&zruserip&"
"
Response.Write "操作時(shí)間:"&Now&"
"
Response.Write "操作頁面:"&Request.ServerVariables("URL")&"
"
Response.Write "提交方式:GET
"
Response.Write "提交參數(shù):"&Fy_Get&"
"
Response.Write "提交數(shù)據(jù):"&Request.QueryString(Fy_Get)
......................
很明顯的看出它是一個(gè)SQL通用防注入程序文件,(以上的紅字是對代碼的解釋)
代碼看好了,我們來整理下思路:由于程序員的出錯(cuò),導(dǎo)致了id沒有被過濾就被帶到SQL語句中查詢,這是注入漏洞產(chǎn)生的原因,雖然程序引入了防注入程序,阻止了常用的SQL語句使用,但只對客戶采用GET方式提交的數(shù)據(jù)進(jìn)行判斷,而沒有對其它方式提交的數(shù)據(jù)進(jìn)行判斷,這樣導(dǎo)致了客戶可以使用Request.cookie方式來提交變量的值,而繞過了SQL防注入程序(總結(jié)下:cookie注入產(chǎn)生的條件:系統(tǒng)直接使用"request("name")"獲取客戶提交的數(shù)據(jù),并對客戶提交的變量沒有過濾,而且在防注入程序中沒有限制Request.cookie,現(xiàn)在防注入程序3.0只是對客戶采用GET和POST提交方式進(jìn)行了限制).
原理講好了,下面我們來學(xué)學(xué)coolie注入語句吧
cookies的注入語句:alert(document.cookie="id="+escape("這就是asp? id=xx后面xx代表的數(shù)值) and (這里是注入攻擊代碼)"));
這兒用到了javascript語言的知識,我把這語句的意思分解如下,以便大家理解:
1:"alert()"顯示信息對話框的alert()方法,它生成的是一個(gè)獨(dú)立的小窗口,稱作對話框,用來顯示一條信息和一個(gè)按鈕.(我們在跨站中常用到)
2:"document.cookie"我們在處理cookie時(shí),javascript將它保存為document對象的一個(gè)屬性,其屬性名稱是cookie,利用這個(gè)屬性,我們可以創(chuàng)建和讀取cookie數(shù)據(jù),在程序中可以使用:"alert(document.cookie)"調(diào)用當(dāng)前頁面的cookie數(shù)據(jù)項(xiàng)值.在我們啟動瀏覽器打開頁面后,如果存在相應(yīng)的cookie,那么它被裝入到document對象的cookie屬性中,document.cookie屬性采用name=value對應(yīng)方式保存各個(gè)cookie數(shù)據(jù)項(xiàng)值.document(文檔)對象表示在瀏覽器里顯示的HTML(向頁面輸出數(shù)據(jù)),cookie屬性是允許讀寫HTTP的cookie;字符串類型