일반적인 루키 실수: 대량 할당 취약점

대량 할당과 그것이 얼마나 멋진지에 대해 이야기하는 많은 기사가 있다는 것을 알고 있지만, 새로운 개발자의 경우 악의적인 공격에 우리를 열 수 있기 때문에 이것이 우리 데이터베이스에 가져올 수 있는 위험도 이해해야 합니다.

심지어 Github 2012년에 사용자가 공개 업데이트 양식을 통해 보안의 균열을 발견하고 Rails의 github에 자신의 파일을 추가하여 이를 악용했을 때 이러한 종류의 공격으로부터 안전하지 않았습니다. 어떻게 이런 일이 일어날 수 있었습니까?! 이러한 공격은 실제로 생각보다 좀 더 일반적이며, 특히 사용자 정의 가능한 입력 값과 데이터를 다소 빨리 저장해야 할 때 발생할 수 있는 프로그래밍 오류가 포함된 복잡한 애플리케이션에서 그렇습니다. 이제 이와 같은 공격으로부터 데이터베이스를 보호하는 방법에 대해 알아보겠습니다.

대량 할당 취약성이 정확히 무엇입니까? 여기에서 사용자는 우리가 의도하지 않은 조작을 위해 열리는 데이터베이스의 필드를 수정할 수 있습니다. 놀랍게도 이러한 현상은 많은 멀티플레이어 비디오 게임에서 발생합니다. 이러한 게임의 개발자는 아마도 이 특정 취약점에 대해 모르고 상태 데이터를 전달하고 이를 데이터베이스에 저장하기 때문입니다. 사용자가 필드에 입력하는 모든 것을 받아들이지 않고 단일 개체로 값을 입력합니다. 이 사례는 프런트 엔드에 고유하며 프런트 엔드를 보호하는 방법에 대해 자세히 설명하는 데 유용하지만 Ruby on Rails를 사용하여 보호 계층을 형성하는 방법에 초점을 맞추겠습니다.

사용자가 가입할 때 세션을 만들 수 있도록 백엔드를 만드는 프로그래머라고 가정해 보겠습니다. 다음과 같은 프런트 엔드에 양식을 만들었습니다.

<form onSubmit={handleForm}>
  <p>
    Enter your email address:
    <input type="text" name="user_email" value={email}>
  </p>
  <p>
    Enter a password:
    <input type="password" name="user_password" value={password}>
  </p>
  <input type="submit" value="Sign up">
</form>


백엔드에는 새 사용자가 생성될 때 해당 컨트롤러 처리가 있습니다.

def signup
  user = User.create(params[:user])
  # => User<email: "[email protected]", password: "qwerty", is_admin: false>
end


보시다시피 매개변수는 이메일, 비밀번호, 해당 사용자가 관리자인지 여부를 나타내는 부울의 세 가지 사용자 값을 사용합니다. 그러나 프런트엔드는 사용자가 이메일과 비밀번호만 입력하도록 허용하고 있습니다. 그렇다면 그들은 어떻게 우리 데이터베이스에 접근할 수 있을까요? 사용자가 is_admin 상태를 변경할 수 있는 입력이 없다고 해서 쿼리 문자열이나 요청 본문에 is_admin이 포함된 HTTP 요청을 생성할 수 있습니다. 개발자 도구에서 사용자 계정의 모든 세부 정보를 표시하는 요청 본문을 볼 수 있거나 매개변수가 올바른 키와 함께 존재한다고 추측할 수 있었을 것입니다. 어느 쪽이든 사용자는 값을 거짓에서 참으로 변경하고 관리자 수준 상태에 대한 액세스를 허용하여 다른 사용자 계정에 액세스하거나 자신의 계정에 보석, 돈, 또는 기타 참고 사항.

운 좋게도 Rails는 사용자가 생성될 때 컨트롤러의 매개변수를 보호하지 않으면 오류를 발생시키는 훌륭한 방법을 가지고 있습니다. 따라서 생성 시 허용할 매개변수를 선언하라는 메시지가 표시됩니다. 양식 내에서 고려하고 싶은 매개변수를 명시적으로 할당하고 해당 매개변수만 가져오거나 컨트롤러 내에서 생성된 비공개 메서드로 특정 매개변수를 화이트리스트에 추가하여 이를 수행합니다. 화이트리스트에 추가할 때 우리는 강력한 매개변수라는 것을 사용합니다. private 메서드를 사용하면 조금 더 많은 보호를 제공할 수 있는 해당 클래스 내에서만 해당 메서드를 사용하는 제한이 허용됩니다.

def signup
  # Explicit assignment:

   user = User.create!(
    email: params[:email],
    password: params[:password]
  )

  # or whitelisting:

  user = User.create!(
    user_params
  )

private

def user_params
        params.permit(:email, :password)
    end
end


이러한 강력한 매개변수를 생성할 때 사용자가 HTTP 요청을 보낼 때 is_admin 키를 포함하고 boolean을 true로 변경하여 침입을 시도하면 요청은 중단 없이 정상적으로 계속되지만 허용되지 않은 매개변수는 허용되지 않았기 때문에 제한됩니다. 개인 user_params 메서드에 정의되어 있습니다. 오랜만의 해커들!

자원:
ropsec

좋은 웹페이지 즐겨찾기