以下の内容はhttps://thinline196.hatenablog.com/entry/2021/08/28/220847より取得しました。


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が実行されてるのも面白いですね。




以上の内容はhttps://thinline196.hatenablog.com/entry/2021/08/28/220847より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14