나이트메어..
굉장히 힘든문제였다...ㅠㅠ
굉장히 조건이 까다로워서 힘들었다.
길이가 최대 6글자까지만 입력가능하다....
닫는 쿼터,괄호,주석만 해도 반이상을 써버리는데 조건은 언제 쓸 수 있는건지....
'어떻게 풀지?' 라는 사고에 싸여 방황하던중
몇시간이 지나고서야 어디에 중점을 두어야할지 감이 잡히기 시작했다.
아무래도 뒤의 쿼리문때문에 주석은 필요한게 맞는것 같다.
그렇다면 주석을 우회하는 방법은?
;%00
;과 NULL 두글자를 사용해야한다.
주석을 사용한다면 손수 싱글쿼터와 괄호를 막아주어야하니 두글자를 더 써야한다.
즉 ');%00 현재까지 총 4글자를 사용했다.
나머지 두글자를 이용해 참을 만들어야한다.
이 부분에서 한번 더 막힌다.
남은 글자는 총 두글자
참으로 만들기 위해선 하나는 연산자가 되야할 것이고 하나는 값이어야하는데...
pw=('') 이것이 없는값이니 거짓인 0과 같다?
오??
정확하지 않게 풀렸으니 자세히 알아보자
aaa는 원래 있는 아이디임에도 해당 아이디를 제외하고 나머지 내용이 모두 나왔다
이를통해 =0이 부정 역할을 한 것임을 알 수 있다.
('aaa')=0 을 따로 계산했을 때의 결과가 궁금해서 또 알아보니 아래와 같았다.
'a'='a' --> 참
'a'=1 --> 거짓
'a'=0 --> 참
mysql에서 나오는 결과들이다.
이해가 안될수도 있다.
아래는 위의 상황에 대한 검색결과이다.
문자들이 자동적으로 숫자로 필요에 의해 변환된다는 말이다.
이 뜻은 숫자와 문자열을 비교하기 위해서 문자열의 처음부터 숫자를 추출해낸다. (문자를 만나기 전까지)
이 때, 대부분의 문자열의 첫글자는 숫자가 아니기 때문에 숫자랑 비교하기가 어렵다.
그렇기 때문에 숫자가 아닌 문자들은 모두 0으로 변환된다.
만약 맨 첫글자가 숫자라면 해당 숫자와 결과값이 같다.
아래는 mysql에 직접 실험해본 것이다.
이를 통해서 이 문제가 어떻게 저렇게 풀렸는지 이해할 수 있다.
'Wargame > LOS(eagle-jump)' 카테고리의 다른 글
[LOS]20번 dragon (0) | 2017.08.09 |
---|---|
[LOS]19번 xavis (0) | 2017.08.07 |
[LOS]17번 succubus (0) | 2017.08.04 |
[LOS]16번 zombie_assassin (0) | 2017.08.03 |
[LOS]15번 assassin (0) | 2017.08.03 |