[하루한줄] JOOMLA PASSWORD RESET VULNERABILITY AND A STORED XSS FOR FULL COMPROMISE

6월 7일, Joomla 취약점 두 개의 상세 내용이 공개되었습니다.

첫 번째 취약점은 임의 계정 패스워드 초기화 취약점입니다. Joomla 계정은 두 가지로 나뉘는데, 하나는 일반적인 admin 계정이고, 다른 하나는 super admin 입니다. 이 취약점으로는 admin 계정의 비밀번호를 초기화할 수 있습니다.

먼저 Joomla에 특정 계정의 패스워드 초기화를 요청하면 해당 계정 이메일로 패스워트 초기화 링크를 전송합니다.

if (!empty($_SERVER['PHP_SELF']) && !empty($_SERVER['REQUEST_URI']))
{
  // To build the entire URI we need to prepend the protocol, and the http host
  // to the URI string.
   $theURI = 'http' . $https . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

패스워드 초기화 링크를 구성할 때, Joomla의 URI.php에서 서버의 IP를 HOST 헤더에서 가져오는데, 이를 HOST header poisoning을 통해 조작할 수 있습니다. 그렇게 되면 해커는 보내는 링크를 해커의 서버로 조작한 다음 피해자에게 보내고, 피해자는 해당 링크를 클릭하게 됩니다. 그 순간 해커의 서버로 패스워드 초기화를 위한 토큰이 전송되어 해커는 해당 토큰을 이용해 패스워드를 초기화할 수 있게 됩니다.

두 번째 취약점은 stored XSS을 통한 admin to super admin 권한 상승 취약점입니다.

일반적인 상황에서 Joomla에서는 블랙리스트를 통해 업로드할 수 있는 파일 확장자들을 관리합니다. php, php5 등 스크립트를 삽입할 수 있는 대부분의 확장자들을 막아놓았는데, 여기에 .html이 빠져있어 html 파일을 업로드할 수 있습니다. 따라서 html 파일에 XSS 페이로드를 넣고 댓글이나 글에 넣고 업로드를 하고, super admin이 그것을 보게 되면 super admin 권한으로 XSS 페이로드가 실행되어 권한상승을 할 수 있습니다.