-
[LOS] 19. xavis 문제 풀이Wargame/LOS (Lord of SQL Injection) 2019. 7. 24. 00:15
pw에 괄호, LIKE, regex가 필터링이 걸려있다. 또한 id는 admin으로 고정되어 있고, 이 admin에 대한 pw를 알아내면 문제가 해결된다.
먼저 pw의 길이를 length 함수를 통해 찾아본 결과, pw의 길이는 12였다.
?pw=' or length(pw)=12%23
평소 Blind SQL 인젝션 문제를 풀던 것처럼 ascii 함수와 substr 함수를 사용하여 pw를 구하려고 했으나, 아무리 프로그램을 돌려도 pw가 출력되지 않았다.
알파벳이나 숫자가 아닌 다른 문자인가 싶어서 0~9, a~z 범위 외의 다른 범위의 아스키코드 값으로도 찾아보았지만 나오지 않았다. 아무래도 알파벳, 숫자가 아닌 특수 문자가 사용된 것 같아서 pw를 hex로 변환한 값으로 비교해보았다.
먼저 hex로 변환한 pw의 길이를 구해보니 24였다.
이를 토대로 pw의 헥사값을 substr 함수와 hex 함수를 통해 구해본 결과, 000006000000065500000073이 나왔다.
그래서 이를 ASCII로 다시 변환해서 pw 인자로 넣었지만... 되지 않았다.
파이썬으로 코드 짜서 계속 해보는데 답이 안나옴... 뭐가 문제인지 모르겠다.
며칠을 고민하다가 결국 답을 찾아봤는데 pw가 한글이었다.
인코딩 문제였는지 뭐였는지 정말 모르겠는데 내 파이썬 코드로는 도저히 답이 출력되지 않아서 결국 다른 분의 코드를 사용했다. (출처: https://kkamikoon.tistory.com/193?category=829545)
찾아낸 pw를 인자로 넣어주니 문제가 풀렸다.
[다른 방법]
위에 방법은 진짜 너무너무 짜증나서 다른 방법이 있나 찾아봤는데 정말 신박한 방법이 있었다. 만약 UNION이 막혀있지 않다면 이 방법을 쓰는 것도 괜찮을 것 같다.
(참고: https://time-storage.tistory.com/130, https://docs.microsoft.com/ko-kr/sql/t-sql/language-elements/select-local-variable-transact-sql?view=sql-server-2017)
SELECT @local_variable="aaaa"
@local_variable은 SQL문에서 값을 할당하기 위해 선언하는 지역 변수이다. 따라서 이 쿼리문의 의미는 local_variable라는 변수에 "aaaa"라는 값을 할당한다는 뜻이다.
이 방법을 이 문제에 적용하면 이런 쿼리문을 작성할 수 있다.
SELECT @a:=pw WHERE id='admin'
이 쿼리문의 의미는 admin의 pw를 @a라는 변수에 할당한다는 뜻이다. 그런데 이 쿼리문 자체는 @a 변수에 대입만 할 뿐 아무 값도 리턴하지 않기 때문에 뒤에 UNION을 사용하여 @a의 값을 반환해줘야 한다.
따라서 최종 익스플로잇 코드는 다음과 같다.
?pw=' or (select @a:=pw where id='admin') union select @a%23
이대로 입력하면 @a에 저장된 admin의 pw가 출력된다.
P.S. 만나서 더러웠고 다신 보지 말자...
'Wargame > LOS (Lord of SQL Injection)' 카테고리의 다른 글
[LOS] 21. iron_golem 문제 풀이 (2) 2019.07.30 [LOS] 20. dragon 문제 풀이 (0) 2019.07.29 [LOS] 18. nightmare 문제 풀이 (0) 2019.07.22 [LOS] 17. zombie_assassin 문제 풀이 (2) 2019.07.22 [LOS] 16. succubus 문제 풀이 (0) 2019.07.22