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インジェクションでやりたいことを実現するという……。
- 「DBIx::Class::ResultSetのsearch_literalをSQLインジェクションで突破」にコメントを書く
- 前(古い): 森の生活 103日目: ひなまつり
- 次(新しい): セッションIDが視認できると問題がある?