あらまし
ここのwriteupで次のようなSQL文がある。
select * from login where username=''-sleep(1);
https://blog.bi0s.in/2019/10/16/Web/inctfi19-web-writeups/
この結果、loginテーブルの内容が全て取得できているロジックがいまいちわからなくて調べた。
準備
create table Test(id integer, title varchar(100)); insert into Test(id, title) values(1, "Hello"); insert into Test(id, title) values(2, "foo"); insert into Test(id, title) values(3, "bar");
-は何
演算子としての-と正規表現中に出現する-がある。任意の文字がマッチするようになるのかと思ったけれど、恐らく演算している。
select * from Test where title='false' // 結果なし select * from Test where title=''-false; // テーブル出力 select * from Test where title=''-true; // 結果なし select * from Test where title=''-0; // テーブル出力 select * from Test where title='aaaa'-false; // テーブル出力
sleepは0が帰ってくるはず。上の結果から、booleanの値が関係してそう。
false 0 減算など
SELECT '' IS false; // 1 SELECT 0 IS false; // 1 SELECT 0 IS true; // 0 SELECT ''-0 IS false; // 1 SELECT 'aaa'-false IS false; // 1 SELECT 'aaa'-0 IS false; // 1
上の結果から、多分演算が型の違いか何かで失敗してfalseが返ってることがわかる。
where username=false;?
select * from Test where title=false; // テーブル出力 select * from Test where title=true; // 結果なし
''-sleep(1)は演算失敗してfalseが返ってくることで、全テーブルが得られていたと推測できる。また、先にsleep(1)が評価されて、sleepが実行されてるのも面白いですね。