CTF MySQLとか「''-sleep(1)」に関して
//
あらまし
ここの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
が実行されてるのも面白いですね。