首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行XSS和CSRF时,可以通过JavaScript读取和提取HTTP请求头吗?如果是这样的话,是怎么做的?

在执行XSS和CSRF时,可以通过JavaScript读取和提取HTTP请求头吗?如果是这样的话,是怎么做的?
EN

Security用户
提问于 2021-03-01 14:17:36
回答 2查看 5.6K关注 0票数 1

是否可以通过JavaScript读取和提取HTTP请求头?

例如,类似的东西;

代码语言:javascript
复制
var req = new XMLHttpRequest();
req.open(‘GET’, document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders();
console.log(headers);

但是,它不是读取HTTP响应头(如上面的代码段所示),而是读取HTTP请求头?

我问这个问题的原因是,上面的片段(修改为读取请求HTTP头而不是响应headers)将是一个外部JavaScript文件,将通过XSS漏洞成功调用。由于缺乏CORS策略,此处允许使用外部JS文件。上面的代码片段(再次修改为读取请求头)将允许我通过从空(或模拟) HTTP请求中抓取http请求标头来提取HTTP请求头值,然后将特定的请求头(X-CSRF-TOKEN)包含在巧尽心思构建的HTTP请求中,该请求被服务器接受,因此绕过有缺陷的CSRF保护机制以执行CSRF。

我已经在一个本地主机演示中创建了一个功能利用--我在其中创建了一个用于读取响应头的功能,但我需要某种形式的功能,以便JavaScript能够读取。在这种情况下,这是可能的吗?

我在下文稍作详细阐述(请原谅任何重复的细节);

CSRF目标请求包含CSRF令牌(反CSRF保护机制).这是一个静态值,它仅是每个用户会话的唯一值(而不是对单个请求的动态值)--因此这里存在缺陷。我正在尝试创建一个JavaScript文件,我将通过一个跨站点脚本(XSS)缺陷(由于缺乏CORS策略而工作)远程调用该文件,该JavaScript将在受害用户的上下文中执行。因此,HTTP请求头由应用程序自动添加到HTTP请求中,因为我现在正在此本地主机应用程序下在受害用户的上下文中执行客户端请求(基本上就像能够在作为受害者用户进行身份验证时导航网站)。这就是为什么除了我需要通过X-CSRF-TOKEN(或其他方式)提取( XmlHttpRequest )的请求头之外,不需要提供HTTP请求头的原因。我只需要能够读取在XmlHttpRequest中设置的X-CSRF-TOKEN HTTP请求头(而不是响应),提取这个值,并在XmlHttpRequest(或其他什么)中包含一个将被服务器接受的请求,以绕过错误的反CSRF机制并成功地执行CSRF。

我已经为此编写了一个漏洞,但它与header中的HTTP值有关,但是这显然不起作用,因为XSRF-TOKEN cookie在这个上下文中不用于反CSRF。反CSRF机制使用的是X-CSRF-TOKEN HTTP请求头。我想我可以再做一次类似req.open('GET', document.location, false);的事情,因为这将在受害者用户的上下文下执行,在这里提交类似req.open('GET', document.location, false);的内容时刮掉X-CSRF-TOKEN HTTP请求头难道不是很简单吗?

任何帮助都将不胜感激。我希望我已经解释得够好了,让你明白我想做什么(这里已经很晚了)。

谢谢你抽出时间,/J

EN

回答 2

Security用户

回答已采纳

发布于 2021-08-03 13:44:54

看来你只想得到一个反CSRF令牌?您根本不需要查看请求头。为了设置自定义头,初始化的JS需要知道期望值。最有可能的是,您可以将其从JS变量或类似变量中提取出来。或者,如果标题中的值应该与正文中的值相匹配,则只需选择自己的值来发送标头和正文中的值。

如果您必须获得原始值,但不能从JS读取它(或者从DOM中读取它,或者从cookie中读取它,或者从其他客户端可见的数据中重新派生它),那么一种选择就是对相关的XHR和/或获取函数进行转换。通过用公开任何自定义请求头值的函数覆盖这些函数,合法脚本将向注入的脚本泄漏它们的隐藏值。或者,考虑到合法脚本可能必须从服务器获取该头值。因此,您只需从服务器请求头部的源(可能是脚本文件,但可能是JSON之类的数据文件,或者包含内联脚本的HTML文件),并自己解析其中的值。

票数 1
EN

Security用户

发布于 2021-03-06 07:15:35

您可能需要查看服务工作者

服务工作者是实现可编程网络代理的web工作者,该代理可以响应主文档的web/HTTP请求。它能够检查远程服务器的可用性,并在该服务器可用时缓存内容,并在文档后面提供该内容。与任何其他web工作者一样,服务工作者与主文档上下文分开工作。服务工作人员可以在后台处理推送通知和同步数据,缓存或检索资源请求,拦截网络请求,并独立于注册它们的文档接收集中更新,即使该文档没有加载。

还请参阅:FHantke's使用服务工作者实现远程MiTM的方法:https://betterprogramming.pub/man-in-the-middle-attacks-via-javascript-service-workers-52647ac929a2

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/245539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档