ASP.NET虛擬機器主機中Forms Authentication的安全性

來源:互聯網
上載者:User
asp.net|安全|安全性|虛擬機器主機
原創 By Fancyf(Fancyray) http://blog.csdn.net/fancyf/
    寫完了《ASP.NET Forms Authentication所產生Cookie的安全性》,覺得可以為Forms的安全性鬆一口氣了,結果最初提出問題的貼主又提到了一個問題:MachineKey是怎樣實現的?同一台虛擬機器主機上不同的Web Application所使用的MachineKey是不是一樣的?上次沒想到這個為題,再做一下實驗。
    實驗思路:在同一台電腦上建立一個WebApplication,所綁定的網域名稱不一樣,也不在同一個應用程式集區中。在建立的WebApplication產生一個Cookie,把值拿到原先的WebApplication中看看能否通過驗證。
    實驗過程:為了綁定不同的網域名稱,在這台電腦上啟動了DNS服務,並將網路連接中的DNS伺服器指向了這台電腦的IP。根據FormsAuthenticationTicket建構函式的原型:
public FormsAuthenticationTicket(int version, string name, DateTime issueDate, DateTime expiration, bool isPersistent, string userData, string cookiePath)
    以及在GetAuthCookie(...)中的調用方法:
FormsAuthenticationTicket ticket1 = new FormsAuthenticationTicket(1, userName, DateTime.Now, createPersistentCookie ? DateTime.Now.AddYears(50) : DateTime.Now.AddMinutes((double) FormsAuthentication._Timeout), createPersistentCookie, "", strCookiePath);
    決定在測試頁面上放兩個文字框,一個是使用者名稱txtUsername2,一個是時間txtGenDate(代替DateTime.Now),然後在Generation按鈕的Click事件中這樣寫:
DateTime genDate = DateTime.Parse(this.txtGenDate.Text);
FormsAuthenticationTicket ticket1 = new FormsAuthenticationTicket(1, this.txtUsername2.Text, genDate, genDate.AddYears(50), true, "", "/");
this.lblEncryptedCookie.Text = FormsAuthentication.Encrypt(ticket1);
    運行發現,對相同的使用者名稱和產生時間,FormsAuthentication.Encrypt(ticket1)所得到的結果每次都不一樣,但是每個結果都是有效。
    現在把這個頁面拿到建立立的WebApplication中運行,把得到的一組結果放在了原WebApplication的Login.aspx頁面上:
<script language=javascript>
 document.cookie="MyLab=5623DE03BE6EE52298F721B181C83F77A97688BB5268602DE80C1A3DB07B7A1FFB828080BD0785B18BB8072996C2E241FD9A54F0ADDD8500C2C510DB54C31A40C8614541A9CF9C1A";
</script>
    在原WebApplication程式中啟動一個非登入頁面(upload.aspx),結果正常跳轉到了login.aspx頁面。此時應該已經執行了上面的js程式,也就是說另一個程式中產生的cookie已經生效了。直接再次輸入upload.aspx的URL,結果通過了驗證!此時通過ieHttpHeaders可以清楚地看到,瀏覽器發送的請求中有這個值"MyLab=5623DE03BE6EE52298F721B181C83F77A97688BB5268602DE80C1A3DB07B7A1FFB828080BD0785B18BB8072996C2E241FD9A54F0ADDD8500C2C510DB54C31A40C8614541A9CF9C1A"。

    這說明,MachineKey的確只與Machine有關,而與WebApplication無關。一個Application產生的Cookie也可以通過其他Application的Forms驗證!值得擔心的事情終於出現了。A和B兩個WebApplication在同一台電腦上的兩個不同的虛擬機器主機,A中使用了Forms驗證。B只要執行:
DateTime genDate = DateTime.Parse(this.txtGenDate.Text);
FormsAuthenticationTicket ticket1 = new FormsAuthenticationTicket(1, this.txtUsername2.Text, genDate, genDate.AddYears(50), true, "", "/");
this.lblEncryptedCookie.Text = FormsAuthentication.Encrypt(ticket1);
    這樣一段代碼可以產生在A中合法的一個使用者名稱所對應的Cookie,B通過偽造Cookie的方式向A發出請求,就可以通過A的驗證,從而獲的任何一個使用者的許可權!這一切都太簡單了,不需要任何高深的技術,只要A和B在同一台電腦上!!!而且根據《ASP.NET Forms Authentication所產生Cookie的安全性》得出的結論,A無論是修改B所冒用的使用者的密碼還是在A上登出這個使用者,都無法阻止B的行為,除非禁用這個使用者名稱,而且不讓B獲得任何一個合法的使用者名稱才能避免再次被仿冒。
    這下我是不敢在虛擬機器主機上僅僅使用Forms驗證了。如果你的ASP.NET主機上還有其他使用者,還是儘快加強安全措施吧。Forms驗證根本就不是給虛擬機器主機的使用者用的,也根本沒有考慮虛擬機器主機的安全性。
 

    免責聲明:本文僅僅是從技術的角度來探討系統的安全性,任何人對本文的使用僅限於加強自己的網站的安全性,不得利用本文的內容從事非法活動。且作者不承擔任何人利用本文給第三方造成的損失。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。