所以这可能是一个很长的机会,但我完全不知道是什么导致了这个问题:
我正在提供一个客户端 JavaScript,它解析嵌入它的页面上的某些参数,使用这些参数构建一个 URL 并将使用该 URL 的 iframe 注入(inject)页面,如:
var queryParams = {
param: 'foo'
, other: 'bar'
};
变成了:
<iframe src="http://example.net/iframes/123?param=foo&other=bar"></iframe>
这工作得很好,我每天发送大约 150 万个请求。然而我最近注意到,在每天大约 3.000 个案例中,查询参数的值被打乱,所以像这样的东西被请求:
<iframe src="http://example.net/iframes/123?param=ofo&other=rba"></iframe>
从日志来看,这是与特定用户相关联的,字符的困惑会在每次请求时重新发生,因此当用户使用脚本浏览具有多个页面的站点时,我可以看到这样的序列:
108.161.183.122 - - [14/Sep/2015:15:18:51 +0000] "GET /iframe/ogequl093iwsfr8n?param=3a1bc2 HTTP/1.0" 401 11601 "http://www.example.net/gallery?page=1" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"
108.161.183.122 - - [14/Sep/2015:15:19:07 +0000] "GET /iframe/ogequl093iwsfr8n?param=a21b3c HTTP/1.0" 401 11601 "http://www.example.net/gallery?page=2" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"
108.161.183.122 - - [14/Sep/2015:15:19:29 +0000] "GET /iframe/ogequl093iwsfr8n?param=ba132c HTTP/1.0" 401 11601 "http://www.example.net/gallery?page=3" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"
401 是故意发生的,因为服务器期望 param=abc123
。
我还注意到大多数错误都发生在 Firefox 和 Safari 中,Google Chrome 没有请求过一个错误的 URL。
我用来将对象转换为查询字符串的库是:query-string - 但是查看源代码,我看不到任何可能存在此类错误的可能性,没有对键(没有弄乱)未完成的值进行任何操作。
有没有人遇到过类似的事情?这是一些奇怪的浏览器扩展吗?这是我的脚本与另一个扩展原型(prototype)的库的冲突吗?这是恶意软件吗?这是我完全不知道的事情吗?如果有任何提示,我将不胜感激,因为我真的一无所知,这真的让我发疯。
编辑:我刚刚发现我们的另一个面向公众的服务目前正在被称为“Burp Suite”的东西探测。看看他们的网站,我发现他们有一个名为“Payload fuzzing”的工具,它似乎可以完成此处描述的大部分工作:https://portswigger.net/burp/help/intruder_gettingstarted.html或此处:https://portswigger.net/burp/help/intruder_using.html#uses_enumerating - 整个工具对我来说有点腥味,所以我认为这可能值得进一步研究。还有其他人听说过这个工具集吗?
最佳答案
从这一点上分析不多,因为您正在寻找提示;这更像是一个长评论而不是一个答案。
客户端浏览器(或机器)或您的网络服务器上的恶意软件;或者未知的爬虫可能导致这种情况,这是不太可能的。在我看来,您的应用程序似乎受到了攻击。
让我们看看;
- 真实示例(在评论中)显示 128 位十六进制访问 key 正在改组。 (
accessKey
参数的值) - 只有值会被打乱,键不会。
- 您说,请求来自特定用户。
- 您说,请求来自特定浏览器客户端(Firefox 和 Safari)。
检查/做什么;
- 检查您的日志系统是否正常工作。如果您使用的是第三方可配置记录器,这可能会把事情搞砸。 ( example )
- Reproduce:采用完全相同的一组参数;使用相同版本的浏览器,看看结果是否相同。如果是这样,则可能是浏览器版本问题,这种可能性很小。
- 检查是否有其他 Firefox 和 Safari 用户(具有相同版本)没有遇到此问题。
- 既然你说这只是请求的一小部分,请检查相应的请求是否紧接着一个接一个地发出。 (同类请求不到一秒?)
- 尝试追踪请求的来源。它们是否来自您怀疑的来源?您能否将来自不同请求的信息相互关联?多个IP组成一个子网?同一个IP不同账号?同一帐户在短时间内使用不同的 IP?
- 有 apache-scalp 等工具, mod_sec , lorg检查/分析大日志文件以提取可能的攻击。</li>
- 您还可以使用提到的一些技术 here手动发现或阻止可疑请求。
关于javascript - 什么可能在 JavaScript 中改组我的查询字符串参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572264/