2

だから私は、準備された SQL ステートメントを使い始めるように上司に教えようとするプロジェクトを持っていますが、彼はあまり気にせず、大したことではないと言います。それが大したことであることを彼に証明する方法を知りたいのですが、セットアップした開発テストサーバーにドロップテーブルコマンドを挿入する方法がわかりません. テスト段階にある会社向けのアプリケーションを開発しましたが、その会社の SQL コードを使用しているため、それを削除して (バックアップを取って) 問題を彼に提示したいと考えています。私は会社にプリペアド ステートメントを使用する習慣をつけさせようとしていますが、変更を望んでいるのは私だけのようで、彼らはそうしません。このデータベースを SQL インジェクションで「クラック」するのを手伝ってくれる人はいますか? ありがとう!!

送信するフォームにはコメント ボックスがあり、アポストロフィが表示されるとエラーがスローされます。

クエリを作成できません:SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、78 行目の 's";', '100', '100')' 付近で使用する正しい構文を確認してください。

私はもう試した

foo'); DROP TABLE cabletypes;--

しかし、同じエラーが発生します。フォームを送信する前にテキストエリアに入力しているときに、正常に挿入するにはどうすればよいですか? テキストエリアは「コメント」列と値に送信されます。

SQL

$sql="INSERT INTO cabletypes
        (cable_type,
        sample_no,
        sample_date,
        section_lg,
        wet_dry,
        avgofppf,
        sheath_type,
        plastic_wt,
        inner_sheath,
        inner_al_wt,
        inner_steel_wt,
        cable_guard,
        guard_al_wt,
        guard_steel_wt,
        guard_other_wt,
        total_pairs_a,
        pair_count_gauge_a,
        copper_wt_a,
        total_pairs_b,
        pair_count_gauge_b,
        copper_wt_b,
        total_pairs_c,
        pair_count_gauge_c,
        copper_wt_c,
        total_pairs_d,
        pair_count_gauge_d,
        copper_wt_d,
        sum_pairs,
        copper_wt,
        copper_percent,
        lead_wt,
        lead_percent,
        contains_lead,
        waste_wt,
        sampler,
        supervisor,
        comments,
        cable_no,
        section_no)
        VALUES (
        '$cable_type',
        '$sample_no',
        '$sample_date',
        '$section_lg',
        '$wet_dry',
        '$avgofppf',
        '$sheath_type',
        '$plastic_wt',
        '$inner_sheath',
        '$inner_al_wt',
        '$inner_steel_wt',
        '$cable_guard',
        '$guard_al_wt',
        '$guard_steel_wt',
        '$guard_other_wt',
        '$total_pairs_a',
        '$pair_count_gauge_a',
        '$copper_wt_a',
        '$total_pairs_b',
        '$pair_count_gauge_b',
        '$copper_wt_b',
        '$total_pairs_c',
        '$pair_count_gauge_c',
        '$copper_wt_c',
        '$total_pairs_d',
        '$pair_count_gauge_d',
        '$copper_wt_d',
        '$sum_pairs',
        '$copper_wt',
        '$copper_percent',
        '$lead_wt',
        '$lead_percent',
         0,
        '$waste_wt',
        '$sampler',
        '$supervisor',
        '$comments',
        '$cable_no',
        '$section_no')";
    }

mysql_query($sql) or die ("Unable to Make Query:" . mysql_error());

print("Sample Sheet Submitted Successfully!");
4

3 に答える 3

3

PHP のext/mysqlインターフェイスでマルチクエリ SQL を発行することはできません。; DROP TABLE Studentsそのため、トリックをまったく実行できません。これは、非推奨の mysql 拡張機能を支持する数少ないポイントの 1 つです。

皮肉なことに、PDO はデフォルトですべてのクエリに対してマルチクエリをサポートしています。また、Mysqli は、明示的にmysqli::multi_query()を呼び出した場合にのみサポートします。

しかし、DROP TABLE は、攻撃者が SQL インジェクションで行おうとする唯一の不正行為ではありません。実際、DROP TABLE を実行する攻撃は悪意がありますが、攻撃者にとって何の価値もありません。ほとんどの SQL インジェクション攻撃は、より組織的です。

INSERT ステートメントの例のエクスプロイトを考えることができます。

http://yourapp.example.com/cable_types.php?supervisor=jflay',(SELECT GROUP_CONCAT(CONCAT(table_name,'.',column_name)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema=DATABASE()), NULL, NULL) --

ほら!コメントがデータベース内のすべてのテーブルと列を教えてくれるケーブル タイプを作成しました。その後、この知識を使用して、サイト内の他のページを悪用するための後続の試みを行うことができます。

(実際には、GROUP_CONCAT にはデフォルトで 1024 文字の長さ制限があり、列の完全なセットはおそらくそれよりも長いため、これは確実な例ではない可能性があります。このエクスプロイトを使用して同じ情報を取得できますが、おそらくいくつかの INSERT クエリを実行します。)

とにかく、あなたの上司、セキュリティのために、またアポストロフィを含む文字列をサポートするためにも、コーディングの容易さとパフォーマンスのためにも、パラメーター化されたクエリを使用する必要があります。準備されたステートメントは、準備されていないステートメントよりも 14% 高速に実行されることを彼に伝えてください。

于 2013-05-02T03:44:16.457 に答える