tetu式

ゲームと音楽・作曲の自己満足と悩みどころの多いプログラムのブログ。

phpmyadminで403が出た時の対処

仕事でphpmyadminを使用して抽出SQLを叩き、結果をエクスポートしようとしたら

403 Forbidden

って感じのダイアログが表示されて非常に不便だったのでその原因や対策の備忘録です。


まず、phpmyadminで403が出ることは普通の環境であればそうそうないことです。
XAMPP環境のようにローカルでphpmyadminを使っている人は見たことないんじゃないでしょうか。
なので今回は結構限定的な環境上で起こりうる内容になります。

まぁ、「phpmyadmin 403」で検索する様な人はおそらく同じ様な環境であるとは思いますが・・・
それでこの記事にたどり着いた人、「ファーストサーバのZenlogic」でレンタルしてWEBの運営してたりしませんか?
今回はそんな限定な人向けの記事です。

原因としてWAF(Web Application Firewall)と呼ばれるセキュリティシステムが悪さをしている可能性が高いです。
いや、セキュリティ上決して悪くはないのですが、
パラメータにSQL文がもろに混ざったりするphpmyadminとは相性がすこぶる悪いのです。

さて、どうもこの内容での問い合わせが多かったためかZenlogic公式でも専用にFAQが用意されています。
Zenlogic よくある質問(FAQ)
最終更新が2018年4月と結構新しいですね。

内容は.htaccessファイルにルールを記述して対処する方法です。
これでどういった対処をしているのかということは具体的にFAQ内では書かれてませんが、
簡単に言うと、指定のファイル上で「一部のWAFを無視する」設定をしています。

ただ、FAQにも書かれているとおり、
phpMyAdmin 4.0.10.6」のみ動作確認済で、その他のバージョンでの動作は保障していないみたいです。
実際今のphpmyadmin最新版は4.8.1(2018-6-14現在)ですし、4.0.10系の最終版も2017年の4月頃の公開です。

で、FAQにあったとおり、まずはそのままコピーしてphpmyadminディレクトリ直下に.htaccessを作成し、
コピーした内容を貼り付けて保存します。
phpmyadminに入るとひとまずログインとかテーブル構造見たりとかはできます。

しかし、ちょっと複雑なSQLやエクスポートを利用したりすると403が返されたりしちゃいます。
自分の場合は複数条件のSQL(where句にandを1つつけた程度)で403が返ってきました。
どうもANDとかORという文字に反応してSQLインジェクションを防いでる感じもありますね。

さて、それでは403エラーが起きたのでログを見に行きます。

Zendlogicで借りているサーバにまずはFTPで入りましょう。
方法はいろいろあると思いますし、この記事を見る人でここで詰まる人はいないと思うので割愛。

FTPに入ったら/logs/wafディレクトリに移動します。
そしたらwaf.logや、一番新しい過去日付のwaf.logをダウンロードするなりして見れるようにします。
で、中身を見ると

Jun 13 17:10:01 Zenlogic標準ドメイン
siteguardlite[20714]: エラー発生時刻 9
サーバIPアドレス TCP_MISS/000 353
POST 問題のあったphpmyadminphpファイルのURL -
DIRECT/10.3.4.215 application/x-www-form-urlenc
DETECT-STAT:WAF:RULE_SIG/PART_PARAM_VALUE|PART_REQBODY/sql_query/OFFICIAL/00201009/
sqlinj-9::AND実行しようとしたSQL:
ACTION:BLOCK: JUDGE:BLOCK:0: SEARCH-KEY:サーチキー:

ちょっと長いのでところどころ改行してますが、SQL実行失敗時のエラーでこんな感じの内容が出ました。
赤文字部分はそのままだと色々と特定されそうなので書き直してますが各々の環境によって違ってくる部分だと思います。
sqlinj-9とかあるので予想通りSQLインジェクションでしょうね。

で、これはいわば.htaccessで無視するWAFルール以外で引っかかってしまったために出力されたエラーです。
なのでこのルールを.htaccessに追加することで解消されます。
ここで見るべき部分は問題のあったファイルのURL部分と、下から3行目末尾の「00」から始まる8桁の数字です。

この8桁の数字が.htaccessで書かれていた無視するWAFのルール番号的なものになります。
さきほど「一部のWAFを無視する」と書いたのはこう言う理由です。

で、.htaccessには指定のファイルにこのルール番号を追加することで対処できます。
例えば問題のあったファイル名が「sql.php」でルール番号が「00201009」であった場合は

   <Files ~ "sql\.php$">
      SiteGuard_User_ExcludeSig 00301021
      SiteGuard_User_ExcludeSig 00201001
      SiteGuard_User_ExcludeSig 00201009  ← 公式FAQの内容をコピーしたやつにこれを追加
   </Files>

こんな感じで上書きすればOKです。
もちろん、sql.phpに対して00201009 のルール番号を無視するという内容で上書きしただけなので
phpmyadminを操作していると他の403と遭遇するかと思います。
その都度最新のwaf.logに書かれたエラーを確認し、ルールを追加していけばいつかはphpmyadminの機能を
ちゃんと使える様になります。

あとphpmyadminを使っているので言うまでも無いかもですが、DB情報がこの時点で公開されてしまっている点については
留意してくださいね。
指定IPからのアクセスだけ見れる様にするとかの対策もやらなきゃですよ。