문제 풀이 - 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 파서 입장 : ' (HTML Entity - hex)을 보고 HTML Entity에 해당하는 문자인 싱글 쿼터 ' 로 변환함.
JS 엔진 입장 : ' 을 가지고 문법 처리
+) HTML Entity 치환 방식은 여러 개가 존재하며 현재 치환방식은 16진수(hex)로 치환한 방식입니다. 다른 HTML Entity 치환 방식을 사용해도 괜찮습니다.
HTML 파서
dddd'
JS 엔진
dddd'
p 파라미터에 HTML Entity로 '(hex)을 입력해 보고 콘솔 탭에 들어가 보면 문법 에러가 뜨며 사용자의 입력 값으로 코드에 영향을 미치고 있는 것을 볼 수가 있습니다.
(* '에서 & , # 기호는 각각 파라미터 구분자와 프래그먼트 식별자로 의미가 있는 있는 기호이기 때문에 URL 인코딩을 통해 해당 기호들을 바꿔서 입력해 줘야 합니다. 바꿔주지 않으면 '으로 인식하지 못합니다. ' -> %26%23x0027)
따라서 HTML 파서와 JS 엔진 동작 방식을 이용하여 XSS 공격을 시도할 수 있습니다.
*** 마지막에 <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) 공격에 성공했음을 확인합니다.
문제 페이지에 접속하면 a 파라미터에 입력한 값이 화면에 출력되는 것을 확인할 수 있습니다.
Burp Suite를 이용하여 a 파라미터 값에 특수문자 4개 <, ', ", >를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 특수문자 전부 별다른 필터링이 적용되지 않기 때문에 HTML과 javscript를 이용하여 스크립트를 삽입할 수 있다는 것을 의미합니다.
a 파라미터에 스크립트(페이로드)를 삽입하여 요청 데이터를 보낸 뒤 응답 결과를 확인해 보면 스크립트가 삽입된 것을 확인합니다.
스크립트가 제대로 동작하는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.
결과를 확인해 보면 삽입된 스크립트가 정상작동하여 경고 창을 성공적으로 띄우며 XSS 공격에 성공했음을 확인합니다.