LoS Chapter 18 - nightmare
18번째 문제 악몽
코드를 보고 제일 악몽같은 부분은 저 strlen($_GET[pw])>6 부분이었다. 최대 사용가능한 글자 수가 6자
쿼리를 보면 and 뒤에 id != admin 으로 admin 계정으로는 로그인 불가능하게 해놓았다.
근데 전혀 admin으로 로그인할 필요가 없다. solve 부분을 보면 로그인 성공하기만 하면 풀리는 것이다. 그러니 guest로 우회 로그인해도 상관이 없다.
guest로 로그인해도 되므로 id!='admin'을 거짓이 아니라 참인 구문이라고 보면 된다. 그럼 앞의 pw 부분만 참이 되게끔 하면 문제는 해결될 테니 여기까지만 보면 쉽지만?? 아까 말한대로 최대 사용가능한 글자는 6자..!!
그런데 아무리 봐도 pw 부분을 참으로 만들 수가 없다. (그 놈의 여섯 자 때문에)
다른 방법을 모색해야만 했다. 필터링 부분을 보니 주석을 필터링 하는 것 같았다. 근데 필터링 안 된 주석이 2개 보인다.
id!='admin'이 참이니 그걸 이용하려 했지만 이 방법이 아닌 것 같다.
먼저 첫 번째 범위 주석이다. 얘는 암만 범위를 잡아봤자 뒷 부분을 전혀 건들 수 없다. 게다가 아깝게 4글자나 차지하고 있다. 탈락
두 번째는 ; 와 NULL 문자가 결합된 주석이다. 얘도 한 글자 취급이 아니라 두 글자 취급이긴 한데 그나마 주석을 사용해보겠다면 얘를 사용하는게 맞을 것 같다. 주석을 사용하기 위해서는 패스워드를 입력받는 부분과 괄호 안에서 나와야 한다.
괄호를 나와 주석을 처리한 모습이다. 2글자를 추가로 더 사용할 수 있다. 여기서 pw 부분이 참이 되기만 하면 우회가 성공할텐데 어떻게 해야 할까?
pw가 '' 로 비어있으니 0과 비교해준다. 여기서 0은 NULL이 아니다. 정말 숫자 그대로의 0이다. 빈 문자열을 0과 비교하면 True가 나오는 것을 이용하면 된다.