SQLi 攻撃を試みています。
警告にもかかわらず、コンパイラは次のクエリを実行します。
select * from users where username='A' or 'B' and password='C';
クエリが実行されるため、攻撃は成功します。このクエリはなぜ機能し、何をしているのか? 値 'B' はブール値で 'True' と見なされますか? 論理演算子は互いにどのように機能しますか? 数学の BODMAS のような特定の順序はありますか? 「B」はスタンドアロンであり、ブール条件ではないことに注意してください。
上記の形式のクエリは mysql データベースで正常に機能し、クエリと同じ結果を返します。
select * from users where username='A';
syantax エラーは返されません。
mysql> select * from authentication where user='A' or 'B' and password='C';
+------+----------+
| user | password |
+------+----------+
| A | B |
+------+----------+
1 row in set, 1 warning (0.00 sec)
警告は次のとおりです。
mysql> show warnings;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'B' |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)