水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > DBIx::Class::ResultSetのsearch_literalをSQLインジェクションで突破

DBIx::Class::ResultSetのsearch_literalをSQLインジェクションで突破

2009年3月3日(火曜日)

DBIx::Class::ResultSetのsearch_literalをSQLインジェクションで突破

公開: 2009年3月5日0時25分頃

DBIx::Class::ResultSetでsearch()を使うとき、第二引数に{rows=>10}などを渡すと簡単にLIMITが指定できます。が、同じ事をsearch_literal()でやろうとすると、可変個のバインド変数を受け取るためかうまく行かず……。DBIx::Class::ResultSetの説明 (search.cpan.org)を読むと、search()の引数が「$cond, \%attrs?」なのに対してsearch_literal()の引数は「$sql_fragment, @bind_values」となっていて、そもそも\%attrsを渡せるようにはなっていないようですね。

……で、いろいろ調べていたら、こんな書き込みを発見しました。

$rs->search_literal('id = ?) FOR UPDATE; --', $id);

search_literalは与えた文字列のまわりを括弧でくるんでくれるので、 FOR UPDATEの部分を外に出すために途中で括弧を閉じ、そのままだと お尻の括弧が余るのでコメントにして無視させるというかなり強引なトリックです。

以上、Perl::DBI より

これはすごい。search_literalの引数はWHEREの後ろに括弧で括られて出力されるので、引数に「)」を混ぜることによってその括弧を閉じてしまい、さらに後ろにいろいろ指定できるようにするという「強引な」技です。要はSQLインジェクションでやりたいことを実現するという……。

関連する話題: セキュリティ / Perl

最近の日記

関わった本など

インクルーシブHTML+CSS & JavaScript 多様なユーザーニーズに応えるフロントエンドデザインパターンデザイニングWebアクセシビリティ - アクセシブルな設計やコンテンツ制作のアプローチコーディングWebアクセシビリティ - WAI-ARIAで実現するマルチデバイス環境のWebアプリケーション体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践ウェブの仕事力が上がる標準ガイドブック 5 WebプログラミングWeb Site Expert #13Dreamweaver プロフェッショナル・スタイル [CS3対応] (Style for professional)

その他サイト