Webhacking.kr 49번 문제
49번 문제는 300스코어의 문제이며, 이전의 문제 풀이 했을때 같은 쉬운 편에 속하는 문제와 비슷한 유형이다. 거의 데자뷰급.. 페이지를 보면, 머리말에 SQL INJECTION 이라 기재되어있다. 그렇다. 본 문제는 SQL Injection 문제이다. 페이지내 작은 입력 폼이 보이고, “level” 이라는 라벨 옆 한개의 인풋 필드가 존재하는데, 이 필드의 기본 값은 “1” 이다. 기본값으로 요청을 해보니, 입력 폼 하단에 “zzibong” 이라는 값이 추가되어 응답한다. 이 후, 다른 값으로 요청해 보았을 때 위의 문자열을 더 이상 응답해주지않고있다. ” ”, “&&” 등의 연산자를 테스트겸 추가하여 요청해보니 추가된 연산자에 따라서 “zzibong”값이 응답되었다. 문제 내 소스를 보니, 힌트 페이지가 숨겨져있었고, 숨겨진 힌트 내용은 아래와 같다. if(time()<1258110000) exit();if($_GET[lv]){if(eregi("union",$_GET[lv])) exit();if(eregi("from",$_GET[lv])) exit();if(eregi("select",$_GET[lv])) exit();if(eregi("or",$_GET[lv])) exit();if(eregi("and",$_GET[lv])) exit();if(eregi("\(",$_GET[lv])) exit();if(eregi("\)",$_GET[lv])) exit();if(eregi("limit",$_GET[lv])) exit();if(eregi(",",$_GET[lv])) exit();if(eregi("/",$_GET[lv])) exit();if(eregi("by",$_GET[lv])) exit();if(eregi("desc",$_GET[lv])) exit();if(eregi("asc",$_GET[lv])) exit();if(eregi("cash",$_GET[lv])) exit();if(eregi(" ",$_GET[lv])) exit();if(eregi("%09",$_GET[lv])) exit();$q=@mysql_fetch_array(mysql_query("select id from members where lv=$_GET[lv]"));echo($q[0]);if($q[0]=="admin") @solve();} eregi 라는 method의 설명은 아래와 같다. Case insensitive regular expression match 대소문자 구별 없이, 첫 번째 인자 값에 해당하는 문자열을 두번째 인자값에 찾는다. 이 후 참이라면 exit method keyword 를 통해 프로세스를 종료한다. 따라서 아래 목록에 있는 문자열은 사용할 수 없다는 것 이다. union from select or and \( \) limit...