使用ツール
- ブラウザ: Google Chrome
- パケットキャプチャツール: Fiddler
- プログラミング言語: PythonとJavaScript
フロー分析
ホームページアクセスとログインボタンクリック
ログインリクエストはHTTP POSTで、以下のようなJSON形式のパラメータが送信されます:
{
"callbackVOList": [{
"callback": {
"loginName": "91XXXXXXXXXXXXXX",
"moduleName": "AuthModule",
"prompt": "ユーザー名",
"step": 1,
"subjectNeedFill": true
},
"callbackType": "com.security.auth.callback.UsernameCallback",
"order": 0
}, {
"callback": {
"encoding": false,
"moduleName": "AuthModule",
"password": "3F647993D5419FFD275CB405A319F5CE644C0549",
"prompt": "パスワード",
"step": 1,
"subjectNeedFill": true
},
"callbackType": "com.security.auth.callback.PasswordCallback",
"order": 1
}, {
"callback": {
"choices": {
"1": "個人ユーザー",
"2": "法人ユーザー",
"3": "代理人"
},
"defaultChoice": "",
"moduleName": "AuthModule",
"multipleSelectionsAllowed": false,
"prompt": "ユーザータイプ",
"selectedKey": "1",
"step": 1,
"subjectNeedFill": true
},
"callbackType": "com.security.auth.callback.ChoiceCallback",
"order": 2
}, {
"callback": {
"moduleName": "AuthModule",
"prompt": "検証コード",
"step": 1,
"subjectNeedFill": true,
"validateCode": ""
},
"callbackType": "com.security.auth.callback.CaptchaCallback",
"order": 3
}],
"indexName": "initAuthentication",
"indexType": "service",
"moduleName": "AuthModule",
"step": 1
}
対応すべきポイント
- パスワードは暗号化されている
- ログイン時に検証コードが必要
パスワード暗号化アルゴリズムの解析
暗号化関数 encryptData(inputPassword, responseValue, "", "") は4つのパラメータを受け取り、暗号化されたパスワードを返します。
- パラメータ1:
inputPassword- ユーザーが入力したパスワード - パラメータ2:
responseValue- サーバーから返された値(例: "Ljg0MDAwNzk3Mw==")
この関数を使用して、入力パスワードをサーバーが期待する形式に変換できます。
検証コードの解析
ログインリクエストを分析したところ、検証コードのトークンがリクエストに含まれておらず、検証コードの成功時にもレスポンスにCookieが設定されていませんでした。これは、検証コードがクライアントサイドでのみ検証されており、プロトコルレベルではバイパス可能である可能性を示唆しています。
ブラウザリクエストのシミュレーション
テストの結果、検証コードなしでのログイン試行は「検証コードエラー」を返しました。これは、サーバー側で検証コードの成功状態がCookieなどで記録されていることを示しています。
したがって、検証コードの処理を完了させる必要があります。
clientUid値の特定
この値はUUID形式で生成されるため、以下のコードで生成できます:
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
スライドパズルの座標計算
スライドパズルの座標は以下の式で計算されます:
- x = 310 * スライド距離 / 400
- y = 5(固定値)
ローカルに保存される画像の幅が310ピクセルであるため、x値はそのまま使用できます。