Sql="Select count(*) from Admin Where UserName='"UserName"' and Pwd='"Pwd"'" if rs(0) > 0 then....
這個時候的注入就是用or注入,構造出一個特殊的sql語句: Sql="Select count(*) from Admin Where UserName='' or ''='' and Pwd='' or ''='' " 這就是在用戶名和密碼的文本框都輸入 ' or ''='' 構造出來的,這個時候count(*)的結果必然大于0,它等于你的admin表的記錄數,因為每條記錄都符合select語句的要求。當然我們可以通過制定相應的規則來過濾這種注入信息,同時輔助其他方法,比如我是這樣寫的:
復制代碼 代碼如下:
"select password from Admin where username='"UserName"'" if rs.eof then ... else if rs("password")=request.form("pass") then ... end if end if
這樣的寫法,即使你沒有制定任何規則,那么上述方式也基本無法注入,因為它只能通過第一步檢測,在后面的if rs("password")=request.form("pass") then 這里它就沒有辦法了,因為不會有人給管理員設置' or ''='' 這樣的密碼。這就沒法相等,登錄必然被拒絕。當然,為了穩妥起見,最好兩種辦法同時使用,確保萬無一失。 注入還有一種經常被人忽略的情況,就是cookie注入。在一個參數既可能通過url傳遞,又可能通過表單傳遞的時候,大多數人都會簡寫為request("page")這樣的方式。你輕松了,注入者也輕松了,因為request在不制定具體方法的時候,它嘗試接收參數的順序是QueryString/Form/Cookie,如果注入者偽造一個cookie,然后在瀏覽器中輸入www.sitename.com/shownews.asp,如果shownews.asp里面寫的是request,它就不會報錯,因為程序從cookie中找到了id,如果沒有對這個參數進行檢測,那么注入就可能發生了。這里建議大家用select case或者if來判斷,麻煩了一點,但安全第一呀。 二,ASP上傳漏洞。用過幾種無組件上傳類,大同小異,都缺乏對上傳文件類型的有效檢測,這個問題比較郁悶,現在只能依靠其他手段來手動檢測,而且都是在服務器端的。如果說ASP本身有什么問題的話,就在這里了。 三,后臺權限判斷。看過幾個后臺,權限判斷都是只在登錄的第一個頁面判斷權限,后臺的每個頁面都沒有判斷了。后臺所有頁面都是需要判斷權限的,否則我在瀏覽器里直接輸入某個功能頁面的地址就可以暢通無阻了,你那個后臺登錄還做它干什么呢? 四、忽略服務器端驗證。javascript是個強大的東西,它最常用的功能就是客戶端的檢測,比如不許輸入空字符,或者定義正則表達式完成更高級的檢測,有的程序員覺得這很好,瀏覽器幫助驗證了,客戶端就減少了很多工作量,服務器負擔也小了,性能也優化了。但現在的瀏覽器幾乎都提供了取消javascript支持的選項,也就是說,客戶端提交的信息可能根本就沒有經過檢測就被提交給服務器了。這個時候你那節省下來的服務器資源在安全性面前就顯得微不足道了,所以說客戶端和服務器端的驗證都需要,甚至你在客戶端可以沒有任何驗證,服務器端都必須有驗證。 這同樣適合于處理站外提交的信息。站外提交也可以跳過客戶端驗證的,最簡單的做法就是右鍵查看你的表單源碼,復制到本地,把action的值改成網絡地址,然后去掉客戶端驗證的內容。即使他能夠躲過你的站外提交檢測代碼,也無法跳過服務器端的驗證。當然,如果他提交的內容沒問題,很正常,那站外提交的東西保存也就保存了——可是,如果是這樣,他還搞這么復雜干什么呢? 五、總結。 事實上所有asp可能出現的問題都和一個問題有關,那就是錯誤。要么是程序寫法上出現的錯誤,要么是客戶端提交錯誤參數導致的錯誤。ASP有一個錯誤處理機制,建議大家寫到每頁都要包含進去的那個頁面里,就是on error resume next,忽略錯誤繼續執行,哪怕錯誤導致頁面什么也顯示不出來,它也不會向客戶端透露一點錯誤的內容,有了它能解決不少問題。但最終ASP的安全還是要靠程序員的細心,對于每個可能出現問題的地方都加以處理,這樣的程序才會變得安全。 本文參考了atmo相關文章的很多內容,在此向atmo表示感謝!如果有什么錯漏之處,還希望各位指出! 大家可以多參考下網站上發布的一些webshell攻擊與防范的文章。