2011-07-22 15 views
3

ここで説明したINSERTでのSQLインジェクションはMySQLでは動作しません。 SQL injection on INSERTINSERTでのSQLインジェクション

私はこの文を使用する場合:このエラーが返される

'); DELETE FROM users; --

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM users; --')' at line 1 'VALUE1' 変数の値としてこれにより

INSERT INTO COMMENTS VALUES('122','$_GET[value1]');

何が問題なのですか?

PS:誰かがこのような可変値でSQLインジェクションを行うために私を提案した:

',(SELECT group_concat(table_name) FROM information_schema.tables INTO OUTFILE '/var/www/tables.txt'))-- -

しかし、それはどちらか動作しませんでしたし、構文エラーが返されました。

+0

実際のSQLの印刷物を実際に見ると便利です。あなたが思うだけではありません。少なくともあなたが使っているPHPコードは、あなたが示したものがうまくいくはずですから。 – vol7ron

+0

私はこのPHPコードを試しました: <?php $ con = mysql_connect( "localhost"、 "root"、 ""); if(!$ con) { die( '接続できませんでした:'。mysql_error()); } mysql_select_db( "sandbox"、$ con); $ sql = "コメントの挿入( '122'、 '$ _ GET [値1]');"; if(!mysql_query($ sql、$ con)) { die( 'Error:'。mysql_error()); } mysql_close($ con); ?この入力で > :? sqlinjectiontest.php VALUE1 = ');%20DELETE%20FROM%の20users;文字列の配列を使用する場合%20-- – user857123

+0

は、あなたの質問では、ないコメント – vol7ron

答えて

3

あなたのインジェクションは、単一のSQL文(INSERT ...)を複数のSQL文(INSERT ...; DELETE ...)に変換します。

ただし、PHP mysql API does not support multiple statementsを1回のクエリで使用できます。 (基本となるMySQL C APIは、バインドでは行わないexplicitly instructed to support this functionalityでなければなりません)。

+0

だから、実際には、ファイルを開いたり編集したりすることなく、このようなSQLインジェクションを行うことはできませんもう一度保存してください。実際のSQLインジェクションでは不可能なこと。 – user857123

+0

申し訳ありませんが、私はそのコメントを理解できていません。通常使用されるMySQL C APIと特にPHPバインディングは、単一のクエリで複数のステートメントを受け入れません。 – pilcrow

2

@pilcrowは指摘しているように、mysql_queryは1つのステートメントのみを受け入れます。

INSERT INTO COMMENTS VALUES('122','value'); 

と::あなたの例では、実際には2つの文である

DELETE FROM users; 

PHP mysql APIは、直ちにこれを拒否しますので、あなたは、SQLインジェクションをテストするためにそれを使用することはできません。

ステートメントに関するもう1つの問題は、コメント文字の使用です。

From a “-- ” sequence to the end of the line. In MySQL, the “-- ” (double-dash) comment style requires the second dash to be followed by at least one whitespace or control character (such as a space, tab, newline, and so on). This syntax differs slightly from standard SQL comment syntax, as discussed in Section 1.8.5.5, “'--' as the Start of a Comment”.

だからあなたは--後に空白を持たなければならない:MySQL Comment Syntaxは、と述べています。 #を代わりに使用する場合、次の空白は必要ありません。

あなたのSQLインジェクションのテストを開始するために簡単かつ安全な方法は、単純なSELECTを試してみることです:PHP mysql APIは、複数の文を拒絶するよう

$value = "1' OR 1; -- "; 
$sql = "SELECT * FROM mytable WHERE id = '$value'"; 

print "$sql\n"; 
// SELECT * FROM mytable WHERE id = '1' OR 1; #' 

$result = mysql_query($sql,$con); 

// Should return multiple rows (if your table has multiple rows): 
while ($row = mysql_fetch_assoc($result)) { 
    print "{$row['id']}\n"; 
} 

、SQLインジェクションのより一般的に使用される例のいくつかは、」勝ちましたそれは良いことです。しかし、上の簡単な例からわかるように、SQLインジェクションでは他のフォームを妨げません。

は、このような文が影響を受ける可能性がどのように考える:

DELETE FROM mytable WHERE id = '1' 

はまた、データを削除するだけで混乱を引き起こしたい悪意のあるハッカー以外の誰にも多くの使用ではおそらくないことを心に留めて。一方、あなたがアクセスするはずのない機密データを入手することは非常に便利です。

関連する問題