最初の瞬間
すべてのルール、つまり 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つのケースが考えられます。
- FQ-すべてのパラメーターが準備されています(完全に引用されています)
- NQデータは準備されていません。すべてがデータベースに送信されます(引用なし)。
- 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でのアプリケーションを満たすことができるペンテスター向けです。