Zend FrameworkでのSQLインジェクションへのパス

おそらく記事のタイトルが少しうるさいかもしれませんが、この質問は提起されました。



最初の瞬間



すべてのルール、つまり Zendの内部メカニズムを使用し、メソッドでパラメーターを準備します-現時点では、SQLインジェクションの可能性に関する情報はありません。 同様の設計について話している:

$select->order($value);
      
      





どちらの方法が実際に発見されたか。



第二の瞬間



塩とは何ですか? 実際には、パラメーターが準備なしでそのようなメソッドに到達した場合でも、内部メカニズムがパラメーターを準備します。 すべて(および一部は一部)だけではありません-これが私たちが話していることです。



このライブラリのソースコードはありますが、このトピックを「ブラックボックス」と見なし、より明確で理解しやすいものにします。 より具体的には、MySQLアダプター、 Zend_Db_Selectクラス(同じことがPgSQLでテストされました)



第三の瞬間



Zendを挿入するには、Zendが規則に従っているため、前の逆引用符を閉じる必要があります(たとえば、構文from = select * from `table`の場合 )、またはアポストロフィ-( where id = '1' )パラメータを指定すると、目的の「フレーム」が開きます。 最初のケースでは、 tab`bleを入力に渡すときに、出力でtableを、2番目に:入力1'2で、出力1''2で持つ必要があります。

繰り返しになりますが、メソッドにデータを送信する「生」のことです。



次の3つのケースが考えられます。

  1. FQ-すべてのパラメーターが準備されています(完全に引用されています)
  2. NQデータは準備されていません。すべてがデータベースに送信されます(引用なし)。
  3. PQ-一部のパラメーターは処理されていますが、一部は処理されていません(部分的に引用符で囲まれています)




順番に行こう、SQL構文で順番に



1)-> from- FQ


コード:

 $table = "wp_use`rs"; $select->from($table);
      
      





[queryString] => SELECT `wp_use``rs`.* FROM `wp_use``rs`







2)->参加-PQ


 $table1 = 'tab`le1'; $table2 = 'tab`le2'; $key = 'i`d'; $data = 'da`ta'; $select = $db->select()->from($table1)->join($table2, $table1.'.'.$key.' = '.$table2.'.'.$key, array($data));
      
      





[queryString] => SELECT `tab``le1`.*, `tab``le2`.`da``ta` FROM `tab``le1` INNER JOIN `tab``le2` ON tab`le1.i`d = tab`le2.i`d







3)-> joinUsing- PQ


 $table1 = 'tab`le1'; $table2 = 'tab`le2'; $key = 'i`d'; $column = 'c`ol\'u;m"n'; $select = $db->select()->from($table1)->joinUsing($table2, $column);
      
      





[queryString] => SELECT `tab``le1`.*, `tab``le2`.* FROM `tab``le1` INNER JOIN `tab``le2` ON `tab``le2`.c`ol'u;m"n = `tab``le1`.c`ol'u;m"n







4)-> where- NQ


 $select->from($table); $value = "1)2'3 --"; $select->where($value);
      
      





[queryString] => SELECT `wp_users`.* FROM `wp_users` WHERE (1)2'3 --)







5)->グループ-FQ


 $table = "wp_users"; $value = 'i`d'; $select = $db->select()->from($table)->group($value);
      
      





[queryString] => SELECT `wp_users`.* FROM `wp_users` GROUP BY `i``d`







6)->持っている-NQ


 $table = "wp_users"; $value = 'some_count > 0); hello habr -- 10'; $select = $db->select()->from($table)->having($value);
      
      





[queryString] => SELECT `wp_users`.* FROM `wp_users` HAVING (some_count > 0); hello habr -- 10)







7)->注文-FQ


 $table = "wp_users"; $value = i`d'; $select = $db->select()->from($table)->order($value);
      
      





[queryString] => SELECT `wp_users`.* FROM `wp_users` ORDER BY `i``d` ASC







8)->制限-FQ


FQでさえありませんが、(intへの)型キャストです

 $table = "wp_users"; $limit1 = '1; hello -- '; $limit2 = '2; hello -- '; $select = $db->select()->from($table)->limit($limit1, $limit2);
      
      





[queryString] => SELECT `wp_users`.* FROM `wp_users` LIMIT 1 OFFSET 2





ここまで-> limitPage()、同様の作業



9)->ユニオン-NQ


$ db-> select + string

 $table = "wp_users"; $select = $db->select()->from($table); $select2 = "select * from ta\"b'le`2"; $select3 = $db->select()->union(array($select, $select2)); $db->query($select3);
      
      





[queryString] => SELECT `wp_users`.* FROM `wp_users` UNION select * from ta"b'le`2







要約データ



FQ:-> from、-> group、-> order、-> limit、-> limitPage

PQ:->結合、-> joinUsing

NQ:->どこ、->有、->ユニオン



実際には、フィルタリングされていないデータは、たとえば、ajaxハンドラーで見つけることができます。



PS他のすべてに加えて、おそらく誰かがこのデータをCTFで自分自身に持って行くでしょう。



UPD:モーメント4:この記事は、Zendでのアプリケーションを満たすことができるペンテスター向けです。



All Articles