본문 바로가기

bWAPP

[비박스] HTML Injection - Reflected (GET)

HTML 인젝션, SQL 인젝션, XSS(Cross Site Scripting)과 같은 공격에는

반사(reflected)기법 저장(stored)기법이 존재한다.

 

·반사(reflected)기법

악의적인 코드가 삽입된 URL이나 링크를 사용자가 쉽게 확인할 수 없도록 변형 시킨 이메일이나 다른 웹사이트등을 통해 URL클릭을 유도하는 방법을 말한다. 만약 사용자가 이 URL이나 링크를 클릭하게 되면 악의적인 코드가 실행되게 된다. 저장(stored)기법과 달리 악의적인 코드가 데이터베이스에 저장되지 않아 일회성 공격을 위해 사용되는 방법이다.

 

·저장(stored)기법

게시판 또는 서버에 글을 작성하여 다른 사용자가 열람했을 때 코드가 실행되게 하는 방법을 말한다. 반사(reflected)기법과 달리 악의적인 코드를 데이터베이스에 저장하기 때문에 많은 사용자를 대상으로 공격이 가능해 다회성 공격을 위해 사용되는 방법이다.


↓Low level

 

 

입력칸에 값을 입력하면 아래에 입력한 값이 출력된다.

 

GET메소드를 사용하였기 때문에 URL에 전달되는 값이 그대로 노출되는것도 확인할 수 있다.

 

입력칸에 HTML 태그와 자바 스크립트 태그를 삽입한 결과이다.


↓Medium level

 

방금과 같이 입력칸에 HTML 태그와 자바 스크립트 태그를 삽입한 결과이다.

조금전과 달리 태그가 먹히지 않는다.

 

<functions_external.php>

이유를 살펴보자.

 

먼저 특수문자나 한글 등과 같은 문자는 문자를 올바르게 전송하기 위해 URL 인코딩 과정을 거친다. 그  후URL 디코딩 과정이 일어나며 원래의 값으로 변환된다.

<,>문자를 입력하고 Go버튼을 누르면 URL인코딩 되어 서버로 전송된다.

이때 인코딩된값은 다음과 같다.

< => %3c , > => %3e

<인코딩되는 것을 확인할 수 있다.>

서버로 전송된 데이터는 다시 URL디코딩 과정이 발생하여 원래의 값인 <,>문자로 변환된다.

그런데 코드를 보니 str_replace() 함수가 보인다. 따라서 서버에서 디코딩된 <,>문자는 HTML엔티티인

&lt;, &gt;로 치환된다.

 

HTML엔티티란 HTML에는 예약어가 존재하는데 우리가 코딩하는 과정에서 예약어와 충돌하거나 혼용되는 경우가 발생할 수 있다. (예를 들어 HTML 태그<,>와 비교연산자<,>같은 경우) 이 경우를 막기위해 특수문자를 일반문자열로 변환한 엔티티라는 별도로 만든 문자셋을 사용한다.

(컴퓨터가 식별을 쉽게 하기 위해 바꾼 다음 처리를 하고 최종적으로는 우리에게 특수문자 형태로 출력.)

 

치환된 &lt;, &gt;는 URL인코딩된 값이 아니여서 다음코드에서 URL디코딩이 수행되어도 아무런 변화가 일어나지 않는다. 따라서 리턴되는 값은 &lt;, &gt;로 동일하다.

 

 

그렇다면 어떻게 우회할 수 있을까.

 

바로 URL인코딩한 값(%3c, %3e)을 입력하는 것이다.

URL인코딩한 값을 입력하게 되면 위 소스코드(functions_external.php)에서 str_replace() 함수가 실행되지 않고 바로 URL디코딩을 수행하는 코드가 실행된다. 따라서 결론적으로 <,>문자를 리턴한다.


↓High level

 

난이도 중에서 입력한 것과 똑같이 입력해 보았지만 반응하지 않는다.

php소스코드를 살펴보자.

htmlspecialchars() 함수가 눈에 들어온다.

htmlspecialchars() 함수는 예약어로 정의된 일부 문자를  HTML엔티티로 변환하는 함수이다.

또한 htmlspecialchars() 함수는 HTML에서 사용하는 특수 문자를 UTF-8로 반환한다.

 

그럼 htmlspecialchars() 함수를 거치면 어떻게 결과가 나오는지 서버로 부터의 응답을 확인해보자.

쌍따옴표가 &quot로 변환된 것을 확인할 수 있다.

이번에는 URL인코딩 값 대신 기존의 값을 넣어보자.

쌍따옴표뿐만 아니라 <,>문자도 HTML엔티티로 변한것을 확인할 수 있다.

 

따라서 우리는 htmlspecialchars() 함수를 통해 HTML태그에 사용되는 문자들을 인식할 수 없게 인코딩하여 HTML인젝션을 막을 수 있다.

반응형

'bWAPP' 카테고리의 다른 글

[비박스] PHP Code Injection  (0) 2020.04.17
[비박스] OS Command Injection  (0) 2020.04.14
[비박스] iFrame Injection  (0) 2020.04.13
[비박스] HTML Injection - Stored (Blog)  (0) 2020.04.05
[비박스] HTML Injection - Reflected (POST)  (0) 2020.04.04