使用HttpOnly Cookies的XSS保护是否有效?

时间:2010-02-16 20:52:06

标签: security cookies xmlhttprequest httponly

我已经对HttpOnly cookie和存在的问题进行了一些研究,可以将XHR请求与TRACE方法结合使用,以便从服务器回送cookie值。

对于安全的Web应用程序,我目前有以下设置:

  • 会话cookie在登录时使用安全和httpOnly属性设置
  • 发送
  • 对整个域禁用TRACE http方法(返回“405 Method not allowed”)

为避免跨站点请求伪造,我在表单的隐藏字段中添加了一个随机键。必须在每个POST请求中返回此密钥才能接受请求。

除此之外,所有HTML都默认使用白名单进行转义,以选择允许的标签和属性,但要说明为什么这还不够:我们之前允许使用span上的style-attribute(例如为文本着色) ),可用于通过以下方式在Internet Explorer中传递javascript:

<span style="width: expression(alert('Example'));"> </span>

然后是最后一个问题:有人能指出这个设置中可能出现的缺陷的任何缺陷或建议吗?或者你使用相同或完全不同的方法?

已知问题:

  • 并非所有浏览器都支持httpOnly
  • 过滤css JS表达式是不够的,@ import(外部样式表)也可以正常工作

2 个答案:

答案 0 :(得分:5)

基于你的帖子(标题有点误导)我假设你明白Httponly属性阻止了通过document.cookie访问cookie,并且没有做任何其他事情来防止XSS允许包括模仿用户的其他讨厌的事情(即,'don'需要窃取cookie并可以使用检索到的CSRF令牌,检查浏览器上的易受攻击的插件以安装恶意软件,安装javascript密钥记录器,扫描内部网络等,重写页面等。

正如您所说,每个标签的白名单标签和属性是不够的。您必须通过白名单正则表达式对属性值应用更严格的验证。

其他需要考虑的其他事项的不完整列表与XSS或CSRF没有直接关系:

  • 你如何处理不完整的HTML,例如缺少结束标签?
  • 如何处理用户输入中的单引号,双引号和反斜杠?
  • 如何处理在不同上下文中输出的用户输入 - 例如在url链接,属性值等中?
  • 您是否检查输入是否与输入字符集编码匹配?
  • 您是否在响应标头和元标记中明确设置了Content-Type?
  • 对于通过HTTP提供的中等敏感用户页面,如果有的话,您是否设置了适当的Cache-Control标头?
  • 您如何确保用户输入沙盒?具体来说,如果您允许CSS,您如何确保样式仅应用于受限区域并且不能更改其他区域?
  • 您是否有第三方javascript,包括网站上的广告?
  • 如果会话cookie应该被保护以防篡改吗?
  • 您是否清理所有输入,包括可由用户修改的HTTP标头?
  • CSRF令牌是否真正随机 - 如果是,您如何生成随机令牌?如果没有,你如何构建它?
  • 您是否使用预准备语句和绑定参数?
  • 用户可以上传文件吗?
  • 您是否为用户上传的内容(如图片等)提供服务?如果是,您如何验证文件内容(GIFAR缺陷)并且是从同一域提供的文件?
  • 您是否提供API访问权限,如果是,则托管在同一个域中?你有什么跨域限制?

答案 1 :(得分:1)

HttpOnly Cookies是一个很好的安全措施,但它不是为了阻止XSS,只是让攻击者更难以利用xss漏洞。让我详细说明一下。

基于令牌的xsrf secuirty系统可以使用XSS绕过,因此攻击者不需要知道cookie来利用xss漏洞。

  

避免跨站点请求伪造我   在隐藏中添加了一个随机密钥   字段到表格。这个关键是必须的   在每个POST请求中返回   请求被接受。

例如,使用XSS攻击者可以执行JavaScript,可以使用xmlhttprequest读取域上的任何页面。因此,通过使用xmlhttprequest,攻击者可以读取XSRF令牌,然后使用它来伪造POST请求。这是因为XSS的一个属性是允许Same Origin Policy中断。作为一个例子,Here是我写的一个现实世界的漏洞,它完成了我刚才解释的内容。

阻止XSS的最佳方法是将像<>这样的通用字符转换为相应的html实体。在PHP中我建议:

$var=htmlspeicalchars($var,ENT_QUOTES);

这将修复单引号和双引号,以便它可以停止大多数 xss。即使产生的刺痛是在html标签中。例如,如果替换引号,攻击者就无法使用此漏洞。这是因为攻击者必须打破引号才能执行“onload =”。

$var="' onload='alert(document.cookie)'";

进入这个html:

print("<img src='http://HOST/img.php?=".$var."'>");

HOWEVER ,您使用<span>标记列出的特定情况仍然可能存在问题,因为攻击者不需要引号!如果你放入<script>标签,你也会有一个xss漏洞。只要确保放置用户输入的位置,就没有针对所有漏洞的“全部捕获”或“银弹”。

利用HTTP“TRACE”方法的“XST”攻击在实践中并不是一种现实的攻击。原因是攻击者无法强制Web浏览器发出“TRACE”http请求。在“GET”的情况下,攻击者可以使用javascript或<img>标记强制执行“GET”和“POST”方法,但HTTP标头的其余部分不受限制。请记住,几乎所有Apache系统都默认启用TRACE,如果它真的很危险,它将被一起删除。如果Apache支持TRACE,许多安全测试工具(如Nessus)将抛出错误,也可以轻松禁用它。