ホームページ > php教程 > php手册 > PHP セキュリティ: PHP セキュリティの火を再燃させる

PHP セキュリティ: PHP セキュリティの火を再燃させる

WBOY
リリース: 2016-06-21 09:00:21
オリジナル
907 人が閲覧しました

海外のさまざまなバグトラックによくアクセスすると、その半分以上が SQL インジェクション、XSS、パス開示、リモート コマンドなどのスクリプトに関連していることがわかります。読んだ後、その目的は鶏を捕まえることだけですか? Webセキュリティをやりたい人は、Webセキュリティを使って学ぶのが一番良いのですが、根本を考えると、私たちが求めているのは魚ではなく釣りです。中国では、さまざまな PHP プログラムのバージョン 1.0 とバージョン 2.0 が雨後の筍のように現れていますが、誰もがいくつかの有名な cms、フォーラム、ブログ プログラムに注目しています。 PHP プログラマーや Web マスターは、サーバーの要塞設定に依存するだけでなく、PHP プログラム自体のセキュリティについても理解する必要があります。

PHP のセキュリティは単なるインジェクションとクロスサイトにすぎないと言う人もいます。それは完全に間違っています。もしこれが事実であれば、magic_quotes_gpc またはサーバーの一部のセキュリティ設定によって完全に機能しなくなります: (.I What今日話したいのはインジェクションやクロスサイトではなく、PHP プログラムに存在するセキュリティの詳細です。

一部の関数のフィルタリングに注意してください。

include()、require()、fopen()、fwrite()、readfile()、unlink()、eval() などの関数とそのバリアント関数はプログラムで使用されますが、実用的であるという意味ではありません。心配しないでください。もっと心配する必要があります:)

1.include()、require()、および fopen()、include_once()、require_once() はすべてリモートでファイルを呼び出すことができます。それらの害については、Googleで検索するとよくわかりますが、呼び出しに含まれる変数がフィルタリングされていなければ、任意のファイルを含めて実行できることがわかります。たとえば、print.php を見てください。

...

if (empty ($bn) ) { //変数 $bn が空かどうかを確認します

include ("$cfg_dir/site_${site} .php"); //$cfg_dir パスに site_${site}.php を含めます

...

$cfg_dir ディレクトリが存在するかどうかに関係なく、$site 変数を自然に使用できます。 $site 変数をまったくチェックしません。変数 $site を指定してリモート ファイルを呼び出すことも、ローカル ファイルを指定することもできます。これにより、次のように PHP ステートメントを含むファイルがインクルードされて実行されます。 > ファイル ディレクトリのリスト

は、通常、phpwind や bo-blog の以前の脆弱性のように、いくつかの管理者ファイルを含めて権限を昇格するように拡張することもできます。 php.ini のallow_url_fopen を off に設定してファイルのリモート使用を禁止し、open_base_dir を使用してディレクトリ外のファイルの使用を禁止することに加えて、どのファイルのみを含めることができるかを事前に宣言する必要もあります。ここでは詳細に立ち入りません。

2.fopen()、file()、readfile()、openfile() なども特に注意を払う必要がある領域です。関数自体はファイルを開くことだけが目的ですが、変数を徹底的にフィルタリングしないとソースコードが漏洩してしまいます。このような機能テキスト フォーラムは数多くあります。

...

$articlearray=openfile("$dbpath/$fid/$tid.php"); // パス $dbpath/$fid

$topic_detail にある $tid.php ファイルを開きます=explode("|",$articlearray[0]); //区切り文字 | を使用して投稿の内容を読み取ります

...

これは read.php、$fid、 ofstar の以前のバージョン $tid にフィルタリングがありません。$tid がファイル送信として指定されている場合、元のコードが漏洩します。このように。

http://explame.com/ofstar/read.php?fid=123&tid=../index

$tid には php のサフィックスが付加されるので、index を直接記述します。これはほんの一例ですので、見てみましょう。

3. fwrite() とそのバリアント関数の抜け穴について考えると、ユーザーが送信した文字がフィルターされなければ、PHP バックドアを作成することは不可能ではないことが想像できます。

4.unlink() 関数。少し前まで、この関数は phpwind でファイルを任意に削除するために使用されていました。削除するかどうかを決定するための変数のフィルタリングはありません。任意のファイルの変数を削除できます。

5.eval()、preg_replace() 関数、それらの機能は PHP コードを実行することです。文字列が何らかの方法でフィルタリングされていない場合、どうなるでしょうか。よくある文で考えてみましょう。この記事の PHP トロイの木馬は eval() 原則に基づいて作られたものではないでしょうか?

6. system() などのシステム関数については、php.ini でシステム関数を無効にすることも良い考えですが、一部のプログラムで必要な場合はその必要はありません。使われる?前回見た美しいphpの写真集のように。さらに、popen()、proc_open()、および proc_close() 関数には特別な注意を払う必要がありますが、コマンドの実行後に直接出力はありませんが、これはハッカーにとって有益だと思いますか?ここで、PHP は 2 つの関数、escapeshellarg() とscapeshellcmd() を提供します。これらの 2 つの関数は、システム関数呼び出し攻撃 (フィルタリング) に対抗するために使用されます。 害については、あるフォーラムの prod.php を見てみましょう。 07 $doubleApp = isset($argv[1]); //変数 $doubleApp を初期化します。 .. 14 if( $doubleApp ) //if ステートメント 15 { 16 $appDir = $argv[1] // $appDir を初期化します 17 system("mkdir $prodDir/$ appDir"); / /システム関数 system を使用して、ディレクトリ $prodDir/$appDir を作成します は、もともと $prodDir/$appDir ディレクトリを作成するために使用されました。その後、プログラムは $argv かどうかのみを検出するようです[1] が存在しますが、必要な $argv[1] のフィルタリングが不足している場合は、次のようにすることができます /prod.php?argv[1]=|ls%20-la または /prod.php?argv[1]= |cat%20/etc /passwd (ここでの区切り文字 | は、複数のコマンドを実行できる UNIX パイプ パラメーターです。) この時点で、一般的なタイプの脆弱性について少し知っておく必要があります。 特殊文字に注意してください 特殊文字については、「すべての入力は無効です」という格言があります。この文は海外の記事でよく使われます。すべての入力は有害です。これらの危険に対処するために、プログラマは何かを見逃すことを恐れて、大量の文字をフィルタリングすることに忙しいのです。一部のプログラマーはどうでしょうか?これらの問題はこれまで全く注目されてこなかったように思われ、抜け穴への扉は常に開かれたままでした。さっそく、次のことを見てみましょう。 1. 実際、プログラムの最も重要な抜け穴、そして開発者が最も心配しているのは、ドル記号と $ 記号の付いた変数です。抜け穴を探している人にとって、変数という単語を理解することがすべてです。ディレクトリ トラバーサルのバグと同様に、このバグは多くのメール プログラムに存在しており、開発者はこれを非常に慎重に検討して、http://mail.com/file? のようにネットワーク ハード ドライブを追加している場合もあります。 id=1&put=list&tid=1&file=./ file 変数を ./../ 以上に置き換えるとどうなるでしょうか?このようにしてディレクトリが横断されます。 2. 山括弧「<>」 一部の検索バー、記事、メッセージなど、以前の phpwind 添付ファイルのクロスサイトなどについてはわかりません。もちろん、クロスサイトの問題の場合は、山かっこ以外のものもフィルタリングする必要があります。フィルタリングするときに何かを見逃すことは心配ありませんが、フィルタリングを忘れることが心配です。 3. 傾斜バーと傾斜防止バー: / とフィルタリングについて、Magic Forum の添付ファイルのダウンロードで漏洩した元のコードを覚えていますか? attachment.php?id=684&u=3096&extension=gif&attach=....includesconfig.php&filename=1.gif Windows ホストのような .. / のフィルタリングの問題についてSQL インジェクションと比較して、Windows ホストのペアは / として解析されますが、これらの詳細についてはどのような点が詳しく説明されていますか? 4. バックティック (``) については、PHP では、system() などのシステム関数と同様に、バックティックは非常に強力です。ユーザーの悪意のあるステートメントが実行されると、有害になります。サーバーに関しては、サーバーを適切にセットアップすることに加えて、正直にフィルタリングする必要があると思います。 5. 改行文字、NULL 文字などの場合、「t,x0B,n,r,」例: あるフォーラムの admin.php フラグメントを見てみましょう ここのユーザー名とパスワードに問題があるようです。 管理者のユーザー名とパスワードが存在する場合、検証は直接通過します。ユーザー名もパスワードもありませんよね? GET /bbs/admin/index.php?page=general HTTP/1.1 Accept: image/gif、image/x-xbitmap、image/jpeg、image/pjpeg、application/x-shockwave- を送信します。 flash, */* Accept-Language: zh-cn Accept-Encoding: gzip、deflate User-Agent: Mozilla/4.0 (互換性; MSIE 6.0; Windows NT 5.1; SV1; Maxthon) ホスト: 127.0.0.1 接続: キープアライブ Cookie: username='or isnull(1/0) AND level=3/*; これは偽のパスワードです。データ パケット (偽装する方法を尋ねますか? パケットをキャプチャして変更します)。データの送信には GET を使用します。原理は、Cookie 内に偽装ステートメントを構築することです。 その後、SQL ステートメント全体は次のようになります。 SELECT * FROM users WHERE username=''or isnull(1/0) AND level=3/*' AND password='' ここでは 1 つだけを使用します' or'='or' の原則はユーザー名とパスワードの検出をバイパスしますが、level=3 は偽のレベルです。その結果、検出を回避し、管理バックグラウンドに侵入しました。 2 行のコードが完了したとしても、バックグラウンド検証についてはあまり不注意にならないでください。SESSION と Cookie からの検証を強化する必要があります。 2. アップロードの脆弱性プログラム config.php $IllegalExtentions = array('exe','asp','php', 'php3', 'bat'、'cgi'、'pl'、'com'、'vbs'、'reg'、'pcd'、'pif'、'scr'、'bas'、'inf'、'vb '、'vbe ','wsc','wsf','wsh') //ファイルのアップロードに関する制限、exe、asp、php、php3、bat、cgi、pl、com、vbs、reg、pcd、pif、scr、bas のみ、inf、vb、vbe、wsc、wsf、ws のファイル。 ユーザーが特定のファイルをアップロードできないように規定されていますが、他のファイルはアップロードできます。このロジックは適切ですか? .inc、.php4 .phtml、.html、.pwml などのタイプをアップロードした場合はどうなりますか?この考え方を変更して、これらのタイプのファイル以外のユーザーはアップロードを許可されず、その他のファイルはアップロードできないと規定してはいかがでしょうか。このように配列を逆転の発想に変えていきます。 $IllegalExtentions = array('rar','gif','jpg','bmp','pdf') //rar、gif、jpg、bmp、pdf のみアップロード可能 実はこれcer と asa をアップロードするときと同じ理由です。 3. 典型的なロジックエラー ある CMS (サイト全体プログラム) にユーザーを登録すると、情報を変更するために元のパスワードは必要なく、ユーザー ID を判断するだけで済むことがわかります。 Web ページをローカルに保存し、ID または電子メールを管理者のものに変更し、送信アドレスを変更するアクションを変更すると、送信後に管理者になります。パスワード検証を追加し、mysql update ステートメントのフィルタリングを強化する限り、解決策はそれほど難しくありません。 これについては、私たちにできることは何もありません。ほとんどのプログラマーは、セキュリティについてまったく気にしていません。なぜ、1 人でできるのに、Web セキュリティと Web 開発という 2 つのタイプの人を分ける必要があるのでしょうか。 長さの問題脆弱性を探すことは、管理者パスワードや Web シェルを取得することだけだと考えないでください。DDOSers (サービス拒否攻撃者) という落ち着きのない人々もいますが、彼らは多くのトリックを持っています。プログラマにとって重要なのはフィルタリングにあります。私が話している長さの問題は、文字の長さだけではなく、時間の長さでもあります。誰かが一度に何千ものユーザーを登録するスクリプトを書いたり、単にゴミデータを書き込んでデータベースを破壊したりするのを見たことがあるはずです。このとき、データ送信時間の制限と検証コードが有効になります。しかし、実際に悪質な人物に遭遇した場合、可変フィルタリングの問題により Web サイトが麻痺する可能性があり、これはインターネット ゾンビのようなソフトウェアを使用するよりも高速です。 大なり小なり問題なし 1. 絶対パスの漏洩 この問題は実際には大なり小なりなく、多くのプログラムに存在し、セキュリティの一部とも考えられています。少なくともloadfile()を注入する必要があります。もちろん、php.ini の display_errors もこの時点で機能します。 2. バックグラウンドの検証 信じられないかもしれませんが、このようなプログラムをいくつか見たことがあります。ユーザーを登録し、admin_member などのユーザーの URL を編集するために管理者に送信します。 php?action=edit&id= 55&level=4&username=zizzy&power=1 管理者の URL を適宜追加すると、ほとんど検証がなく、直接成功することがわかります。したがって、リリースされたばかりの Discuz の脆弱性と同様に、バックグラウンドでの検出も必要です。知らず知らずのうちにフィルタリングについてたくさん話し、フィルタリングについての注意事項をたくさん書きました。今度はフィルタリングの方法について話します。 1. ユーザーがデータを入力するとき、つまりデータベースに変数を送信するとき、フィルター処理に addlashes() を使用する必要があります。たとえば、挿入の問題は 1 つの addslashes() だけで解決できます。実際、変数値に関しては、 intval() 関数も文字列のフィルタリングに適しています。 2. php.ini で magic_quotes_gpc と magic_quotes_runtime を有効にします。 magic_quotes_gpc は、get、post、cookie の引用符をスラッシュに変更できます。 magic_quotes_runtime は、データベースに出入りするデータにおいて書式設定の役割を果たします。実際、このパラメータは、インジェクションが夢中になっていた昔に非常に人気がありました。 3. システム関数を使用する場合は、安心してシステム関数を使用できるように、escapeshellarg()、escapeshellcmd() パラメータを使用してフィルタリングする必要があります。 4. クロスサイトの場合、strip_tags() と htmlspecialchars() の両方のパラメーターが有効であり、ユーザーが送信した html と php のタグはすべて変換されます。たとえば、山括弧「<」は「<」などの無害な文字に変換されます。 5. 関連関数のフィルタリングについては、前の include()、unlink、fopen() などと同様に、操作を実行したい変数を指定するか、関連する文字を厳密にフィルタリングする限り、これは完璧だと思います。 サーバーのセキュリティ設定私たちのほとんどは仮想ホストを使用していますが、php.ini の設定方法については、ネットワーク管理者だけが行うことができます。決める。 。しかし、それでも私はこう言います。1. "safe_mode" を "on" に設定します。これは、ほとんどの Web 開発者にとって優れたオプションであり、PHP のセキュリティを大幅に向上させることができます。 2. 「open_basedir」を無効にします。このオプションは、指定されたディレクトリ外でのファイル操作を禁止し、include() などの関数の呼び出しによるローカル ファイルまたはリモート ファイルへの攻撃を効果的に排除することもできます。 3.php が http ファイル ヘッダーの情報を漏洩しないように、expose_php をオフに設定します。4.「allow_url_fopen」を「オフ」に設定します。このオプションはリモート ファイル機能を無効にすることができます。強くお勧めします。 5.「log_errors」が「on」になっているので、エラー当日に持参してください 6..「display_errors、register_globals」の2項目については、状況によりますが、display_errorsがマイナスすぎる場合は、すべてのエラーがオフになります。 、スクリプトをデバッグすることは不可能です。 register_globals (グローバル変数) については、これをオン/オフするのが非常に面倒で、これがないとほとんどのプログラムが使用できなくなります。 これらは最も必要な設定です。 PHP サーバーのより高いセキュリティ設定については知識が必要であり、この記事の範囲外です。 この記事はここで終わります。おそらく、あなたが述べたことはオープンソース プログラムにのみ役立つのではないかと思われるかもしれません。実際、セキュリティのためには、基礎を固めることが重要です。どのように暗号化しても、ブラック ボックス テストを回避できるでしょうか。それはある日発見されるでしょう。 スペースの制限により、これで終わりです。PHP プログラムのセキュリティについても予備調査を行いました。大多数の読者のために、ここで挙げた例は理解しやすいものになっています。もちろん、前提として PHP を知っている必要があります。そうでない場合は、もう一度聖書を読む必要があります (PHP が何なのかは聞かないでください。)これを読んでいますか?)この記事全体はハッキングのチュートリアルではありませんが、初心者や PHP セキュリティで開発したい PHP プログラマー向けに書かれています。将来、誰かが別の抜け穴を発見したと聞いても、あなたがどれだけ変わったとしても、それは基本的なことだけです。この記事があなたの考え方を広げ、より良い開発につながることを願っています。アルコール依存症で剣に夢中でも、PHP セキュリティの火を再燃させ、PHP への粘り強さを武器に旅に出ます。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート