반응형

문제 링크

https://x55.is/brutelogic/lab/inside-handler.php?p=dddd

 

목표 & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다. 

 

사용도구: 개발자 도구

 

문제 풀이  -  https://x55.is/brutelogic/lab/inside-handler.php?p=dddd

  • p 파라미터에 임의의 값을 입력하고 페이지에 접속해 보면 콘솔을 확인하라고 나옵니다. 개발자 도구 콘솔 탭에 들어가면 파라미터에 입력한 값이 콘솔 탭에 출력되고 있는 것을 볼 수 있습니다. 

 

  • p 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 접속한 뒤 콘솔 탭에서 결과를 확인해 보면 싱글 쿼터, 더블 쿼터가 필터링 되어 출력이 되지 않고 있는 것을 알 수 있습니다.

 

  • 추가로 Elements 탭에서 코드를 확인해 보면 이벤트 속성인 onload가 있고 입력 값이 doSomething이라는 함수의 인자 값으로 들어가고 있는 것을 볼 수 있습니다. 

 

  • 해당 문제는 HTML 파서, JS 엔진에 작동 방식을 이용하여 해당 문제를 풀 수 있습니다. HTML 파서는 파싱 단계에서 HTML Entity를 만나게 되면 HTML Entity가 의미하는 문자로 변환하며 JS 엔진에서는 변환된 결과를 가지고 문법을 처리하게 됩니다.
HTML 파서 입장 : &#x0027 (HTML Entity - hex)을 보고 HTML Entity에 해당하는 문자인 싱글 쿼터  '  로  변환함.

JS 엔진 입장 :  '  을 가지고 문법 처리 

+) HTML Entity 치환 방식은 여러 개가 존재하며 현재 치환방식은 16진수(hex)로 치환한 방식입니다. 다른 HTML Entity 치환 방식을 사용해도 괜찮습니다.


HTML 파서

dddd&#x0027

JS 엔진 

dddd'

 

  • p 파라미터에 HTML Entity로 &#x0027(hex)을 입력해 보고 콘솔 탭에 들어가 보면 문법 에러가 뜨며 사용자의 입력 값으로 코드에 영향을 미치고 있는 것을 볼 수가 있습니다. 

(* &#x0027에서  &  ,  #  기호는 각각 파라미터 구분자와 프래그먼트 식별자로 의미가 있는 있는 기호이기 때문에 URL 인코딩을 통해 해당 기호들을 바꿔서 입력해 줘야 합니다. 바꿔주지 않으면 &#x0027으로 인식하지 못합니다. &#x0027 -> %26%23x0027)

 

  • 따라서 HTML 파서와 JS 엔진 동작 방식을 이용하여 XSS 공격을 시도할 수 있습니다.

[페이로드(입력 값)]

페이로드: dddd%26%23x0027);alert(1);// 또는 dddd%26%23x0027);alert(1);x=('


<body onload="doSomething('___입력 값___')">


<!-- 주석을 이용하여 싱글 쿼터, 닫는 괄호 처리 -->
<body onload="doSomething('dddd%26%23x0027);alert(1);// ')">

<!-- 더미 속성을 이용해서 싱글 쿼터, 닫는 괄호 처리-->
<body onload="doSomething('dddd%26%23x0027);alert(1);x=('')">

*** 마지막에 한 줄 주석 처리(//) 또는 더미 속성을 해주지 않는다면 마지막에 싱글 쿼터('), 닫는 괄호가 남기 때문에 문법 에러가 발생하여 alert 함수가 동작하지 않습니다.

 

  • 주석 처리를 이용한 페이로드를 입력합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.

 

  • 더미 속성을 이용한 페이로드를 입력합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.

 

반응형
반응형

문제 링크

https://x55.is/brutelogic/xss.php?c1=test

https://x55.is/brutelogic/xss.php?c2=test

https://x55.is/brutelogic/xss.php?c3=test

https://x55.is/brutelogic/xss.php?c4=test

https://x55.is/brutelogic/xss.php?c5=test

https://x55.is/brutelogic/xss.php?c6=test

 

목표 & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다. 

 

사용도구: Burp Suite

 

문제 풀이 - https://x55.is/brutelogic/xss.php?c1=test

  • 문제 페이지에 접속하여 c1 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c1 변수의 값으로 들어가고 있는 것을 확인합니다.

 

  • c1 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 싱글쿼터가 필터링되어 사용할 수 없음을 알 수 있습니다. 

 

  • 꺾쇠 기호가 필터링 되어 있지 않고 스크립트 내부에 접근이 가능하기 때문에 script 태그를 닫고 다시 script 태그를 삽입하여 XSS 공격을 시도할 수 있습니다. 

[페이로드(입력 값)]

페이로드: dddd</script><script>alert("1");</script><script>

페이로드 마지막에 <script>를 해줬던 이유는 기존에 있던 script 태그의 닫는 태그가 남기 때문에 정상적으로 script 태그를 닫기 위해서입니다. 

<script> // 기존 script 태그
  ~~~~
</script> // 페이로드에 입력된 script 태그

<script> // 페이로드에 입력된 script 태그
  dddd</script><script>alert('1');</script><script>
</script> // 페이로드에 입력된 script 태그


<script>  // 페이로드에 입력된 script 태그

</script>  // 기존 script 태그

*** 마지막에 <script>를 해주지 않는다면  다음과 같이 script 태그 내의 내용들이 텍스트로 화면에 출력되게 됩니다.
(alert 함수는 정상 작동합니다.)


 

  • Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.

 

(참고) 경고 창을 닫고 페이지를 확인해 보면 페이로드 마지막에 해줬던 <script> 가 있었기에 정상적으로 script 태그가 닫히면서 내용들이 텍스트로 화면에 출력되지 않고 있는 것을 볼 수 있습니다.

 

 

문제 링크 - https://x55.is/brutelogic/xss.php?c2=test

  • 문제 페이지에 접속하여 c2 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c2 변수의 값으로 들어가고 있는 것을 확인합니다.

 

  • c2 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 더블 쿼터가 필터링 되어 사용할 수 없음을 알 수 있습니다. 

 

  • 꺾쇠 기호가 필터링 되지 않고 스크립트 내부에 접근이 가능한 경우 script 태그를 닫고 다시 script 태그를 삽입하여 XSS 공격을 시도할 수 있습니다. 

[페이로드(입력 값)]

dddd</script><script>alert('1');</script><script>

페이로드 마지막에 <script>를 해줬던 이유는 기존에 있던 script 태그의 닫는 태그가 남기 때문에 정상적으로 script 태그를 닫기 위해서입니다. 

<script> // 기존 script 태그
  ~~~~
</script> // 페이로드에 입력된 script 태그

<script> // 페이로드에 입력된 script 태그
   dddd</script><script>alert('1');</script><script>
</script> // 페이로드에 입력된 script 태그


<script>  // 페이로드에 입력된 script 태그

</script>  // 기존 script 태그

*** 마지막에 <script>를 해주지 않는다면  다음과 같이 script 태그 내의 내용들이 텍스트로 화면에 출력되게 됩니다.
(alert 함수는 정상 작동합니다.)

*(참고 자료)

 

  • Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.

 

 

문제 링크 - https://x55.is/brutelogic/xss.php?c3=test

  • 문제 페이지에 접속하여 c3 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c3 변수의 값으로 들어가고 있는 것을 확인합니다.

 

  • c3 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 < 기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 따라서 HTML 태그 기능을 사용할 수 없기 때문에 앞서 두 문제처럼 스크립트 태그를 닫고 다시 스크립트 태그를 삽입하면서 XSS 공격을 할 수 없게 됩니다.

 

  • 태그 기능을 사용할 수 없지만 싱글 쿼터나 더블 쿼터는 사용을 할 수 있습니다. 변수의 값이 싱글 쿼터로 감싸져있기 때문에 문법에 맞게 싱글 쿼터를 이용하면서 한 줄 주석 처리도 가능한지 확인해 봅니다. 주석 처리가 정상적으로 작동하며 변수를 벗어나 script 태그 내부에 사용자의 입력 값 삽입이 가능하다는 것을 알 수 있습니다.(주석 처리하는 이유는 뒤에 있습니다.)

* Response를 보게 되면 주석 처리된 부분은 색깔이 약간 다른 것을 볼 수 있습니다.

 

  • 한 줄 주석 처리가 가능하고 싱글 쿼터를 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.

[페이로드(입력 값)]

페이로드: dddd';alert('1');//test

싱글 쿼터('), 세미콜론(;)을 이용하여 변수를 벗어나 script 태그 내부에 사용자의 입력 값이 삽입될 수 있습니다.

[코드 예시]
<script> // script 태그
  ~~~~

  
  var c3 = '__입력 값___';  // 페이로드 입력 전

  var c3 = 'dddd'; // 페이로드 입력 후
  alert('1');
  //test
'; 

</script>  // script 태그

*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.

 

  • Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.

 

 

문제 링크 - https://x55.is/brutelogic/xss.php?c4=test

  • 문제 페이지에 접속하여 c4 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c4 변수의 값으로 들어가고 있는 것을 확인합니다.

 

  • c4 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 < 기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 따라서 HTML 태그 기능을 사용할 수 없기 때문에 script 태그를 닫고 다시 script 태그를 삽입하면서 XSS 공격을 할 수 없게 됩니다.

 

  • 태그 기능을 사용할 수 없지만 싱글 쿼터나 더블 쿼터는 사용을 할 수 있습니다. 변수의 값이 더블 쿼터로 감싸져있기 때문에 문법에 맞게 더블 쿼터를 이용하면서 한 줄 주석 처리도 가능한지 확인해 봅니다. 결과를 보면 주석 처리가 정상적으로 작동하며 변수를 벗어나 script 태그 내부에 사용자의 입력 값 삽입이 가능하다는 것을 알 수 있습니다.(주석 처리하는 이유는 뒤에 있습니다.)

* Response를 보면 주석 처리된 부분은 색깔이 약간 다른 것을 볼 수 있습니다.

 

  • 한 줄 주석 처리가 가능하고 더블 쿼터를 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.

[페이로드(입력 값)]

페이로드: dddd";alert('1');//test

싱글 쿼터('), 세미콜론(;)을 이용하여 변수를 벗어나 script 태그 내부에 사용자의 입력 값이 삽입될 수 있습니다.

[코드 예시]
<script> // script 태그
  ~~~~

  
  var c3 = '__입력 값___';  // 페이로드 입력 전

  var c3 = 'dddd"; // 페이로드 입력 후
  alert('1');
  //test
'; 

</script>  // script 태그

*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.

 

  • Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.

 

 

문제 링크 - https://x55.is/brutelogic/xss.php?c5=test

  • 문제 페이지에 접속하여 c5 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c5 변수의 값으로 들어가고 있는 것을 확인합니다.

 

  • c4 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 < 기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 또한 싱글 쿼터 앞에  \ ( ₩ )  기호가 붙으며 escape 처리가 되고 있는 것을 알 수 있습니다.
* escape: 특수 기능을 가진 문자를 문자 그대로 사용하도록 해주는 것을 말합니다.

 

  • escape 처리해 주는 \ 기호를 삽입하고 Response를 확인합니다. Response를 확인하면 원래 변수의 값이 싱글 쿼터로 감싸지며 감싸진 내부가 문자열로 인식 되도록 해야 하는데 싱글 쿼터가 그냥 문자로 인식되면서 문법이 파괴된 것을 볼 수 있습니다.

 

  • 이번엔 escape 처리 문자를 escape 처리했을 때 Response를 확인합니다. Response를 보면 escape 문자가 escape 처리되어 그냥 문자로 인식되었고 이로 인해 싱글 쿼터가 변수의 값을 정상적으로 감싸며 문법이 파괴되지 않은 것을 볼 수 있습니다.

 

[추가 설명]

입력: dddd\
출력: var c5 = 'dddd\'; // 문자열이 싱글 쿼터로 감싸져야 하는데 escape 처리로 맨 뒤 싱글 쿼터가 그냥 문자로 인식되며 문법 파괴.

입력: dddd\\
출력: var c5 = 'dddd\\'; // escape 처리 문자를 escape 처리하면 escape 문자가 그냥 문자로 쓰였기에 맨 마지막 싱글 쿼터에는 아무                                        // 영향이 없음

 

  • 한 줄 주석 처리가 가능하고 싱글 쿼터를 escape 문자로 우회하여 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.

[페이로드(입력 값)]

페이로드: dddd\';alert("1");//

사용자가 싱글 쿼터(')를 사용하면 앞에 escape 문자인 \ ( ₩ ) 기호가 앞에 생기게 됩니다. 이로 인해 사용자가 싱글 쿼터를 사용해 변수를 벗어나며 스크립트를 삽입할 수 없게 됩니다. 하지만 사용자가 싱글 쿼터 입력전에 escape 문자를 입력하게 된다면  \\'  이 되면서 싱글 쿼터를 escape 처리하는 문자가 싱글 쿼터 전에 입력했던 escape 처리 문자로 인해 escape 처리 문자로서의 기능이 없어져 싱글 쿼터를 사용할 수 있게 됩니다.

 \  : escape 기능 수행
 \  : 그냥 \ 기호 (escape 처리되어 escape 기능을 상실함.)
 '  : 변수의 값을 감싸는 싱글 쿼터로 인식됨.

[코드 예시]
<script> // script 태그
  ~~~~

  
  var c5 = '__입력 값___';  // 페이로드 입력 전

  var c5 = 'dddd\'; // 페이로드 입력 후
  alert("1");
  //
'; 

</script>  // script 태그

*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.

 

  • Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.

 

 

문제 링크 - https://x55.is/brutelogic/xss.php?c6=test

  • 문제 페이지에 접속하여 c6 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c6 변수의 값으로 들어가고 있는 것을 확인합니다.

 

  • c6 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 < 기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 또한 더블 쿼터 앞에  \ ( ₩ )  기호가 붙으며 escape 처리가 되고 있는 것을 알 수 있습니다.

 

  • escape 처리해 주는 \ 기호를 삽입하고 Response를 확인합니다. Response를 확인하면 원래 변수의 값이 싱글 쿼터로 감싸지며 감싸진 내부가 문자열로 인식 되도록 해야 하는데 싱글 쿼터가 그냥 문자로 인식되면서 문법이 파괴된 것을 볼 수 있습니다.

 

  • 이번엔 escape 처리 문자를 escape 처리했을 때 Response를 확인합니다. Response를 보면 escape 문자가 escape 처리되어 그냥 문자로 인식되었고 이로 인해 더블 쿼터가 변수의 값을 정상적으로 감싸며 문법이 파괴되지 않은 것을 볼 수 있습니다.

 

  • 한 줄 주석 처리가 가능하고 더블 쿼터를 escape 문자를 이용해 우회하여 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.

[페이로드(입력 값)]

페이로드: dddd\";alert('1');//

사용자가 더블 쿼터(")를 사용하면 앞에 escape 문자인 \ ( ₩ ) 기호가 앞에 생기게 됩니다. 이로 인해 사용자가 더블 쿼터를 사용해 변수를 벗어나며 스크립트를 삽입할 수 없게 됩니다. 하지만 사용자가 싱글 쿼터 입력전에 escape 문자를 입력하게 된다면  \\'  이 되면서 더블 쿼터를 escape 처리하는 문자가 더블 쿼터 전에 입력했던 escape 처리 문자로 인해 escape 처리 문자로서의 기능이 없어져 더블 쿼터를 사용할 수 있게 됩니다.

 \  : escape 기능 수행
 \  : 그냥 \ 기호 (escape 처리 되어 escape 기능을 상실함.)
 "  : 변수의 값을 감싸는 더블 쿼터로 인식됨.

[코드 예시]
<script> // script 태그
  ~~~~

  
  var c5 = '__입력 값___';  // 페이로드 입력 전

  var c5 = 'dddd\"; // 페이로드 입력 후
  alert('1');
  //
'; 

</script>  // script 태그

*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.

 

  • Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.

반응형
반응형

문제 링크

https://x55.is/brutelogic/xss.php?b1=test

https://x55.is/brutelogic/xss.php?b2=test

https://x55.is/brutelogic/xss.php?b3=test

https://x55.is/brutelogic/xss.php?b4=test

 

 

목표 & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다. 

 

사용도구: Burp Suite

 

 

문제 풀이 - https://x55.is/brutelogic/xss.php?b1=test

  • 문제 페이지에 접속하여 b1 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value에 들어가고 있는 것을 확인합니다.

 

  • b1 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 특수문자 전부 별다른 필터링이 적용되지 않기 때문에 HTML과 Javascript를 이용하여 스크립트를 삽입할 수 있다는 것을 의미합니다.

 

  • 이전 응답 결과를 확인해 보면 특수문자를 이용해서 input 태그를 닫을 수 있음을 알 수 있습니다. 문법에 맞춰서 input 태그를 강제로 닫고 스크립트(페이로드)를 삽입합니다. 응답 결과를 보면 스크립트가 삽입된 것을 볼 수 있습니다.

[페이로드(입력 값)]

dddd"><script>alert('1');</script><"

* input 태그의 value 속성의 값이 더블 쿼터로 감싸져있기 때문에 이를 주의하여 input 태그를 닫고 스크립트를 삽입해야 합니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.

 

 

문제 풀이 - https://x55.is/brutelogic/xss.php?b2=test

  • 문제 페이지에 접속하여 b2 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value 속성 값에 들어가고 있는 것을 확인합니다.

 

  • b2 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 특수문자 전부 별다른 필터링이 적용되지 않기 때문에 HTML과 Javascript를 이용하여 스크립트를 삽입할 수 있다는 것을 의미합니다.

 

  • 이전 응답 결과를 확인해 보면 특수문자를 이용해서 input 태그를 닫을 수 있음을 알 수 있습니다. 문법에 맞춰서 input 태그를 강제로 닫고 스크립트(페이로드)를 삽입합니다. 응답 결과를 보면 스크립트가 삽입된 것을 볼 수 있습니다 

[페이로드(입력 값)]

dddd'><script>alert('1');</script><'

* input 태그의 value 속성의 값이 싱글 쿼터로 감싸져있기 때문에 이를 주의하여 input 태그를 닫고 스크립트를 삽입해야 합니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.

 

 

문제 풀이 - https://x55.is/brutelogic/xss.php?b3=test

  • 문제 페이지에 접속하여 b3 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value 속성 값에 들어가고 있는 것을 확인합니다.

 

  • b3 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 > 기호가 필터링 되고 있는 것을 볼 수 있으며 HTML 태그를 닫는 용도로 > 기호를 사용하지 못한다는 것을 알 수 있습니다. 

 

  • 필터링으로 인해 input 태그를 강제로 닫고 스크립트 삽입이 불가능하므로 이를 우회해야 합니다. 우회 방법은 여러 가지 있지만 해당 문제에서는 onfocus + autofocus를 이용하여 우회를 시도합니다. 

[페이로드(입력 값)]

dddd"+autofocus+onfocus=alert('1')+x="


autofocus : 페이지가 로드되면 특정 요소에 자동으로 포커스를 줍니다.
onfocus : 요소가 포커스를 얻으면 실행되는 이벤트 핸들러입니다.

정리하면 해당 페이로드가 삽입된 URL로 접속하게 된다면 autofocus로 인해 자동으로 포커스를 주고 onfocus에 의해 alert 함수가 실행됩니다. 따라서 별다른 행위를 하지 않아도 바로 스크립트가 실행됩니다.

+) x=" 을 해준 이유는 페이로드를 삽입하고 더블쿼터(")가 하나 남게 되어 문법이 맞지 않게 됩니다. 따라서 문법을 맞춰주기 위해 페이로드에 함께 삽입하여 줍니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.

 

 

문제 풀이 - https://x55.is/brutelogic/xss.php?b4=test

  • 문제 페이지에 접속하여 b4 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value 속성 값에 들어가고 있는 것을 확인합니다.

 

    • b4 파라미터 값에특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 > 기호가 필터링 되고 있는 것을 볼 수 있으며 HTML 태그를 닫는 용도로 > 기호를 사용하지 못한다는 것을 알 수 있습니다. 

 

  • 필터링으로 인해 input 태그를 강제로 닫고 스크립트 삽입이 불가능하므로 이를 우회해야 합니다. 해당 문제에서는 onfocus + autofocus를 이용하여 우회를 시도합니다. 

[페이로드(입력 값)]

dddd'+autofocus+onfocus=alert('1')+x='


autofocus : 페이지가 로드되면 특정 요소에 자동으로 포커스를 줍니다.
onfocus : 요소가 포커스를 얻으면 실행되는 이벤트 핸들러입니다.

정리하면 해당 페이로드가 삽입된 URL로 접속하게 된다면 autofocus로 인해 자동으로 포커스를 주고 onfocus에 의해 alert 함수가 실행됩니다. 따라서 별다른 행위를 하지 않아도 바로 스크립트가 실행됩니다.

+) x=' 을 해준 이유는 페이로드를 삽입하고 싱글쿼터(')가 하나 남게 되어 문법이 맞지 않게 됩니다. 따라서 문법을 맞춰주기 위해 페이로드에 함께 삽입하여 줍니다.

 

  • 삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.

반응형
반응형

문제 링크

https://x55.is/brutelogic/xss.php?a=test 

 

목표 & 사용 도구

목표: alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다. 

 

사용도구: Burp Suite

 

문제 풀이 - https://x55.is/brutelogic/xss.php?a=test 

  • 문제 페이지에 접속하면 a 파라미터에 입력한 값이 화면에 출력되는 것을 확인할 수 있습니다. 

 

  • Burp Suite를 이용하여 a 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 특수문자 전부 별다른 필터링이 적용되지 않기 때문에 HTML과 javscript를 이용하여 스크립트를 삽입할 수 있다는 것을 의미합니다.

 

  • a 파라미터에 스크립트(페이로드)를 삽입하여 요청 데이터를 보낸 뒤 응답 결과를 확인해 보면 스크립트가 삽입된 것을 확인합니다.

 

  • 스크립트가 제대로 동작하는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.

 

  • 결과를 확인해 보면 삽입된 스크립트가 정상작동하여 경고 창을 성공적으로 띄우며 XSS 공격에 성공했음을 확인합니다.

 

반응형
반응형

파일 다운로드(File Download) 취약점이란?

서버에서 임의의 파일을 다운로드 할 수 있는 취약점을 File Download 라고 합니다.

 

파일 다운로드(File Download) 취약점이 발생할 수 있는 곳

파일 다운로드가 가능한 곳

 

실습 - 파일 다운로드(File Download) 취약점 알아보기

  • 실습을 통해서 파일 다운로드(File Download) 취약점이 무엇인지 알아보겠습니다. 우선 사용자들이 글쓰기와 파일 업로드를 할 수 있는 게시판이 있다고 가정합니다. 

글 작성 및 파일 업로드를 할 수 있는 게시판 페이지

 

  • 해당 게시판에서 이미지 파일을 하나 업로드 합니다. 

이미지 파일 업로드

 

  • 이미지 파일을 업로드한 뒤 해당 게시판에 접속하면 파일 다운로드 버튼이 있는 것을 알 수 있으며 마우스 우클릭을 클릭하여 링크 주소 복사를 해줍니다.

다운로드 버튼 우클릭 했을 때

 

  • 복사한 링크 주소를 확인해 보면 file_down 파라미터 값이 업로드했던 파일 이름인 것을 알 수 있고 해당 링크 주소를 URL 입력 창에 붙여넣기 하여 접근하면 파일 이름에 해당하는 파일이 다운로드 되는 것을 볼 수 있습니다.
http://localhost/file.php?file_down=%ED%8C%8C%EC%9D%BC+%EC%97%85%EB%A1%9C%EB%93%9C%EC%9A%A9+%EC%82%AC%EC%A7%84.png

 

파일 다운로드 버튼 눌렀을 때

 

  • 다시 복사했던 링크 주소를 가져와서 이번엔 file_down 파라미터 값에 기존 파일 이름이 아닌 ../index.php를 입력하면 원래라면 다운로드할 수 없는 index.php 파일을 다운로드할 수 있는 것을 알 수 있습니다.

[링크 주소 변경 전]

http://localhost/file.php?file_down=%ED%8C%8C%EC%9D%BC+%EC%97%85%EB%A1%9C%EB%93%9C%EC%9A%A9+%EC%82%AC%EC%A7%84.png

 

[링크 주소 변경 후]

http://localhost/file.php?file_down=../index.php

임의 파일 다운로드

 

  • 다운로드한 index.php 파일을 메모장으로 열어보면 실제로 index.php 파일 소스코드가 다운로드 된 것을 알 수 있으며 index.php 파일의 모든 소스코드가 노출되고 있는 것을 확인할 수 있습니다.

index.php 소스코드

 

  • 원래라면 해당 게시글 작성자가 업로드한 파일만 다운로드할 수 있어야 하는데 다른 경로에 있는 파일인 index.php 파일을 다운로드할 수 있었습니다. 이런 식으로 파일 다운로드를 이용하여 임의의 파일을 다운로드할 수 있는 취약점을 파일 다운로드 취약점이라고 합니다.

 

파일 다운로드(File Download) 공격 설명

  • 유닉스 계열 운영체제의 경우 디렉토리 경로 구분을 다음과 같이 합니다.
구분 유닉스 계열
최상위 디렉토리  /
디렉토리 구분 /
현재 디렉토리 이동 ./
상위 디렉토리 이동 ../

 

  • ex) http://localhost/test/filedownload/../hi.php → http://localhost/test/hi.php

 

  • 실습 과정 중 file_down 파라미터 값에 ../index.php 를 입력하여 index.php 파일을 다운로드할 수 있는 과정이 있었습니다. 이때 사용된 ../ 표현식이 상위 디렉토리로 이동이라는 의미를 가지고 있습니다. 즉, ../index.php 는 상위디렉토리에 있는 index.php 파일을 의미합니다.
http://localhost/file.php?file_down=../index.php <!--상위 디릭토리에 있는 index.php 파일-->

 

  • 파일 다운로드를 처리하는 file.php 파일의 소스코드를 보겠습니다.
<?php
    if (isset($_GET['file_down'])) {
        $file = $_GET['file_down']; // [취약한 부분] 파일명을 필터링 없이 그대로 사용 중
        $filePath = "data/" . $file;

        if (file_exists($filePath)) {
            header("Content-Disposition: attachment; filename=" . basename($file));
            header("Content-Type: application/octet-stream");
            readfile($filePath);
            exit;
        } else {
            echo "File not found.";
        }
    }
?>

 

  • file.php 소스코드를 확인해 보면 파일 다운로드는 data 디렉토리 내부에 있는 파일들을 다운로드 하고 있음을 알 수 있습니다. 즉 다운로드할 파일의 이름이 TEST.png 이면 다운로드할 파일이 있는 경로는 다음과 같습니다.

[파일명 입력]

http://localhost/file.php?file_down=TEST.png

 

[다운로드 받을 파일이 있는 경로]

http://localhost/data/TEST.png

 

  • file_down 파리미터 값에 ../index.php 를 입력하게 되면 다운로드 받을 파일이 있는 경로는 다음과 같이 됩니다.

[파일명 입력]

http://localhost/file.php?file_down=../index.php

 

[다운로드 받을 파일이 있는 경로]

http://localhost/data/../index.php

 

[최종 경로]

http://localhost/index.php

 

  • 위 최종 경로를 보게되면 결국 index.php 파일을 다운로드 받을 수 있다는 것을 알 수 있습니다.

[*참고]

(조금 헷갈릴 수 있지만 실제 서버의 웹 루트(web root) 경로는 /var/www/html/public/ 입니다. 바로 위에서 설명한 경로는 설명을 위한 예시이니 상위 디렉토리로 이동을 의미하는 ../ 을 이용해서 다른 경로에 있는 파일을 가져올 수 있구나 정도로 이해 해 주시면 될 것 같습니다.)

 

 

마무리

실습을 통해서 파일 다운로드(File Download) 취약점을 알아봤는데 해당 글은 파일 다운로드 취약점이 어떤 것인지 간단하게 알아보는 글입니다. 다른 글에서 파일 다운로드 취약점을 조금 더 깊이 다뤄보고 대응 방안도 함께 알아보겠습니다.

반응형
반응형

| File Upload 취약점

공격자가 원하는 임의의 파일을 업로드할 수 있는 취약점
ex) 서버에서 실행시킬 수 있는 스크립트 파일

 

| File Upload 취약점이 발생할 수 있는 곳

파일 업로드를 할 수 있는 곳.

ex) 프로필 사진, 게시판, 서류 제출

 

취약점 발생 원인: 파일을 업로드 받을 때 별다른 검증, 검사를 하지 않기 때문에 발생 합니다.

 

| 공격 시나리오

  • 서버 측 실행 파일
    • 서버에서 사용하는 언어를 알아낸 뒤, 해당 언어로 우리가 원하는 코드를 실행할 수 있도록 할 수 있습니다.
  • Phising
    • HTML 파일을 올림으로써 피싱 공격을 유도할 수 있습니다.
  • Deface
    • 웹 사이트를 무단으로 변경하거나 변조하는 공격을 말합니다. 보안뉴스(링크참고) 에 따르면 화면을 마음대로 바꾸고 해킹에 성공했음을 알리는데 사용되는 공격을 말합니다.  
  • XSS
    • 파일에 대한 검사를 하지 않아서 파일 업로드 취약점이 있을 때, 악성 스크립트 파일을 올릴 수 있게 되며 올린 파일의 경로로 접속하면 해당 스크립트가 실행됩니다.
  • Dos (Denial of Service) - 서비스 거부 공격
    • 파일 업로드로 서버에 매우 큰 파일을 올림으로써 서버가 재기능을 하지 못하도록 합니다.

❓ Web Shell 공격

파일 업로드 공격 중에 서버 측 실행 코드에 해당하는 Web Shell 공격에 대해서 설명하겠습니다.

 

Web Shell 공격은 간단하게 말해서 사용자가 웹서버에서 동작하는 스크립트를 이용하여 서버에 접근한 뒤, 불법적인 행위를 하는 공격을 말합니다. 이러한 Web Shell 공격은 웹 서버가 사용하고 있는 언어(php, jsp, asp 등등)가 사용된 스크립트 파일을 업로드 함으로써 서버에게 명령하게 됩니다. 서버에게 명령할 수 있기 때문에 악의적인 사용자들은 이를 악용하여 불법적인 행위를 저지를 수 있습니다.

 

  • Web Shell 공격의 핵심
    1. 웹 서버 측 실행 코드를 업로드 합니다.
    2. 업로드된 파일의 경로를 알아야 합니다.

Web Shell 공격은 웹 서버 측 실행 코드를 이용하여 서버에 접근할 수 있습니다. 파일 업로드를 통해 Web Shell 파일을 업로드하면 해당 경로를 알아야 하는데 경로를 알아야 Web Shell 을 실행할 수 있기 때문입니다.

 

| File Upload 취약점(실습)

간단한 실습을 통해 File Upload(파일 업로드) 취약점이 무엇인지에 대해서 알아보겠습니다. 우선 게시판에 글을 쓸 수 있는 웹사이트가 있고 파일 업로드 기능이 있다고 가정합니다. 이때 웹 쉘(WebShell)파일을 업로드합니다. (웹 쉘 파일 내용은 게시판 사진 아래를 참고해 주세요.)

 

파일 업로드 기능이 있는 게시판

 

[🧐webshell.php 안에 내용]

// webshell.php
<?php 
	echo system($_GET['cmd']);
?>

 

webshell.php 코드를 보면 정말 간단한 웹 쉘 코드입니다. 해석을 해보면 php 내장 함수인 system 함수가 cmd 파라미터에 들어온 값을 서버의 명령어로 실행하게 됩니다. ex) webshell.php?cmd=___내용부분___ 내용부분에 입력된 값들이 서버의 운영체제 명령어로 실행된다는 의미입니다. 이를 이해하고 이제 파일을 업로드 해보겠습니다.

 

파일 업로드한 뒤 게시글에 접속했을 때

 

파일 업로드를 한 뒤의 해당 게시글에 접속해 보면 위와 같이 나오는 것을 볼 수 있습니다. 웹 쉘 공격에 핵심 중 하나는 '웹쉘 코드가 업로드된 경로를 알아야 한다'라고 했었습니다. 따라서 업로드 한 파일이 어디에 있는지를 찾아야 합니다. 찾는 방법은 파일 다운로드 또는 파일을 다운로드 할 수 있는 그런 버튼이 있다면 마우스 우클릭을 하여 링크 주소 복사를 해줍니다.

 

파일을 다운받을 수 있는 버튼에 우클릭 했을 때

 

이제 복사한 주소를 주소창에 입력해서 접속을 해보면 다음과 같이 에러가 나오는데 이는 파라미터값이 전달되지 않았기 때문입니다.

파일 경로를 복사하여 주소창에 입력했을 때

 

아까 봤던 webshell 코드 내용을 보면 파라미터 이름은 cmd 였습니다. 이제 파라미터 값으로 사용자의 현재 경로를 알려주는 명령어인 pwd를 입력하여 서버에서 명령어가 실행되는지 확인해봅니다.

 

파리미터 값으로 현재 경로를 출력해주는 명령어를 입력했을 때

 

위 사진을 보면 사용자가 파라미터에 값(명령어)을 줬을 때 해당 명령어가 실행되어 화면에 출력되는 것을 볼 수 있습니다.

 

[🧐FileUpload 기능 구현 코드]

if (isset($_FILES['file']) && $_FILES['file']['error'] === 0) {
            $file = $_FILES['file'];
            $fileName = basename($file['name']);
            $fileTmpName = $file['tmp_name'];
            $fileSize = $file['size'];
}

 

위 코드는 실습 사이트에서 사용했던 파일 업로드 기능을 처리하는 코드입니다. 실습에서 .php 파일을 업로드 할 수 있었던 이유는 파일 확장자를 검사하는 로직이 없었기 때문입니다. 따라서 웹쉘 파일을 이용하여 악용하는 것을 방지하기 위해서는 파일 확장자를 검사하는 로직을 추가해야 합니다.


 

실습을 통해 파일 업로드 취약점에 대해서 알아봤는데 파일 업로드 취약점도 여러 우회 기법이 존재합니다. 다른 글에서 우회 기법들을 알아보면서 어떻게 대응할 수 있는지도 함께 알아보겠습니다.

반응형
반응형

| CSRF

요청을 위조하여 서버로부터 해당 요청을 하게 만드는 공격.

 

| CSRF가 발생할 수 있는 곳

모든 요청에서 CSRF는 발생할 수 있습니다.

 

💡 CSRF vs XSS 

CSRF XSS
서버측 공격 클라이언트측 공격
스크립트 삽입하지 않아도 실행됨. 스크립트를 삽입하여 하는 공격

 

+) CSRF, XSS는 서로 다른 종류의 공격이지만 CSRF를 XSS와 연계했을때 시너지가 좋습니다.


▶️ 공격방식(요청 위조시)

CSRF는 요청을 위조하여 서버 측에서 실행시키도록 하는 공격입니다. 이때 GET Method, POST Method 2가지 방법으로 CSRF 공격을 수행할 수 있습니다. 실습을 해보면서 GET Method, POST Method 각각에서 어떻게 CSRF 공격이 수행되는지 살펴보겠습니다.

 

🔓 CSRF - GET Method 찾아보기

어떤 웹사이트에서 정말 간단한 비밀번호 변경 페이지가 있다고 가정합니다.

비밀번호 변경페이지

 

이때 새로운 비밀번호를 입력해 주고 비밀번호 변경을 했을 때 요청, 응답 데이터를 취득하여 확인합니다.

비밀번호 변경 시 요청 및 응답 데이터(1)
비밀번호 변경 시 요청 및 응답 데이터(2)

 

요청 데이터 부분을 확인해 보면 데이터 전송 방식이 POST Method인 것을 알 수 있으며 파라미터 정보들 또한 알 수 있습니다. 이제 해당 요청을 보낼 때 POST Method가 아닌 GET Method 방식으로 데이터를 전송하여 GET Method 방식으로도 비밀번호 변경이 가능한지 확인합니다. (이전 비밀번호: 1234, 변경할 비밀번호: 123)

GET Method로 비밀번호 변경을 시도 했을 때 요청 및 응답 데이터

 

바로 위 사진과 같이 GET Method 형태로 바꾼 뒤 해당 요청을 전송을 합니다. 변경된 비밀번호로 로그인을 해보면 성공적으로 비밀번호가 바뀐 것을 알 수 있습니다.

GET Method로 변경된 비밀번호 입력

 

GET Method를 통해 비밀번호 변경을 요청할 때 URL 링크를 확인하면 다음과 같습니다. 

/update_info.php?new_password=123

 

저는 localhost 환경에서 테스트하고 있기 때문에 전체 주소는 다음과 같습니다.

http://localhost/update_info.php?new_password=123

 

[중요]

만약 여기서 해당 웹사이트를 이용하고 있는 어떤 사용자가 바로 위 주소로 접속하게 된다면? => 비밀번호가 123으로 바뀌게 됩니다. 

 

로그아웃을 한 뒤 다른 계정으로 접속하고 해당 링크를 클릭하여 정말 비밀번호가 변경되는지 확인해 보겠습니다. 현재 접속한 계정 정보는 다음과 같습니다. (사용자 아이디: sudo, 비밀번호: 1234)

 

이 상태에서 사용자가 비밀번호를 변경하는 URL 링크 주소에 접속해 보겠습니다. 페이로드는 다음과 같습니다.

http://localhost/update_info.php?new_password=change

비밀번호 변경 URL 링크 입력

 

위와 같이 주소를 입력하고 접근 해보면 다음과 같이 패스워드가 변경되는 것을 알 수 있습니다.

링크에 접속했더니 비밀번호가 변경됨.

 

정말로 비번이 바뀌었는지 확인하기 위해서 기존 비밀번호인 1234를 입력하고 로그인을 시도하면 다음과 같이 로그인에 실패하는 것을 볼 수 있습니다.

원래 비밀번호로 로그인 시도

 

이번엔 바뀐 비밀번호인 change를 입력하고 로그인을 시도해 보면 정말로 비밀번호가 바뀐 것을 알 수 있습니다.

바뀐 비밀번호로 로그인 시도

 

웹사이트 사용자가 누군가가 보낸 URL 링크에 접속했을 때 위 과정처럼 비밀번호를 변경하는 주소였다면 사용자는 링크에 접속하는 것만으로도 비밀번호가 변경되게 됩니다. 이처럼 사용자의 요청을 위조하여 자신의 의지와 무관하게 공격자가 의도한 행위를 하도록 하는 것이 CSRF 공격입니다.

 

지금까지 실습 과정을 통해 GET Method를 통한 CSRF 공격을 살펴봤습니다. 만약 GET Method를 사용할 수 없다면 다른 방법을 사용해야 하는데 그 방법은 다른 글에서 찾아뵙도록 하겠습니다.

반응형
반응형

| XSS

임의의 스크립트를 삽입하여 이용자의 브라우저에서 실행시키는 공격. (클라이언트 측)

*** XSS는 웹 브라우저에서 실행되는 코드에 의해 발생하기 때문에 클라이언트 측 공격입니다.

 

| XSS - 종류

  • Stored XSS
  • Reflected XSS
  • DOM-based XSS

| XSS 취약점이 발생하는 곳.

❗데이터가 저장되고, 출력되는 곳

ex) 게시판 글 작성, 회원가입 등등

 

즉, 정리하면 사용자가 작성한 데이터가 화면에 응답이 되고 있다면 XSS 취약점을 확인해 봐야 합니다. 이번 글에선 XSS 종류 중 Stored XSS에 해당하는 내용들을 알아가 보면서 XSS가 무엇인지 알아보겠습니다. 


▶️Stored XSS 

서버에 스크립트를 저장한 뒤, 스크립트가 포함된 페이지 요청 시 실행되는 공격

 

🔓Stored XSS 찾아보기

  1. 작성한 데이터가 화면에 응답 되는지 확인.
  2. 특수문자 체크
  3. Javascript

 

Stored XSS를 찾는 방법을 순서대로 정리했습니다. 해당 과정을 통해 XSS 취약점을 찾을 수 있는데 간단한 실습을 통해 
Stored XSS 취약점을 어떻게 찾고 무엇인지에 대해서 알아보겠습니다.

 

1️⃣ 작성한 데이터가 화면에 응답 되는지 확인.

현재 어떤 웹 사이트에서 글을 작성할 수 있는 기능이 있는 상황입니다.

게시판에서 사용자가 글을 작성하는 과정

 

게시판에서 글을 작성할 때 위와 같이 글을 작성하게 될 텐데  이제 글을 생성하고 해당 게시물에 접속을 하여 사용자가 입력한 데이터가 화면에 출력되는지 확인합니다. 

 

 

글 생성되었을 때
생성된 게시물에 접속했을 때

 

사용자가 작성한 게시물에 접속을 해보면 입력했던 데이터가 화면에 출력되고 있는 것을 볼 수 있습니다. 이런 경우에 이제 XSS 취약점을 확인해 봐야 합니다. 1번 단계를 끝냈으니 2번 단계로 넘어가겠습니다.

 

2️⃣ 특수문자 체크

2번 과정에서는 특수문자 4개 <, ', ", >를 삽입하여 해당 특수문자가 어떠한 필터링이 없이 그대로 사용되고 있는지 확인을 하게 됩니다. 각 특수문자들은 HTML 태그 기능을 수행할 수 있도록 해주는 특수문자이며 스크립트 삽입할 때 HTML 태그 기능을 사용해야 하기 때문에 먼저 체크를 하는 것입니다.

게시글 생성 시 특수문자 4개 삽입

 

특수 문자를 삽입한 글을 생성한 후에 게시물에 접속을 해보면 다음과 같습니다.

특수문자 삽입한 게시물에 접속했을 때

 

특수문자가 화면에 출력되고 있지만 이 과정에서는 소스코드를 확인하여 어떠한 필터링이 작용되고 있는지 아닌지 확인을 해야 합니다. (저는 Burp Suite를 사용해서 확인했습니다.)

 

특수문자 삽입한 게시물에 접속했을 때 응답 데이터

 

빨간색 박스 부분을 보면 특수문자 <, ', ", >가 그대로 사용되고 있는 것을 알 수 있습니다. 앞서 말한 것처럼 해당 특수문자들을 가지고 HTML 태그 기능을 수행할 수 있다고 말했었습니다. 이렇게 2번 과정은 특수문자가 그대로 사용되고 있는지를 체크하게 됩니다. 

 

🔎 비교를 위해 만약 어떠한 필터링이 작용해서 특수문자를 사용할 수 없는 상황도 확인해 보겠습니다.

 

특수문자 <, ', ", >이 어떠한 필터링으로 인해 다른 기호들로 바뀐 상황

 

바로 위 사진을 특수 문자들이 HTML Entity로 치환이 된 상황입니다. HTML Entity는 XSS 대응 방안 중 하나입니다. 해당 사진은 삽입했던 특수문자가 어떠한 대응 방안 때문에 다른 문자들로 치환이 되었고 이로 인해 태그 기능을 사용할 수 없단 것을 보여드리기 위해서입니다. 바로 아래 표는 각 특수기호가 어떠한 HTML Entity로 치환되었는지 간단하게 적었습니다.

💡참고

< &lt;
> &gt;
' &#039; or &apos;
" &quot;

 

이제 다시 돌아가서, 특수문자 <, ', ", >이 그대로 사용되었을 때 이어서 3번 과정을 진행합니다.

 

3️⃣ Javascript

특수문자가 그대로 사용되고 있다는 것은 HTML 코드를 삽입할 수 있다는 것을 의미합니다. 따라서 이때 스크립트를 삽입합니다. 여기서 주의해야 할 점은 POC 코드를 사용해야 한다는 것입니다.

POC 코드를 사용하는 이유는 해당 취약점을 통해 문제가 발생할 수 있다는 것을 보여주기 위함입니다. 간단하게 말하면 일부러 악의적인 스크립트를 사용해서 확인을 하면 안 되기 때문에 POC 코드를 사용하게 됩니다. (POC 코드는 모의해킹을 할 때 취약점을 이용해서 공격이 가능하다는 것을 보여주는 코드입니다.)

 

다음과 같이 스크립트를 삽입합니다. 

<script>alert(1)</script> // 해당 스크립트는 알림창을 띄웁니다.

 

게시글 작성 시 스크립트를 삽입했을 때

 

이처럼 스크립트를 삽입하여 글을 생성하고 해당 페이지에 접속해 보겠습니다. 

 

스크립트가 삽입된 페이지에 접속했을 때

 

스크립트가 삽입된 페이지에 접속했더니 삽입했던 스크립트가 실행되는 것을 볼 수 있습니다. 스크립트 삽입이 가능했고 실행까지 정상적으로 이뤄졌기 때문에 XSS 취약점이 존재한다고 판단할 수 있으며 해당 XSS는 저장되어 있던 스크립트가 실행된 케이스이므로 Stored XSS에 해당합니다.


지금까지 XSS 종류 중 Stored XSS에 대해서 알아봤습니다. 다른 글에서 Reflected XSS, DOM-based XSS에 대해서도 알아보고 대응 방안에 대해서도 설명하겠습니다.

반응형

+ Recent posts