2019年8月22日木曜日

セキュリティー対策(9)

定番のSQLインジェクション
典型的な攻撃として、データベースに直接影響を与える最も大きな影響を
もたらす原因の一つとして、無害化されていないパラメータをそのまま利用することで
おこる攻撃ですね。

以下のようなサイトの場合、パスワードなしでもログインできるようにすることも簡単です

  <?php
   $ret = mysql_qury("SELECT * FROM user WHERE id='" . $id . '" AND pass='" . $pass . "'");

  ?>

以下のような感じのアクセスで回避出来ちゃいます。

http://aaaaa.co.jp/login.php?id=' UNION SELECT pass AS uid FROM user WHERE id='root'#

パスワード部分が、これで回避されるので、パスワードがわからなくても
ログインできちゃいますね。

' でコメント化して、必要な情報を結合して取得後、置き換えたものを表示して
# で以降をコメント化して無効にしてます

ちゃんとしたサニタイズと
対策は必須ですね。

https://www.filetalk.info/index.html

2019年8月21日水曜日

セキュリティー対策(8)

CSRF(クロス サイト リクエスト フォージェリ)とは、
別のスクリプトなどを送り付け、それを実行させて思わぬ動作を実行させることができる攻撃のことです。

特に厄介なのが、攻撃の仕込み方として、一見画像を表示するものであったり、
ページを切り替えるような動作なのにも関わらず、意図しない動作を
実行できてしまうところだと思われます。
(メールとかにも組み込めるので攻撃もしやすいですね)

例えば、htmlで画像を表示するタグである img タグは、画像の元であるパスを指定する
だけでなく、プログラムのURLなどを指定することができます。

通常のイメージタグだと
    <img src="car.jpg" />

プログラムからイメージを表示するタグでは
    <img src="http://aaa.co.jp/xxxx.php" />

パスに画像ファイル以外のものも指定できるって、すごいですよね。
アクセス解析用のカウンターの類は、この手法をつかっています。

仮にこんなページがあって、

  <?php
   $key = $_GET("key");
 $password = $_GET("password");
 if ($key == 1) mysql_query("UPDATE user SET password = '". $password . "'");

  ?>

以下をユーザーに仕込んで実行させると
<img src="http://aaa.co.jp/update.php?key=1&password=xxx" />

内容が変更されてしまいます。

このように、この手法を使うとページを見た人に、思わぬ動作を強いることができるようになります。

https://www.filetalk.info/index.html

2019年8月20日火曜日

セキュリティー対策(7)

そもそもの基本の基本
クライアント側に表示されるHTMLで作成されるものは、
必要な値をサーバーに送信するために、入力しやすいように
設定された条件のようなものになっています。

たとえば、以下のように文字数や入力の制限するコードがあります。

<html>
<body>
  数値型なので、数値しか入力されない?<br />
  <input type="number" name="val_number" /><br />
  文字列を最大4文字まで入力可能?<br />
  <input type="text" name="val_text" maxlength="4" /><br />
  半角英数字しか入力できない?<br />
  <input type="text" name="val_disabled" style="ime-mode: disabled" /><br />
  この入力欄の値は読み込み専用?<br />
  <input type="text" name="val_readonly" readonly="readonly" /><br />
  この入力欄の値は変更できない?<br />
  <input type="text" name="val_disabled" disabled="disabled" /><br />
  非表示の属性(ユーザーからは見えない値なので、変更されない?)<br />
  <input type="hidden" name="val_hidden" /><br />
</body>
</html>

ですが、どれも直接GETやPOSTされた時など、このコードの制限を
一切受けることなく自由な値がサーバー側へ送られてしまします。
ですので、その設定された条件で補正された、正しいデータが
必ず来る保障はないものなのです。

HTML側では、入力の補助。

サーバー側では、クライアントから送られてきた値が正常なものか
別途確認するコードが必要ですね。

https://www.filetalk.info/index.html

2019年8月19日月曜日

セキュリティー対策(6)

インクルート攻撃
ファイル読み込み元として、GETやPOSTの内容を利用してしまうと、
思わぬファイルが読み込まれて、作成者の意図しないページが
外部に表示されてしまうことがあります。
includeを使って別ページをロードさせているようなところは、ありませんか?

  <?php
  include $_GET['opt_file'];
  ?>


ここにこのページを読み込ませてみます。


  <?php
 echo "ファイルが実行されました。";
  ?>


という部分に、ページのURLを指定すると、


のように、ファイルが実行されて、別ファイルのスクリプトだった
「ファイルが実行されました。」が表示されてしまいますね。
外部から実行されないように、includeの使い方には注意が必要ですね。

https://www.filetalk.info/index.html

2019年8月17日土曜日

セキュリティー対策(5)

Directory Traversal(ディレクトリートラバーサル)
簡単なのに威力絶大!
ある文字で巡っていくだけで、××が...
なんてことにならないように対策することが大事ですね。


  <?php
   echo "見られちゃった";

  ?>

../ という文字列には、パスを一つ上の階層を表示するという意味があります。
これを使って、URLに付け加えてアクセスすることで、普段は
見ることができない隠しアドレスを表示することができます。






対策としましては、アドレスに不正な文字がある場合、
アクセスを除外したり、必要のないページに
アクセスできないように権限設定などをすることが大事ですね。




https://www.filetalk.info/index.html

2019年8月16日金曜日

セキュリティー対策(4)

ファイルアップロード攻撃
画像を投稿する等で、ファイルをアップロードするシステムでは、
場合によってはプログラムファイルがアップロードされてしまうと、そこまでのパスが分かれば
プログラムとして実行されてしまいます。

ファイルをアップロードするPHPプログラム

  <?php
   if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
  $file_nm = "data/" . basename($_FILES['myfile']['name']);
  echo $file_nm;
  if (move_uploaded_file($_FILES['myfile']['tmp_name'], $file_nm)){
   echo " up ok";
  }
 }
 
 
 header('Content-Type: text/html; charset=utf-8');

  ?>


プログラムをアップすると


  <?php
   echo "ファイルが実行されました。";

  ?>

アクセスすると実行することが、可能となってしまいます。



プログラムが実行され、文字列が出力されてしまいました。

アップロードしたファイルは、保存場所を知られないようにしたり、
ファイル名を変えたりする必要があります。
また、画像ファイルの場合は、アップロードされた画像をリサイズして
おくことも有効ですね。

https://www.filetalk.info/index.html

2019年8月9日金曜日

セキュリティー対策(3)

ヌルバイト攻撃
NULL(ヌル)という特別な文字列を使うことで、チェックをすり抜けてしまします。

プログラム上の変数でデータの値が無効であるとか、初期化されていない場合
NULLというものになっているのですが、
あえてNULLにしたい場合に、\0 や という文字列をつかうことができます。

対策を怠ると、これを入力欄等に渡すことによって、入力されていないのに
入力されたかのように振る舞うようになってしまいます。


  <?php
 if ($_GET['password'] == '') {
  echo 'パスワードを入力してください。';
 } else {
  echo '入力 OK';
  echo 'パスワードは、' . $_GET['password'] . 'です';
 }
  
  ?>






これは、パスワード欄にNULLを入れたようになってますが、
中身を表示すると、空なので設定されていないことになっている例です。

送られてきた値は、中身にNULLが含まれていないか確認することが必要ですね~。

https://www.filetalk.info/index.html