我在堆栈溢出上提出了这个问题,因为它与编程问题(如何减轻代码中的漏洞)有关,但我确实有一些更广泛的问题,而且对于如何减轻漏洞缺乏了解。请注意下面的更新部分,我已经在这些链接问题中设置了这里和这里的缓解措施。
我已经针对我的节点(速成)/angular应用程序运行了一个pen测试工具(Burp),它特别在尝试静态资产的GET请求时识别了一个反射的XSS漏洞(在用户与应用程序交互时,没有发现任何请求的漏洞)。
问题的细节是:
任意提供的URL参数的名称被复制到没有封装在任何引号中的JavaScript表达式中。有效载荷41b68(a)184a9=1是以任意提供的URL参数的名义提交的。此输入在应用程序的响应中得到了未修改的响应。此行为说明可以将JavaScript命令注入返回的文档。有人试图找出注入任意JavaScript的概念攻击的完整证据,但这并不成功。您应该手动检查应用程序的行为,并试图确定任何不寻常的输入验证或其他可能存在的障碍。
该漏洞通过向请求传递任意url参数进行了测试,如下所示:
GET /images/?41b68(a)184a9=1答复是:
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 (请参见下面的更新)。
我真的很难找到一个解决方案来防止或减轻对静态资产的请求:
在对此做了一些调查之后,似乎至少部分缓解措施是针对以url param值转义数据和清除url中的输入的。
网址的逃逸已经到位,因此:
curl 'http://mydomain/images/?<script>alert('hello')</script>'返回
Cannot GET /images/?<script>alert(hello)</script>我还在此基础上设置了快速消毒。
但是,如果我卷曲原始测试,请求param仍然会被反射回来。
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是基于静态发球的,它依赖于帕瑟尔。
发布于 2015-10-12 09:43:28
造成此问题的原因是,对于无效的GET请求,快递将返回如下内容:
Cannot GET /pathname/?yourQueryString在许多情况下,这是一个有效的响应,即使是服务静态资产。但是,在我的情况下--我确信对于其他人来说--对静态资产的唯一有效请求是这样的:
GET /pathname/your-file.jpg我有一个自定义404处理程序,它返回一个数据对象:
var data = {
status: 404,
message: 'Not Found',
description: description,
url: req.url
}; 这仅对app.js中的无效模板请求进行处理,其中:
app.use('/template-path/*', function(req, res, next) {
custom404.send404(req, res);
});我现在已经将请求的显式处理程序添加到静态文件夹中:
app.use('/static-path/*', function(req, res, next) {
custom404.send404(req, res);
});在返回404之前,我还可以选择删除请求查询参数:
var data = {
status: 404,
message: 'Not Found',
description: description,
url: url.parse(req.url).pathname // needs a var url = require('url')
};https://security.stackexchange.com/questions/102465
复制相似问题