不正アクセスを防ぐ方法 - PHPプロ!Q&A掲示板

2836

  • 0P

不正アクセスを防ぐ方法

質問日時 / 2010年8月11日 01:49 (最終編集:8月11日 01:58)    回答数 / 10件

Questioner:  litlithuthut  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

こんにちは、趣味でPHPを勉強しているのですが、最近、サーバー内のファイルを見られたり、勝手にアップロードされたり、属性を変更されたりといった類の不正アクセスを受けたのですが、これらは、どのように対策するのでしょうか?

formを使ったコンテンツが多く、htmlspecialcharsを使ってエスケープしたりしていますが、これだけでは何も回避出来ないのでしょうか?
後、一部のコンテンツでは、HTMLタグを使えるようにする為、htmlspecialcharsを使わず、HTMLを許可する変わりに

str_replace("<php","","$item");

みたいに書いています。
ちなみにファイルはphpです。

ftpに侵入したのでは無く、外部コマンド(詳しく無いのでよくわからないです)でされたかもしれません。

ftpに関しては、ガンブラー対策にもなるらしい、ftpaccessファイルを置いています。

そこで相談なのですが、サーバー内にある全ファイルで、エスケープ用のファイルを読み込ませて、回避出来ればと考えております。

例えばpostされた値を一括でチェック出来たりするといいかなと考えています。

なので、エスケープ用のファイルに

■エスケープ用ファイル
例:ng.php
  1. if(($_POST)or($_GET)){
  2. //ここに値のチェック
  3. }
みたいに記述して、postかgetの時で値を送信しようとする際に必ず通る関門のようにして、値を一括でチェックしたいのですが、具体的にどのようにすればいいでしょうか?

未熟な自分が原因なのはわかるのですが、正直かなり困っているので、警察に相談しようと思っています。
届け出を出す場合は、基本的に何が必要となるのでしょうか?
ftpログはサーバー会社から受け取りました。
どうか宜しくお願い致します。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01win_phpガンブラーの疑いは確認済みということを前提として、
┃┗A01-1litlithuthut>>ご返答ありがとうございます。 <script>も確か
┣A02shimix>後、一部のコンテンツでは、HTMLタグを使えるように
┃┗A02-1litlithuthutご返答ありがとうございます。 <php は記述ミスで
┃ ┗A02-1-1shimix>使えるタグの限定なのですが、strip_tagsってなんか
┃  ┗A02-1-1-1litlithuthut遅れましたが、ご返答ありがとうございます。 ご丁
┣A03NurseAngel>属性を変更されたり が本当ならOSコマンドインジェ
┃┗A03-1litlithuthutご返答ありがとうございます。 あまりに難しい話に
┃ ┗A03-1-1pannnaPOSTしたデータは全て「テキストとして」扱えばいいだ
┃  ┗A03-1-1-1litlithuthut遅れましたが、ご返答ありがとうございます。 そう
┗A04magicflute2この意見は投稿者によって削除されました。

回答一覧

並び替え:

A01
answererwin_php [8月11日 02:14]

ガンブラーの疑いは確認済みということを前提として、

htmlspecialchars() を利用するのはxss対策として、考えると

<script> が問題かと思います。
攻撃者は普通にサイトで使用しているjquery.jsなどのファイルを
改ざんしたりします。

あと、GETをやめてPOSTに変更する。

バリデートはそのフォームによってどのような値を通過させるのかで
異なってくるのではないでしょうか。

ところで、勝手にアップロードということですからアップローダーが設置されているのですか?

たとえば、画像とみせかけてPHPやscriptをアップすることは可能なことです。



バックドアを埋め込まれている可能性もあるので専用サーバーならOSを
再インストールしましょう。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerlitlithuthut [8月11日 02:58]

>>ご返答ありがとうございます。

<script>も確かに埋め込まれていましたね。
削除しましたが。
今日困ったのは、ディレクトリ内に大量のファイル(多分数十万ファイル)勝手に生成されて、削除出来なくなりました。
なので、調べて、ディレクトリ内全て削除出来るコードを使って何十回も行った所(大量過ぎる為か途中でエラーになるので)、ようやく全て削除出来ました。

その時に削除したファイルの中身は見る事が出来なかったですが、ファイル名は、

fjsdaljfsdajlfjasdljlfjajfj

fjaslkfjlsjafljlasjdfjalj

fajfsdjfjaljljsajfjlsdjafljsl

dfjakkfjksljdfjlsdajfljskj

fjakjfljkljsdljfljalfjsdjfl

dfaskfowojuorjwoqjjsdlafna
みたいな感じで永遠に生成されていたようです(削除する際に削除したファイル名を全てechoで見た為)。
よくわかりませんが、何かのキャッシュみたいなファイル名ですかね。

アップロードとは、ちょっと言い方を間違えました。
勝手にファイルの生成されたという意味です。
最初ftpから勝手にアップロードされたと勘違いしました。

なるべくpostにしますね。

前にもやられて思ったのですが、拡張子のよって改ざんされやすいとかって関係ありますでしょうか?
大体index.htmlばかりが改ざんされていて、htmlをやめてphpにしてから、改ざんが無くなった記憶があります。

ようするに、htmlspecialcharsをしていても<script>は埋め込まれてしまうのでしょうか?

この意見に回答する

ツリーへ TOPへ

A02
answerershimix [8月11日 02:31]

>後、一部のコンテンツでは、HTMLタグを使えるようにする為、htmlspecialcharsを使わず、HTMLを許可する変わりに
>
>str_replace("<php","","$item");
>
>みたいに書いています。

short_open_tagが有効になっていると、「<?」もチェックしないといけませんね・・。

というのは置いといて

「HTMLを許可」というのは危なすぎます。インラインのCSS記述やイベントに対するJavaScript記述まですり抜けていませんか?BBコードのようなものを使うか、使えるタグを限定すべきです(「<」から「>」までを含めて限定しその部分をBBコードに置換してからhtmlspecialcharsを通して再度逆の置換を実行)。

#というかBBコード形式にしていないと、投稿に「HTMLソースの記述」が書けませんよね。
#かえって不便だと思うのですが>HTMLの許可。


パスワードは定期的に(及びサーバ上のファイルに異変があったら即時に)変更されていますよね?お使いのサーバはSSH接続などが可能ですか?


ちなみに。質問者さんのPCがウィルスに感染していたら.ftpaccessは無意味ですが、その点は大丈夫ですよね(念のため確認)。

この意見に回答する

ツリーへ TOPへ

A02-1
replyerlitlithuthut [8月11日 03:04] (最終編集:8月11日 03:26)

ご返答ありがとうございます。

<php
は記述ミスです、申し訳ございません。
正確には、<?phpでした。

使えるタグの限定なのですが、strip_tagsってなんか思うように機能しませんよね?

つまりhtmlを使えるようにするには、htmlspecialcharsで一旦ファイルに保存⇒読みだす時にhtmlに戻すという事でしょうか?
そして読みだす時に、

$array=array("<?php","<script>");
str_replace("$array","","$text");
とかやれば、大丈夫でしょうか?


ごめんなさいBBコードとはなんでしょうか?
共有サーバーなのですが、SSH接続については、ちょっと調べてみます。

パスワードは定期的に変更しております。
私のPCは、ウィルスチェックで大丈夫でした。

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyershimix [8月11日 06:58]

>使えるタグの限定なのですが、strip_tagsってなんか思うように機能しませんよね?

どういうケースでしょうか?既知の「注意」以外の問題であれば、ご報告いただけるといいんじゃないかと。

http://jp.php.net/manual/ja/function.strip-tags.php
strip_tags() は HTML の検証を行わないため、 不完全または壊れたタグにより予想以上に多くのテキスト/データが削除される可能性があります。 
・この関数は、allowable_tags で許可した全てのタグの属性を修正しません。 これには、style  および onmouseover属性が含まれており、 悪意のあるユーザが他のユーザに見せるようなテキストを投稿する際に危険な行為を行う可能性があります。 

>つまりhtmlを使えるようにするには、htmlspecialcharsで一旦ファイルに保存⇒読みだす時にhtmlに戻すという事でしょうか?

えっと・・。簡単に言えば「違います」。

>BBコードとはなんでしょうか?

使えるHTML要素を限定し、かつその要素に不要な属性を指定させないために先人達が考え出したものです。

http://www.google.co.jp/search?hl=&q=BB%E3%82%B3%E3%83%BC%E3%83%89
http://ja.wikipedia.org/wiki/BB%E3%82%B3%E3%83%BC%E3%83%89


端的に言って、POSTされた内容にphpスクリプトが含まれていたからといって。それが実行される可能性がある・・という時点でおかしいです(なので、この話は「置いといて」としました)。その内容は書き込み/読み込みともスクリプトからテキストとして扱われますから(htmlspeaiclcharsなどを通さなかったとしても)ブラウザにそのまま返ってくるだけで、サーバで実行されるということはあり得ません。たとえばアップローダなどでPOSTされた中身が単一のファイルとして(なおかつローカルのファイル名もしくは最低でも同一拡張子のままで<これ重要です)保存され、その保存したpath(つまりアクセスすべきURL)が知られてしまうような状態でもない限り、心配する必要がありません。まぁアップロードされたファイルに(phpスクリプト経由でなく)直接アクセス可能という時点でセキュリティ的にはアウトですけどね。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyerlitlithuthut [8月16日 19:28]

遅れましたが、ご返答ありがとうございます。

ご丁寧に教えて頂き助かりました。
ご教授頂いた事を元に解決出来るように頑張ります。
また宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A03
answererNurseAngel [8月11日 02:45] (最終編集:8月11日 02:52)

>属性を変更されたり
が本当ならOSコマンドインジェクションでは。
ほぼお終いレベルの穴なので一刻も早くインターネットからの切断をお勧めします。


> 後、一部のコンテンツでは、HTMLタグを使えるようにする為、htmlspecialcharsを使わず、HTMLを許可する変わりに
str_replace("<php","","$item");
> みたいに書いています。
> ちなみにファイルはphpです。

まあ"<?php"だからな。
それはともかく、フォームやアップロードファイルでPHPが動くような設計は完全にアウトです。
インプットフォームは<?phpを変換、ではなくテキスト(HTMLテキスト)として扱います。
アップロードファイルはDocumentRoot外に置きPHP経由で表示するか、最悪DocumentRoot内に置く場合でもプログラムとしては直接呼べない形にする必要があります(パーミッション設定とか、指定の拡張子しかアップ許可しないとか)

また、単にHTMLを許可する場合でも、不特定多数への許可は行ってはいけません。
・ホワイトリスト形式で許可するタグだけを指定する
・Wikiのように完全に置換する
・管理者は自由にタグを置けるが一般人は不可
等対策を行わなければなりません。


>サーバー内にある全ファイルで、エスケープ用のファイルを読み込ませて、回避出来ればと考えております。
お勧めできない方式です。
HTMLエスケープは表示時に行うべきです。


#単にFTPパスが割れただけに一票

この意見に回答する

ツリーへ TOPへ

A03-1
replyerlitlithuthut [8月11日 03:20]

ご返答ありがとうございます。

あまりに難しい話になってきていて、理解出来ていない自分がいます。。

いまいち理解出来ていないので何かサンプルを教えて頂けないでしょうか?

<form action="./" method="post">
<input type="text" name="text" />
<input type="submit" value="投稿" />
</form>

こんなフォームがあるとします。
$text=htmlspecialchars($_POST['text']);
でチェックします。

OSコマンドインジェクションというのは、ここに何を入力したら、どうなるのでしょうか?
とりあえず追跡したいので、post時にipとかの情報を保存するのですが、textの値がどんな内容の時が危険なのでしょうか?
それがわかれば、
if($text==""){
//ipとかを保存
}
のように不正なデータを入力した時にだけ、保存されると思うのですが、こういうのは、よくないのでしょうか?自分の技量を考えると、こういう初歩的なチェック方法しか思いつきません。

この意見に回答する

ツリーへ TOPへ

A03-1-1
replyerpannna [8月12日 04:16] (最終編集:8月12日 04:18)

POSTしたデータは全て「テキストとして」扱えばいいだけなのでは?

# HTMLタグの投稿を有効にしている時点でセキュリティはどうなのよ?という
# 問題はおいておきます

またインジェクション系の問題は調べればいくらでも対処方法が出てきます。
というより、そのような問題が発生するスクリプトを書くこと自体が問題なわけで、
セキュリティについての基本的な知識が正直足りてないのではないかなと思います。

また、HTTP経由でのアクセスであれば、アクセスログに何か記録されているはずです
(FTPなどのログも取っているのであればそちらも参照)。
そちらから調べるか、契約しているホスティング会社に連絡をしてみるのもいいかと。

この意見に回答する

ツリーへ TOPへ

A03-1-1-1
replyerlitlithuthut [8月16日 19:29]

遅れましたが、ご返答ありがとうございます。

そうですね、全部テキストで扱うように心がけますね。
FTPログは、サーバー会社に見て頂きましたが、問題無いとの事だったので、別の問題のようです。

ご丁寧に教えて頂き助かりました。
ご教授頂いた事を元に解決出来るように頑張ります。
また宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A04
answerermagicflute2 [8月11日 10:14]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)