見出し画像

えっサイトが突然真っ白に!?サーバーが攻撃されていた話

こんにちは。なおきちです。

運用しているサイトが突然真っ白になると焦りますよね。
原因は短時間にわたる悪意のあるユーザーからの大量アクセスでサーバーの負荷が上がって繋がらなくなりました。
今回はそのときの話を紹介します。

僕が働いている会社では、運用しているサイトのエラーを毎日チェックする作業があります。
そんなある日、いつものようにエラーをチェックしていたら1分間に400アクセスぐらいのエラーが出ていたのです。
普段のエラー数はあっても1桁ぐらいなので何が起きた!?と急いで調査に取り掛かりました。

調査を進めていくと、不正なGETパラメータを何回も渡していたのです。
実際は違いますが、こんな感じ。

example4649-555.domain?param=/etc/passwd
↑飛ばないでくださいね。

渡している値のこれが気になりますよね。
/etc/passwd

これはエンジニアがお世話になるOS「Linux」のユーザーやパスワード情報が書かれているファイルを指しています。
あのマトリックスのような黒い画面のやつです。

画像1


古いOSの場合はパスワードを解析できるらしいです。

「/etc/passwd」はサーバーの管理者にとって、見られるとやばいファイルです。
サーバーが乗っ取りされる可能性があるからです。
こういったパラメータからサーバーの情報を抜き取る攻撃を「OSコマンドインジェクション」と言います。

セキュリティ対策といえばこの3つが有名ですが、他にも色々とあるのです。

・SQLインジェクション
・CSRF
・XSS

おそろしやガク((( ;゚Д゚)))ブル

悪意あるユーザーはこんなソースを想定して、攻撃していたのだと思われます。

<?php
// /etc/passwd
$param = $_GET['param'];

// lessでファイルを参照する
exec('less ' . $param, $output);
?>
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>OSコマンドインジェクション</title>
</head>
<body>
   <?php foreach ($output as $key => $value) : ?>
       <?php echo $value; // /etc/passwdの中身が表示されてしまう ?>
   <?php endforeach; ?>
</body>
</html>

php側からOS側に指示を出す「exec」などのシステム実行関数がある想定で攻撃していると思います。
人間に例えると、脳の指令で手足が動きますよね。この手足をプログラムだとすると、プログラムの世界では手足から脳に指示を出す事ができちゃうのです。これを「exec」などのシステム実行関数を指します。

対策方法は、
1. 「exec」などのシステム実行関数を使わない
2. 外部から受け取る値をシステム実行関数には渡さない

これを実行できる環境を作ってしまうと悲惨な結果を生んでしまいます。
個人情報やクレジットカードの情報、サイトの改ざんなど影響力が大きい被害をもたらします。

幸い、5分ぐらい攻撃された後、悪意あるユーザーは諦めて攻撃をやめてくれました。
システム実行関数は便利なんですけど、知らないうちに使っているといつの間にか脆弱性を作ってしまう可能性があります。
無知な状態で働くと危ないので、日々勉強が大切ですね。

参考になれば幸いです。

最後までお読みいただきありがとうございます!

この記事が気に入ったらサポートをしてみませんか?