본문 바로가기
워게임/bWAPP(bee-box)

HTML Injection(인젝션) - Reflected(반사) GET

by B T Y 2019. 7. 13.
반응형

HTML Injection(인젝션) - Reflected(반사) GET

 

 

- Injection(인젝션)이란?


공격자가 악의적인 목적으로 조작된 데이터를 주입시켜 웹 어플리케이션에서 정상적인 데이터 일부로 인식하고 실행하게 되면서 발생하는 취약점이다. 인젝션에 종류로는 SQL, HTML, OS command, LDAP 인젝션 등이 있다.


인젝션 예시 그림(SQL injection)



1)HTML injection


반사(Reflected) - GET

 


Level - low


HTML injection - Reflected(GET) 페이지는 사용자가 입력한 값을 검증하지 않고 그대로 출력한다. 입력값을 검증하지 않는다는걸 알아보기 위해서는 html 태그를 포함한 데이터를 GET 방식으로 웹 어플리케이션 변수에 넣어서 보내보면 알 수 있다.

 

입력값을 검증하지 않기 때문에 HTML 태그를 입력 받으면 웹 브라우저는 HTML 태그로 해석을 해서 웹 브라우저로 결과를 돌려주기 때문에 HTML 태그를 이용 한 악의적인 공격이 가능하다.



- GET 방식 HTML Injection Code


http://172.30.1.21/bWAPP/htmli_get.php?firstname=%3Cimg+src%3Dhttp%3A%2F%2F172.30.1.21%2FbWAPP%2Fimages%2Fbee_1.png%3E&lastname=%3Ch1%3Ehello%3C%2Fh1%3E&form=submit

 


* Reflected 방식에서 공격자는 해당 코드를 링크 형식으로 만들어서 사용자에게 클릭을 하게하는 등의 사용자를 유도하는 시나리오를 계획하고 실행 할 것이다.

 

 

 



Level - medium


medium 난이도에서는 HTML 태그를 입력 값으로 주게 되면 HTML 태그로 해석하지 않고 웹 브라우저에서 문자열로 결과를 준다. 이는 submit 버튼을 눌러서 데이터를 전송할 때 HTML 태그에 대한 필터링이 진행되고 있다고 판단 된다.
해당 페이지 소스를 분석해보면 submit 버튼을 눌렀을때 low 난이도와 똑같이 /bWAPP/htmli_get.php로 action이 일어나는걸 보면 난이도마다 지정해둔 security_level에 value 값에 따라서 입력 값 검증에 대한 차이가 이루어지는 것으로 생각된다.

 


* 만약 security_level의 value 값에 따라 난이도 상, 중, 하가 아닌 어느 홈페이지에 일반회원, 우수회원, 관리자에 따른 등급을 구분하는 값이라고 가정할때, 공격자가 버프 스위트와 같은 프록시 프로그램을 이용해서 웹 페이지로 전송되는 세션을 잡아서 security_level에 대한 value 값을 일반회원이 아닌 관리자에 대한 값으로 변경 시켜 해당 권한을 사용 할 수 있다고 가정해 볼 수 있다. 실제로 이정도까지 보안에 허술한 홈페이지가 있을지는 모르겠지만 이러한 가정을 통해서 생각해보면 웹 보안을 할때 간단한 페이지 소스 분석이지만 쉽게 지나치지 말아야 한다는 걸 알 수 있다.

 

HTML 태그가 필터링 되어 문자열로 출력되기 때문에 php 코드에서 '<', '>'와 같은 HTML 태그 시작과 끝 문자가 필터링 된다고 생각된다. 이런 경우에는 문자를 URL 인코딩하여 입력해준다. ASCII 코드의 HEX 값을 이용해서 앞쪽에 % 붙여서 URL 인코딩 결과인 '<'(%3C)와 '>'(%3E)를 사용해서 HTML 태그를 포함한 코드를 작성한다.


- URL 인코딩 예시


<h1>Hello</h1>

==

%3Ch1%3EHello%3C%2Fh1%3E

<img src=http://192.168.219.119/bWAPP/images/bee 1.png>

==

%3Cimg src=http://192.168.219.119/bWAPP/images/bee_1.png%3E



- URL 인코딩을 이용한 HTML injection code


http://192.168.219.119/bWAPP/htmli_get.php?firstname=%253Ch1%253EHello%253C%2Fh1%253E&lastname=%253Cimg+src%3Dhttp%3A
%2F%2F192.168.219.119%2FbWAPP%2Fimages%2Fbee_1.png%253E&form=submit


해당 코드를 작성해서 보내게 되면 PHP 코드가 있는 back-end 구간에서는 %3C와 %3E라는 문자로 검사되어 필터링에 걸리지 않게 되고 웹 브라우저에서 다시 해석되어 결과가 출력 될 때는 %3C와 %3E가 URL 디코딩 되서 '<', '>' 문자로 변환하여 HTML 태그의 시작과 끝 문자로 웹 브라우저가 해석하게 된다.



* URL Encoding에 대해서 알아보려면 wikipedia

(https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%84%BC%ED%8A%B8_%EC%9D%B8%EC%BD%94%EB%94%A9)를 참고하면 된다.

 

 



실제로 /var/www/bWAPP/htmli_get.php 파일 안에 코드를 확인해 보면 다음과 같다.

 

 

 

 

 


- xss_check_1() 함수에 대한 정리

 

str_replace() 함수를 이용해서 해당 문자열 안에 "<", ">" 문자가 있다면 HTML Entities(&lt, &gt)로 변환하고 있다. 그리고나서 urldecode() 함수를 이용해서 URL 인코딩 문자를 디코딩해서 다시 변수에 저장해서 해당 값을 반환함으로써 URL 인코딩을 이용한 HTML injection 공격을 막고 있다. 다만, 여기서는 urldecode() 함수가 한번 사용 되었기 때문에 위에 완성된 공격 코드와 같이 더블 인코딩을 이용하면 공격이 가능해진다.

( 위 완성된 코드에서는 %253C와 같이 데이터를 보내주게 되면 urldecode()에서 디코딩 된다고 해도 %25는 %이기 때문에 %3C와 같은 결과가 변수에 저장되어 웹 브라우저에서 해석 될 때는 '<' 문자로 출력 된다. )

 

 


Level - high

 


medium 난이도에서 사용했던 URL 인코딩 코드를 그대로 사용하면 이번에는 URL 인코딩도 문자열 그대로 해석해서 출력된다.

여기서는 입력 값을 입력해서 전송버튼을 누르면 back-end 구간에서 htmlspecialchars 함수가 사용되어 있어서 입력값에 &, <, >, ", ' 문자가 포함되어 있다면 HTML Entities 문자로 변환한다.
(결과가 출력된 페이지에 '소스 코드 보기'를 이용해서 결과 부분을 보면 HTML Entities 문자로 변환이 된걸 볼 수 있다)


그렇기 때문에 브라우저에서 결과가 출력될 때는 HTML 태그가 아닌 HTML Entities 문자로 해석되어 해당 문자 그대로 출력이 된다.

HTML injection reflected GET 공격을 막는 방법 중에 htmlspecialchars 함수를 사용해서 HTML 태그에 사용되는 문자들을 웹 브라우저가  HTML 태그로 인식하지 못하게 막을 수 있다.


htmlspecialchars 함수 참조 페이지: https://www.php.net/manual/en/function.htmlspecialchars.php

 

PHP: htmlspecialchars - Manual

if your goal is just to protect your page from Cross Site Scripting (XSS) attack, or just to show HTML tags on a web page (showing on the page, for example), then using htmlspecialchars() is good enough and better than using htmlentities().  A minor point

www.php.net

 

 

 

 

반응형

댓글