web-dev-qa-db-ja.com

PHP UPDATEステートメントにおけるSQLインジェクションの脆弱性

例として、次の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に設定されることを理解していますが、なぜですか?

6
Roee H

例では、値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に設定します。

2
NSSec