상단에 나오는 쿼리문은 DB에 해당 쿼리문으로 데이터가 들어간다고 알려준다.
이번에는 지난 문제와 다르게 쿼리문을 보면 id에 admin이 아닌 guest가 들어가있고, pw는 그대로 값이 비어있다.
query : select id from prob_wolfman where id='guest' and pw=''
아래에는 php 코드가 나와있으며, 이걸 참고해서 문제를 푸는 것 이다.
해당 php 코드에서 자세하게 봐야 하는 부분은 이 부분인 것 같다.
아래 조건문을 보면 일부 문자 및 공백을 필터링 하며, 입력할 공간은 pw이며, id가 admin이어야지 해당 문제가 풀리는 문제이다.
pw부분은 비교하는 문장이 보이지 않아서 pw 부분을 사용하여 공격하는 것 같은데, 이전에 id값은 들어가 있고 다른 값이 비어있었는데, 비어있는 값만 데이터를 얻어오는 문제가 있었다. 이때 or 를 사용하여 문제를 풀었던 것 같은데 한번 도전 해 봐야겠다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~");
if($result['id'] == 'admin') solve("wolfman");
공백을 사용하면 아래처럼 공백은 안된다고 나온다.
위에서 말한대로 or 을 사용하려면 ?pw=1' or id='admin 의 형태로 넣어야 하는데 공백을 넣지 않게 되면 ?pw=1'orid='admin 이 된다. 뒤에 id값을 넣어야 하는데 공백을 넣지 못하므로 다른 방법을 생각해보았다.
물론 URL 인코딩 우회(공백 = %20)도 시도해 보았으나 안된다.
코딩이나 리눅스 명령어 등등 사용해보며 연산기호를 배웠는데, or의 의미인 |(파이프라인) 을 사용하여 넣어보았다.
→ ?pw=1'||id='admin
또 다른 공백 필터링 우회 방법
공백 필터링을 우회하는 방법들을 추가로 알아본 결과 다음과 같은 방법들이 더 있었다.
문제가 클리어되었다!