본문 바로가기

워게임/LOS

[워게임 LOS] 문제 18번, 나이트메어(Nightmare)



Lord Of SQL injection, 문제 18번 나이트메어입니다.


일단 자리수가 6자리 이하로 정해져있습니다.

필요한 값을 작성해보겠습니다.


%27) 그리고 뒤를 주석처리할 %00


%27은 single quote 이고 %00은 그저 널값이니까 총 세자리를 사용했습니다.

그러면 남은 세자리로 답을 출력해야는 상황입니다.


해답을 보기전에, SQL문에서 일반적으로 문자열과 상수를 어떻게 비교를 하는지부터 알아보겠습니다.

 "AAA" = 1 은 거짓입니다.

당연하듯이 AAA는 따옴표로 감싸진 문자열이고 1은 상수이지요.


그런데..

 "AAA" = 0 은 참이됩니다.

엥? 왜 참이 되는 걸까요?

그 이유는 0 에게 있습니다.

SQL에서는 0이 임의의 문자열을 나타내는 역할을 맡고있습니다.


하지만

 '123'=0 은 거짓입니다.

사용자의 편의상 '123'=123 을 참으로 계산하는데

위와 같은 값에서 Single quote가 없어지면 결국 123=0 이므로 거짓이 됩니다.



사진을 보면 더 정확히 알 수 있습니다.

pw가 1일 때는 거짓으로 처리되서 결과가 나오지 않고

pw가 0일 때는 참으로 처리되서 반환값이 나옵니다.


결국 이렇게 작성하면 클리어할 수 있습니다.


pw=%27)=0;%00


그리고 이렇게 작성된 것은 사진에서 보시다시피 pw=0과 같습니다.