프로토타입 오염 공격을 방지하는 방법은 무엇입니까?

Peulototaib Oyeom Gong Gyeog Eul Bangjihaneun Bangbeob Eun Mueos Ibnikka



프로토타입 오염 공격은 JavaScript 개체가 해당 프로토타입을 처리하는 방식을 이용합니다. JavaScript에서 프로토타입은 선택한 개체의 기본 속성과 메서드를 정의하는 또 다른 개체입니다. 공격자는 객체의 속성을 조작하거나 객체를 재귀적으로 병합하는 기능을 사용하여 이러한 프로토타입에 악성 코드를 주입함으로써 프로토타입 오염을 악용합니다.

이 가이드에서는 프로토타입 오염 공격을 방지하는 방법을 설명합니다.







프로토타입 오염 공격을 방지하시겠습니까?

프로토타입 오염 공격의 근본 원인은 JavaScript 개체가 프로토타입에서 속성을 상속한다는 것입니다. 즉, 공격자가 프로토타입에 악성 코드를 삽입할 수 있으면 해당 프로토타입에서 상속된 모든 개체에 악성 코드가 상속됩니다. 이로 인해 데이터를 훔치거나, 임의 코드를 실행하거나, 다른 애플리케이션을 제어할 수 있게 됩니다.



아래 코드 조각에서는 프로토타입 오염 코드가 삽입됩니다.



const y = { ㅏ: 1 , 비: 2 } ;
const 데이터 = JSON.parse ( '{'__proto__': { '결함': 참}}' ) ;

const c = 객체.할당 ( { } , 그리고, 데이터 ) ;
콘솔.로그 ( c.결함 ) ;


위 코드 조각에 대한 설명은 다음과 같습니다.





    • 먼저 '라는 이름의 목록이 있습니다. 그리고 ”가 생성되고 키-값 쌍에 값이 저장됩니다.
    • 의 도움으로 ' -그러므로- ”, 무작위로 오염된 코드는 키-값 형식으로 구현됩니다. 키는 '로 설정되어 있습니다. 불완전한 ” 및 “의 할당된 값 진실 '.
    • 그런 다음 이 오염된 코드는 “ 그리고 ' 목록을 호출하여 ' 양수인() ” 메서드를 사용하고 결과 목록은 “라는 이름의 새 목록에 저장됩니다. '.
    • 마지막으로 “ ” 목록이 검색되고 해당 값이 콘솔에 표시됩니다. 오염이나 악성 데이터가 주입되었는지 확인합니다.

포함된 파일을 실행한 후 출력에는 악성 코드가 성공적으로 삽입되었으며 해당 값이 검색되었음을 표시합니다.



프로토타입 오염 공격을 방지하는 방법은 무엇입니까?

프로토타입 오염 공격을 방지할 수 있는 몇 가지 접근 방식이 있습니다.

안전하지 않은 재귀 병합:

프로토타입 오염 공격으로 이어질 수 있으므로 안전하지 않은 재귀 병합을 피하세요.

여기서 병합 = ( 걸립니다 , 소스 ) = > {
~을 위한 ( var 속성 ~에 소스 ) {
만약에 ( 유형 ( 걸립니다 [ 속성 ] ) === 'OBJ' && 유형 ( 소스 [ 속성 ] ) === 'OBJ' )
{
병합 ( 걸립니다 [ 속성 ] , 소스 [ 속성 ] ) ;
} 또 다른 {
걸립니다 [ 속성 ] = 소스 [ 속성 ] ;
}
}
반품 걸립니다 ;
} ;


위 코드에서:

    • 먼저, 커스텀 기능 “ 병합() '는 두 개의 배열 매개변수를 허용하는 ' 걸립니다 ' 그리고 ' 소스 '.
    • 향상된 “ ~을 위한 ” 루프는 변수를 반복하는 데 사용됩니다.” 속성 '제공된 '에 대해 소스 ” 매개변수입니다.
    • 루프 내부에서 ' 만약에 ” 문은 두 오류를 탐색하고 두 배열에 있는 요소가 동일한 데이터 유형을 갖는지 여부를 탐색합니다. 그런 다음 해당 요소는 동일한 ' 병합() ” 재귀적인 성격을 만들어내는 함수입니다.
    • 유형이 동일하지 않으면 ' 소스 ” 매개변수 배열이 “ 걸립니다 ” 매개변수입니다.
    • 마지막으로 “ 걸립니다 ” 파라메트릭 배열이 반환됩니다.

프로토타입 동결

프로토타입 오염 공격에 대한 또 다른 예방책은 실행 주기를 동결하는 것입니다. 이는 “ 객체.동결() ' 방법. 아래 스니펫에서 위에 삽입된 프로토타입 오염 코드는 동결됩니다.

const y = { ㅏ: 1 , 비: 2 } ;
const 데이터 = JSON.parse ( '{'__proto__': { '결함': 참}}' ) ;

const c = 객체.할당 ( { } , 그리고, 데이터 ) ;
콘솔.로그 ( c.결함 ) ;

콘솔.로그 ( 객체 고정 ( c.결함 ) ) ;
콘솔.로그 ( Object.isFrozen ( c.결함 ) ) ;


위 코드에 대한 설명은 다음과 같습니다.

    • 처음에는 오염된 더미 프로토타입 코드가 더미 목록에 주입될 예정입니다. 그리고 ” 위의 섹션에서 설명한 대로입니다.
    • 그러면 주입된 오염된 키 ' 불완전한 '가 '로 전달됩니다. 꼭 매달리게 하다() ” 오염된 부분을 동결시키는 방법.
    • 마지막으로 동결된 프로토타입 오염 부분을 확인합니다. “ 불완전한 '목록의 키' '가 '로 전달됩니다. 얼었다() ' 방법. 이 메서드는 “ 진실 ” 냉동의 경우 그리고 “ 거짓 ” 고정 해제된 경우:

포함된 코드를 실행한 후 출력에는 고정된 오염된 코드의 주입, 동결 및 검증이 표시됩니다.


프로토타입 오염 공격을 방지하기 위한 추가 팁

프로토타입 오염 공격을 방지할 수 있는 몇 가지 추가 팁은 다음과 같습니다.

    • '의 옵션 –disable-proto '를 사용하여 '의 작업을 비활성화하거나 종료할 수 있습니다. 프로토타입.__프로토__ ' 재산.
    • '의 도움으로 방법을 사용하지 마십시오. 원기 '.
    • 에 의해 ' 사용자 입력 삭제 ” 여기에는 악성 코드나 오염된 코드를 제거하기 위해 사용자 입력을 검증하고 필터링하는 작업이 포함됩니다.
    • 사용 ' 화이트리스트 ”는 개체에 대해 허용되는 속성 및 메서드 목록입니다. 화이트리스트의 구성원이 아닌 속성이나 메서드를 설정하거나 가져오려는 모든 시도는 차단됩니다.

이것이 Node.js의 프로토타입 오염 공격 방지에 관한 것입니다.

결론

프로토타입 오염 공격을 방지하기 위해 안전하지 않은 재귀 병합 방지, 프로토타입 동결, 화이트리스트 사용과 같은 접근 방식을 사용하여 ' __그러므로__ ” 속성을 설정하여 사용할 수 있습니다. '의 활용과 함께 –disable-proto ' 옵션을 사용하고 ' 사용을 피합니다. 객체.프로토타입 ', 그리고 ' 사용자 입력 삭제 ” 오염된 코드의 경우. 이 가이드에서는 Nodejs의 프로토타입 오염 공격 방지 방법을 설명했습니다.