1

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)
4

4 に答える 4