[원데이 취약점 분석] wordpress 플러그인 - instant images

1mn·2022년 11월 18일
0
post-thumbnail

이번엔 또 또 워드프레스 플러그인 취약점을 분석해보자
(보안 패치는 했지만 아직 패치스택에는 취약점 등록이 안되있다)

1. 취약점 선정


이미지를 Unsplash, Pixabay와 Pexels에서 빠르게 가져와 미디어에 저장시키는 플러그인이다.


미디어 탭에 Instant images라는 탭이 생긴 것을 볼 수 있다.

여기서 이미지를 찾고 이미지를 클릭하면


미디어 라이브러리에 저장되는 것을 볼 수 있다

2. 취약점 분석

먼저 저장 시에 패킷을 살펴보자.

저장시에 이미지의 링크를 BODY에 담아서 전달하는 것을 볼 수 있다. 여기서 SSRF가 일어날 가능성이 있다.
코드를 한번 살펴보자

api/download.php

수정 전(188~205)

function instant_images_generate_image_url( $provider, $url, $max_width, $max_height ) {
	$image_url = '';

	switch ( $provider ) {
		case 'unsplash':
			$image_url = $url . '&fit=clip&w=' . $max_width . '&h=' . $max_height;
			break;

		case 'pexels':
			$image_url = $url . '?dpr=1&w=' . $max_width . '&h=' . $max_height;
			break;

		default:
			$image_url = $url;
			break;
	}
	return $image_url;
}

수정 후(184~215)

function instant_images_generate_image_url( $provider, $url, $max_width, $max_height ) {
	$download_urls = InstantImages::instant_img_get_download_urls();
	$matched       = false;

	// To prevent misuse, loop all potential API urls to match the target url.
	// If the URL for the image to be downloaded is not found, bail early.
	foreach ( $download_urls as $string ) {
		if ( strpos( $url, $string ) !== false ) {
			$matched = true;
		}
	}

	if ( ! $matched ) {
		return false;
	}

	$image_url = '';
	switch ( $provider ) {
		case 'unsplash':
			$image_url = $url . '&fit=clip&w=' . $max_width . '&h=' . $max_height;
			break;

		case 'pexels':
			$image_url = $url . '?dpr=1&w=' . $max_width . '&h=' . $max_height;
			break;

		default:
			$image_url = $url;
			break;
	}
	return $image_url;
}

(사실 패치된 것도 우회 가능하지만 이건 다음에...)
코드를 보면 url 입력값을 필터링하지 않기에, SSRF가 일어날 수 있다. 한번 공격해보자.

3. PoC

공격을 위해 서버의 루트 디렉터리에 특정 파일을 만들고, 이 파일을 공격자가 확인 하는것으로 진행해보겠다.

아파치의 루트 디렉터리에 다음과 같은 파일이 있다.
공격자는 이미지를 다운로드할때 보내는 패킷을 조작해 저 파일을 확인해보겠다.

위의 패킷에서

표시된 부분을 다음과 같이 고쳐준다.

패킷을 보내면

저장에 성공했다는 패킷을 받을 수 있었다.
이제 미디어 라이브러리에 가보면

이런 파일이 저장되어있는것을 볼 수 있고, 파일이 저장되어있는 링크에 접근을 해서 개발자 도구로 살펴보면

다음과 같이 정보를 볼 수 있게 된다.

4. 보안 방법

패치는 했지만, 여전히 우회할 수 있는 부분이 있다. strpos를 이용해서 필터링을 할 때, 등록된 사이트의 링크가 저장된 문자열이 있는지 없는지만 검사하는데, 저장된 문자열이 링크의 맨 앞에 있는지를 확인하면 안전할 것 같다.

profile
정보보안 응애대학생

0개의 댓글