首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减轻节点/快速静态资产请求中反映的XSS

减轻节点/快速静态资产请求中反映的XSS
EN

Security用户
提问于 2015-10-12 08:39:12
回答 1查看 2K关注 0票数 3

我在堆栈溢出上提出了这个问题,因为它与编程问题(如何减轻代码中的漏洞)有关,但我确实有一些更广泛的问题,而且对于如何减轻漏洞缺乏了解。请注意下面的更新部分,我已经在这些链接问题中设置了这里这里的缓解措施。

我已经针对我的节点(速成)/angular应用程序运行了一个pen测试工具(Burp),它特别在尝试静态资产的GET请求时识别了一个反射的XSS漏洞(在用户与应用程序交互时,没有发现任何请求的漏洞)。

问题的细节是:

任意提供的URL参数的名称被复制到没有封装在任何引号中的JavaScript表达式中。有效载荷41b68(a)184a9=1是以任意提供的URL参数的名义提交的。此输入在应用程序的响应中得到了未修改的响应。此行为说明可以将JavaScript命令注入返回的文档。有人试图找出注入任意JavaScript的概念攻击的完整证据,但这并不成功。您应该手动检查应用程序的行为,并试图确定任何不寻常的输入验证或其他可能存在的障碍。

该漏洞通过向请求传递任意url参数进行了测试,如下所示:

代码语言:javascript
复制
GET /images/?41b68(a)184a9=1

答复是:

代码语言:javascript
复制
HTTP/1.1 404 Not Found
X-Content-Security-Policy: connect-src 'self'; default-src 'self'; font-src 'self'; frame-src; img-src 'self' *.google-analytics.com; media-src; object-src; script-src 'self' 'unsafe-eval' *.google-analytics.com; style-src 'self' 'unsafe-inline'
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
Strict-Transport-Security: max-age=10886400; includeSubDomains; preload
X-Download-Options: noopen
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Content-Length: 52
Date: Wed, 08 Oct 2015 10:46:43 GMT
Connection: close

Cannot GET /images/?41b68(a)184a9=1

你可以看到,我有CSP到位(使用头盔执行)和其他保护,以防止利用。该应用程序是通过https提供的,但不需要用户支持。CSP限制来自应用程序域和谷歌分析的请求。

笔试报告建议验证输入(I是,但如果我不是,这肯定会使包括用户发送的数据在内的请求不安全),并编码默认为角的html,加上正在转义GET请求urls (请参见下面的更新)。

我真的很难找到一个解决方案来防止或减轻对静态资产的请求:

  • 我是否应该在csp下白名单所有对我的申请的请求?
  • 我甚至可以这样做,还是它只会白名单域?
  • 从节点/表示到静态资产请求的所有响应是否都能以某种方式编码(请参阅下面关于url转义的更新)?
  • 该报告指出,“任意提供的URL参数的名称被复制到没有封装在任何引号中的JavaScript表达式中”。这个表达式是否在处理返回静态资产的快速代码中?
  • 或者,GET请求param可以在我的应用程序代码中以某种方式进行评估?

更新

在对此做了一些调查之后,似乎至少部分缓解措施是针对以url param值转义数据清除url中的输入的。

网址的逃逸已经到位,因此:

代码语言:javascript
复制
curl 'http://mydomain/images/?<script>alert('hello')</script>'

返回

代码语言:javascript
复制
Cannot GET /images/?<script>alert(hello)</script>

我还在此基础上设置了快速消毒

但是,如果我卷曲原始测试,请求param仍然会被反射回来。

代码语言:javascript
复制
curl 'http://mydomain/images/?41b68(a)184a9=1'
Cannot GET /images/?41b68(a)184a9=1

这是您所期望的,因为html没有插入到url中。

对于静态资产的GET请求的响应都是由app.use(express.static('static-dir'))处理的,所以查询被传递到这里。express.static是基于静态发球的,它依赖于帕瑟尔

EN

回答 1

Security用户

回答已采纳

发布于 2015-10-12 09:43:28

造成此问题的原因是,对于无效的GET请求,快递将返回如下内容:

代码语言:javascript
复制
Cannot GET /pathname/?yourQueryString

在许多情况下,这是一个有效的响应,即使是服务静态资产。但是,在我的情况下--我确信对于其他人来说--对静态资产的唯一有效请求是这样的:

代码语言:javascript
复制
GET /pathname/your-file.jpg

我有一个自定义404处理程序,它返回一个数据对象:

代码语言:javascript
复制
var data = {
    status: 404,
    message: 'Not Found',
    description: description,
    url: req.url
}; 

这仅对app.js中的无效模板请求进行处理,其中:

代码语言:javascript
复制
app.use('/template-path/*', function(req, res, next) {
    custom404.send404(req, res);
});

我现在已经将请求的显式处理程序添加到静态文件夹中:

代码语言:javascript
复制
app.use('/static-path/*', function(req, res, next) {
        custom404.send404(req, res);
});

在返回404之前,我还可以选择删除请求查询参数:

代码语言:javascript
复制
var data = {
    status: 404,
    message: 'Not Found',
    description: description,
    url: url.parse(req.url).pathname // needs a var url = require('url')
};
票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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