LOS 19단계 시작!
언뜻 보기에는 이전 문제들처럼 blind injection을 통해 패스워드 길이와 값을 알아낼 수 있을 것 같았다.
하지만 Python 코드를 짜서 실행해봐도 결과값이 나오지 않았다.
패스워드의 각 자리값이 알파벳이나 숫자라면 아스키코드값이 123을 초과하지 않는다.
하지만 아래와 같이 패스워드의 첫 번째 값을 비교해보니 1000보다 크다는 것을 알 수 있었다.
이를 통해 패스워드 값이 한글이 아닐까 생각했다.
다음은 패스워드의 첫 번째 자리값의 크기를 찾아냈다.
패스워드의 한 자리값의 크기가 4byte임을 확인했다.
패스워드를 찾는 여러가지 방법이 있는데 그 중 hex 단위로 패스워드를 찾는 방법을 선택했다.
그래서 다음과 같이 Python 코드를 작성했다.
먼저, hex 값이 될 수 있는 값들을 hex_data라는 문자열로 정의했다.
그리고 hex 단위의 pw 길이를 알아냈다.
길이가 24 인 것을 보아 패스워드의 한 자리가 4byte 이기 때문에 패스워드는 3자리인 것을 확인할 수 있었다.
알아낸 길이를 통해 hex_data 문자열 안의 값들을 통해 패스워드를 알아냈다.
hex 단위의 패스워드는 0000c6b00000c6550000ad73 이고 이를 4byte 씩 나눠보면
0000c6b0/0000c655/0000ad73 이고 10진수로 변환하면 50864/50773/44403 이다.
chr() 함수를 통해 문자로 변환한 결과 "우왕굳" 이라는 값을 얻을 수 있었다.
성공!
더 쉬운 방법이 있는지 다른 분들이 블로그에 올려놓은 답들을 찾아보았다.
그 중 가장 간단한 방법으로 푼 답이 있었다.
먼저 정답 쿼리는
?pw=' or (select @a:=pw where id = 'admin') union select @a %23 이다.
서브쿼리를 이용했고 쿼리의 의미는 a라는 변수를 만들어 admin의 패스워드 값을 대입하고 union을 이용하여
대입한 패스워드의 값을 id 값으로 출력한다는 것이다.
그 결과, 다음과 같이 "우왕굳" 이라는 패스워드 값이 출력되게 된다.
이 답을 보니 역시 많이 아는 만큼 문제를 쉽게 풀 수 있다는 것을 느낄 수 있었다.
'WarGame > LOS (Lord Of SQLInjection)' 카테고리의 다른 글
21단계 : iron_golem (0) | 2020.01.20 |
---|---|
20단계 : dragon (0) | 2020.01.20 |
18단계 : nightmare (0) | 2020.01.09 |
17단계 : zombie_assassin (1) | 2020.01.07 |
16단계 : succubus (0) | 2020.01.06 |