2

インジェクション攻撃を作成する可能性があると多くの人が言っていることに気付きましたが、私の理解では、誰かがパラメーターではなく文字列からクエリを作成している場合です。ストアド プロシージャがインジェクション攻撃から保護しないという声明をテストするために、脆弱性がある場合は誰かが私に脆弱性を示してくれることを期待して、この例を掲載しています。

プロシージャを呼び出す関数を簡単に挿入して SELECT クエリに埋め込むために、この方法でコードを作成したことに注意してください。つまり、Prepared Statement を作成できません。理想的には、動的で迅速なセットアップをこのように維持したいと考えていますが、誰かが機能するインジェクション攻撃を作成できる場合、明らかにそれは起こりません.

DELIMITER $$

#This procedure searches for an object by a unique name in the table.
#If it is not found, it inserts. Either way, the ID of the object
#is returned.

CREATE PROCEDURE `id_insert_or_find` (in _value char(200), out _id bigint(20))
BEGIN
    SET @_value = _value;
    SET @id = NULL;
    SELECT id INTO _id FROM `table` WHERE name=_value;

    IF _id IS NULL THEN
        BEGIN
            INSERT INTO `table` (`name`) VALUE (_value);
            SELECT LAST_INSERT_ID() INTO _id;
        END;
    END IF;
END$$

CREATE FUNCTION `get_id` (_object_name char(200)) RETURNS INT DETERMINISTIC
BEGIN
    SET @id = NULL;
    call `id_insert_or_find`(_object_name,@id);

    return @id;
END$$

PHP コード

ここで使用する PHP コードは次のとおりです。

(注、Boann は以下のこのコードの愚かさを指摘しています。答えを尊重するために編集しているのではありませんが、コード内の単純なクエリではないことは確かです。->prepare を使用して更新されます。など。新しい脆弱性が見つかった場合は、追加のコメントを歓迎します。 )

function add_relationship($table_name,$table_name_child) {
    #This table updates a separate table which has 
    #parent/child relationships listed.
    $db->query("INSERT INTO table_relationships (`table_id`,`tableChild_id`) VALUES (get_id('{$table_name}'),get_id('{$table_name_child}')");
}

最終結果は

table `table`
id      name
1       oak
2       mahogany

オークをマホガニーの子にしたい場合は、

add_relationship("mahogany","oak");

プラスチックを樫の木の子にしたいなら

add_relationship("oak","plastic");

うまくいけば、フレームワークとコンテキストを提供するのに役立ちます。

4

2 に答える 2

4

安全でないのは必ずしもストアド プロシージャではなく、呼び出し方です。

たとえば、次のようにするとします。

mysqli_multi_query("CALL id_insert_or_find(" + $value + ", " + $id + ")");

その後、攻撃者は設定します$value="'attack'" and id="1); DROP SCHEMA YOUR_DB; --"

結果は次のようになります

mysqli_multi_query("CALL id_insert_or_find('attack', 1); DROP SCHEMA YOUR_DB; --)");

ブームデッド

于 2013-07-31T03:39:05.780 に答える