2022.11.05
원데이 취약점 분석 스터디 5주차
CVE-2022-34154
<?php
class (plugin name){
/*This allows to upload webp files */
function webp_file_ext( $types, $file, $filename, $mimes ) {
if ( false !== strpos( $filename, '.webp' ) )
//.webp 이 존재하는지 확인
//.webp 이 파일명에 존재만 하면 되기 때문에 이 부분에서 취약점이 발생함.
{
$types['ext'] = 'webp';
$types['type'] = 'image/webp';
}
return $types;
}
function webp_file_upload( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
/*Preview Webp files */
function preview_webp_thumnail($result, $path) {
if ($result === false) {
$displayable_image_types = array( IMAGETYPE_WEBP );
$info = @getimagesize( $path );
if (empty($info)) {
$result = false;
} elseif (!in_array($info[2], $displayable_image_types)) {
$result = false;
} else {
$result = true;
}
}
return $result;
}
}
위의 php 부분에서 취약점이 발생하였는데,
파일을 업로드 할때, 파일의 확장자를 검색하는 부분에서 strpos 함수를 사용하여
검사를 하게 된다.
function webp_file_ext( $types, $file, $filename, $mimes ) {
if ( false !== strpos( $filename, '.webp' ) )
//.webp 이 파일명에 존재하는지 확인
//.webp 이 파일명에 존재만 하면 되기 때문에 이 부분에서 취약점이 발생함.
{
$types['ext'] = 'webp';
$types['type'] = 'image/webp';
}
return $types;
}
이때 strpos는 문자열이 포함 되어있는지의 여부만 판단하기 때문에,
test.webp.php 의 형태라도 .webp가 포함 되어 있기때문에 strpos는 true 값을 반환한다는 취약점이 발생한다.
처음부터 .php 확장자를 업로드를 시도하게 되면, 당연히 업로드가 막히기 때문에
webshell.php.webp 이름의 형태로 업로드를 시도해야 한다.
webshell.php.webp 파일을 업로드를 할 때, 아래와 같은 패킷이 잡히게 된다.
filename의 확장자 검사가 느슨하다는 것을 위의 취약점 분석때 알았기 때문에,
webshell.php.webp을 webshell.webp.php 로 바꾸어 패킷을 전송한다.
패킷 전송후, webshell.php.webp 이 webshell.webp.php 의 이름으로 서버에 업로드 된 것을 확인 할 수 있었고, 업로드 주소로 이동한다면 웹셸이 실행된 것을 확인 할 수 있다.
확장자 검사는 항상 꼼꼼하게 !