ちょっとメモ(これSQLiなん?)

とある診断員からの診断結果レポートをレビューしていたところ「う〜ん」と悩んだのでメモしておく

指摘している脆弱性はSQLi、いくつかの診断文字列を試行してしっかりと検証をしていたが、ある検証文字列で疑問が浮かんだ、データ挿入(更新)系の機能で文字列連結のSQL文として 「'ho'+'ge'」と「'ho''ge'」と「'ho'ge'」を検証していた。

インサート文にすると

insert into samle_tbl values('ho'+'ge')
insert into samle_tbl values('ho''ge')
insert into samle_tbl values('ho'ge')

のイメージとなる

診断員は一番目のSQLを実行すると「+」(プラス)が作用し「ho」と「ge」が結合され「hoge」がインサート、 二番目のSQLを実行すると文字列中の片方の「'」(シングルクォート)がエスケープとなりもう片方の「'」(シングルクォート)が文字列と認識され 「ho'ge」がインサート、三番目のSQLを実行すると'(シングルクォート)が不整合となりエラーとなることを期待し、まさにその通りの結果となっていた。

最初はなんの疑いもなかったが、診断対象システムがMariaDBであったことで疑問が発生した。

「あれ?MariaDBの文字列連結で「+」(プラス)って使えないでしょ」と思ったが、いまいち自信がなかったので検証をしてみた

検証したMariaDB

mysql> select version();
+--------------------------+
| version()                |
+--------------------------+
| 10.0.38-MariaDB-1~xenial |
+--------------------------+
1 row in set (0.00 sec)

mysql> 

一番目のSQL

mysql> insert into sample_tbl values('ho'+'ge');
Query OK, 1 row affected, 2 warnings (0.03 sec)

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from sample_tbl;
+---------+
| message |
+---------+
| 0       |
+---------+
1 row in set (0.00 sec)

mysql> 

やはり連結はされない

念のため他のSQLも確認してみる

二番目のSQL

mysql> insert into samle_tbl values('ho''ge');
Query OK, 1 row affected (0.03 sec)

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from samle_tbl;
+---------+
| message |
+---------+
| 0       |
| ho'ge   |
+---------+
2 rows in set (0.00 sec)

mysql> 

これは想定通り

3番目のSQL

mysql> insert into samle_tbl values('ho'ge');
    '>
mysql> 

「'」(シングルクォート)の数が奇数?なので、まだ続きがあるんだろ的は動きwなので想定通り

とりあえず、SQLiの検証としては二番目、三番目でOKなので、SQLiは指摘できるが、なぜ一番目の検証文字列で文字列が結合されたのかは不明である。

お客さんにソースくれとは言えなし・・・