[Level 18. Nightmare] Sol → ?pw=')=0;%00
패스워드가 6을 넘어가면 안 되고 #도 사용할 수 없다. 하지만 #나 -- 대신 %00(null)를 사용할 수 있다.
우선 이것저것 넣어보기 시작했다.
pw=')or('1는 길이가 7이라서 안된다.
그래서 일단 MySQL을 켜서 여러 가지 시도를 해보았다. or 대신 한 글자만 쓸 수 있는 연산자를 찾다가 &을 넣어보았다.
근데 ('')&('1')을 넣었더니 login_id 일부가 뜨는 것을 볼 수 있었다. 그래서 select를 사용해서 ('')&('1') 값이 무엇인지 확인해보았다.
왜 각 값을 0으로 인식하는지 궁금해서 select 문을 사용해서 ('')만 따로 출력해보았다.
select로 확인해보니 ('')는 아무 값도 출력이 안돼서 null을 의미하는 건지, 0을 의미하는 건지 테스트해보았다. 확인해보니 ('')는 0을 의미했고 추가로 체크해보니 MySQL에서는 ('숫자')와 숫자를 같다고 인식했다.
따라서 ('')=0 이므로 참, ;로 문장을 끝내주고 %00로 주석 처리를 해주면 6글자만 사용해서 문제 풀이가 가능하다.
-----------------------------------------------------------------------------------------------
궁금한 것을 추가로 확인해보았다.
위에서 ('')&('1') 형태의 여러 값들을 확인해봤는데 전부 0이 나왔다. 그래서 0을 직접적으로 넣어보았다.
짐작컨데, test 계정의 패스워드는 유일하게 숫자이고 나머지는 모두 문자열이라서 0을 숫자 0이 아닌 값으로 인식한 게 아닌가 싶었다. 그래서 test는 12345라 해당되지 않았지만 나머지는 문자열이라서 출력된 것 같다.
두 번째로 ('')를 확인했으니 &가 무슨 연산자인지 확인해보았다.
& 연산자는 AND 연산자(| 는 OR 연산자)로, 비트 연산자이다.
비트 두 개를 연산했을 때 둘 다 1이면 1, 하나라도 0이면 0을 출력하는 연산자이다.
그래서 1&1 = 1, 2&2 = 10&10 = 10 = 2 2&5 = 10 & 101 = 000 = 0, 0&0 = 0과 같은 결과를 출력한 것이다.
정리하자면 ('')&('2') = 0&2 = 0, ('')&('1') = 0&1 = 0, ('')&('') = 0&0 = 0이기 때문에 모두 0이 나온 것이다.
'WarGames > SQL Injection' 카테고리의 다른 글
Lord of SQL Injection : Dragon[20] (0) | 2021.12.22 |
---|---|
Lord of SQL Injection : Xavis[19] (0) | 2021.12.19 |
Lord of SQL Injection : Zombie_assassin[17] (0) | 2021.12.16 |
Lord of SQL Injection : Succubus[16] (0) | 2021.12.14 |
Lord of SQL Injection : Assassin[15] (0) | 2021.12.13 |
댓글