<html> <head> <title>Challenge 53</title> </head> <body> hello world <br><br><br> <? if(time()<1260615600) exit(); $hidden_table="????"; if($_GET[answer]==$hidden_table) { @solve(); exit(); } if(eregi("union",$_GET[val])) exit(); if(eregi("select",$_GET[val])) exit(); if(eregi("from",$_GET[val])) exit(); if(eregi("/",$_GET[val])) exit(); if(eregi("\*",$_GET[val])) exit(); if(eregi("#",$_GET[val])) exit(); if(eregi("-",$_GET[val])) exit(); if(eregi(",",$_GET[val])) exit(); if(eregi("=",$_GET[val])) exit(); if(eregi("!",$_GET[val])) exit(); if(eregi("\|",$_GET[val])) exit(); if(eregi("by",$_GET[val])) exit(); $f=@mysql_fetch_array(mysql_query("select test1 from $hidden_table where test2=$_GET[val]")); echo($f[0]); if($f) { echo("<br><br><form method=get action=index.php>challenge53 TABLE NAME : <input type=text name=answer size=50><input type=submit></form>"); } ?> <!-- index.phps --> </body> </html>
가장 위에 있는 answer는 최종 정답이고, val을 이용해 일단 들어가야되는데 이건 or이 막혀있지 않아서 간단히 패스할 수 있다.
2%20or%201
이제 여기서 부터 시작이다.
(밑에 사진 올리고 나서 알아챘지만 그냥 1,2,3,4 입력해도 나온다..........)
옛날에 컬럼이름은 어떻게 알아내는가?에 대해 글을 쓴적이 있는데 결론은 information.schema 에 접근을 못하면 못알아낸다로 결론을 냈었다.
심지어 이 문제에서는 select도 못하고, union도 못하며, from도 못한다. 진짜 어떻게 하라는건지 감도 못잡고 있다가 결국 검색찬스를 썼다.
결론부터 말하자면 이녀석이다.
procedure analyse()
난 본적도 없는데 검색해보면 인젝션 기법중 하나라고 많이 나오는데 여기까지 닿기가 정말 어렵다. 도저히 모르겠다.
결국 한번 돌려보고 결과를 얻어봤는데, 컬럼들이 전부 나오고 최대길이의 row, 최적화된 length , type을 추천해준다.
당연히 테이블명을 얻을 수 있는건 일도 아닌것이다. 다 사용하고 있는 DB라 보여줄순 없네. 여튼 유용하게 쓰일만한 기법이다.
여튼 val에 들어갈 쿼리를 이렇게 꾸민다.
1 procedure analyse() #
그럼 테이블명을 뱉는다. 출력을 [0]만 하니까 첫번째 컬럼만 출력하지만 이걸로도 테이블 이름은 충분히 알 수 있다.
테이블 명을 넣어주면 패스..