おっちゃんのエンジニア日記

今までエンジニアとして経験してきたことを書いていくブログ

たまたま見たWAFのログで震えたお話(MS SQLServer)

はじめまして!

いちおう上場企業などでDBAをやっていた すがっと と申します。

はてなデビューしました。

これからはこちらの方で自分がDBAとして経験したことや、

データベースの技術検証した話などを書いていこうと想います。

 

きっかけ

 先日、元同僚とご飯を食べていた時に、「そういや、こんな事があってな」と

この話をしたところ、「それ、LTで話してくださいよー!」と言われまして…。

人前で話をするのが苦手なすがっとさん、とりあえずブログに逃げました。

 

今回は、過去に経験したWAFのログの中でも震えたSQLインジェクションのログから

セキュリティについて考えたお話です。

こんな構成

兎にも角にも構成が見えないとイメージもつかないと思ったので、

当時運用していたサービスの構成をざっくりと絵にしたものがこちらです。

ちなみに、使用しているRDBMSはMS SQLServer 2008R2でした。

 f:id:tetsuwrx:20180825103836p:plain

見つけた!SQLインジェクション

日々の運用ではSQLインジェクションが飛んでくることはそこまで珍しいものではなく、

WAF(Web Application Firewall)で弾かれたものがメールで通知されてくるので何気なく眺めていたところ…

よく見かけるような「' and 1 = 1;'」 みたいなものではなく、

とてつもなく長いSQLが書かれていてメールのログでは途切れてしまう程のものが通知されてきました。

これは何かあってからではマズいということで調べていったところ…

データの抜き取りとはこういうことだったのか

実際の中身は細かく覚えていないのでダイジェストで書くと…

1. xp_cmdshellを使ってWindowsファイヤウォールを停止

2. xp_cmdshellを使って11433ポート(使われていなさそうなポート番号)を開放

3. select文でサーバー名やIPアドレスを取得した結果を、リモートクエリ(openquery)を使って

 外部のDBサーバー(恐らくデータ収集専用DBサーバ)へデータを保存

イメージ的にはこんな感じですね↓

f:id:tetsuwrx:20180825105717p:plain

何が怖かったか

こんな手の凝ったSQLは見たことなかったし、WEBページにデータを表示させたり

DBサーバをクラッシュさせるという目的ではなく、本気でデータを抜きにかかっている事を目的として実行しようとしていたところが怖かったです。

これがもし通っていたら次は何をされるかわからないですからね。

改めて感じたこと

1. xp_cmdshellは危険

SQLServer界隈では有名な話ではあるのですが、SQLの中でOSに対してコマンドを実行できるというものなので、

WEBサービスとして使用しているDBサーバなどでは当然のことながら無効化しておきましょうというものなのですが、

今回の1件で無効化しておいて良かった、と改めて思いました。

2. アプリケーションから接続するユーザーには適切な権限設定を

アプリケーションを動かす上ではinformation_schemaやシステム管理用DBの情報は必要ないはずですので、

見れないようにしておいても実害は無いと思います。

3. openqueryはいろんな意味でやめてほしい

リモートクエリはデータのフローが複雑になるのでできれば使用してほしくないし、

使用しないなら実行できないようにしたいところですね。

 

まとめ

SQLインジェクションって、実際に見てみると思いもよらないクエリが書いてあったりして、

「これを防ぐためには…」というような考えで見ていくと結構勉強になったりする事もあるので、

「なんかいつもと違う!」という第六感を働かせるためにも、その「いつも」がどういうログが飛んでくるか見ておくと、

あなたもニュータイプなDBAになれるかもしれません ( m9`・ω・´)

 

せっかく記事に起したものでもあるので、どこかでお話できたら良いなー、なんて…(ボソボソ

その時は、震えながら話していると思うので温かい目で見守ってあげてください。