ちょっとメモ(これ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は指摘できるが、なぜ一番目の検証文字列で文字列が結合されたのかは不明である。
お客さんにソースくれとは言えなし・・・