늘모자란, 개발 :: [webhacking.kr] Challenge 53

늘모자란, 개발

문제에 들어오면 hello world 딸랑 하나 있다

<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]만 하니까 첫번째 컬럼만 출력하지만 이걸로도 테이블 이름은 충분히 알 수 있다.
테이블 명을 넣어주면 패스..


2016/04/02 16:52 2016/04/02 16:52