セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

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;         // テーブル出力

sleep0が帰ってくるはず。上の結果から、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が実行されてるのも面白いですね。