이번엔 또 또 워드프레스 플러그인 취약점을 분석해보자
(보안 패치는 했지만 아직 패치스택에는 취약점 등록이 안되있다)
이미지를 Unsplash, Pixabay와 Pexels에서 빠르게 가져와 미디어에 저장시키는 플러그인이다.
미디어 탭에 Instant images라는 탭이 생긴 것을 볼 수 있다.
여기서 이미지를 찾고 이미지를 클릭하면
미디어 라이브러리에 저장되는 것을 볼 수 있다
먼저 저장 시에 패킷을 살펴보자.
저장시에 이미지의 링크를 BODY에 담아서 전달하는 것을 볼 수 있다. 여기서 SSRF가 일어날 가능성이 있다.
코드를 한번 살펴보자
수정 전(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가 일어날 수 있다. 한번 공격해보자.
공격을 위해 서버의 루트 디렉터리에 특정 파일을 만들고, 이 파일을 공격자가 확인 하는것으로 진행해보겠다.
아파치의 루트 디렉터리에 다음과 같은 파일이 있다.
공격자는 이미지를 다운로드할때 보내는 패킷을 조작해 저 파일을 확인해보겠다.
위의 패킷에서
표시된 부분을 다음과 같이 고쳐준다.
패킷을 보내면
저장에 성공했다는 패킷을 받을 수 있었다.
이제 미디어 라이브러리에 가보면
이런 파일이 저장되어있는것을 볼 수 있고, 파일이 저장되어있는 링크에 접근을 해서 개발자 도구로 살펴보면
다음과 같이 정보를 볼 수 있게 된다.
패치는 했지만, 여전히 우회할 수 있는 부분이 있다. strpos를 이용해서 필터링을 할 때, 등록된 사이트의 링크가 저장된 문자열이 있는지 없는지만 검사하는데, 저장된 문자열이 링크의 맨 앞에 있는지를 확인하면 안전할 것 같다.