Part-1, HTML 인젝션

개보린·2021년 11월 24일
0

비박스

목록 보기
3/15
  • 이 글을 무단으로 전재 및 재배포를 금지하고 있습니다.
  • 허용받지 않은 서비스 대상으로 해킹을 시도하는 행위는 범죄 행위 입니다. 본 내용을 악의적인 목적으로 사용 시 그에 대한 법적 책임을 포함한 모든 책임은 당사자에게 있으며, 작성자는 어떠한 책임도 지지 않음을 밝힙니다.

HTML 인젝션이란 취약한 매개변수에 악의적인 HTML 코드를 삽입하는 공격

반사(Reflected)기법

URL에 악의적인 HTML 태그를 삽입하여 링크를 클릭한 사용자의 PC에서 HTML태그가 실행되게 하는 공격

GET 공격

<h1>Success</h1> --First name
<img src=http://192.168.56.104/bWAPP/images/bee_1.png> --Last name

각 textfiled 입력 값에 내용을 넣고 submit을 하면 아래와 같은 URL이 생성되고 공격자는 다음 주소 형태로 사용자들에게 유도한다. 그러면 HTML태그가 삽입된 페이지를 정상적인 페이지로 오해하게 된다.

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

만일 태그가 실행되지 않고 화면에 문자열이 그대로 출력이 된다면 태그를 필터링하고 있다는 것이다. 공격 실행 후 페이지 소스 보기를 확인해보자.

//페이지 소스 보기에서 필터링된 '<', '>'
Welcome &lt;h1&gt;Success&lt;/h1&gt; &lt;img src=http://192.168.56.104/bWAPP/images/bee_1.png&gt;
//실제 php에서 확인되는 필터링 함수(xss_check_1) 내용
$input = str_replace("<", "&lt;", $data);
$input = str_replace(">", "&gt;", $input);

따라서 태그에 사용되는 '<'와 '>'문자를 URL 인코딩하여 입력하여야 한다.

URL인코딩이란💭
ASCII 코드의 HEX(16진수)에 %를 붙인 값
ex) 문자: < ➡ ASCII: 60 ➡ HEX: 3C ➡ 인코딩: %3C
**URL 인,디코딩 사이트: https://www.urlencoder.org

저장(Stored)기법

악의적인 HTML 태그를 데이터베이스에 저장하여 사용자의 PC에 태그가 실행되게 하는 공격, 특히 공개적인 게시판에 악의적인 태그를 올리면 많은 사용자를 대상으로 공격 가능

<form action="/bWAPP/htmli_post.php" method="POST">
    <p><label for="firstname">First name:</label><br>
    <input type="text" id="firstname" name="firstname"></p>

    <p><label for="lastname">Last name:</label><br>
    <input type="text" id="lastname" name="lastname"></p>

    <button type="submit" name="form" value="submit">GO</button>
</form>

입력값에 html 폼태그를 사용하여 [GO]버튼 클릭 시 /bWAPP/htmli_post.php 페이지로 이동하게 된다.

🔑대응방안

HTML태그에 사용되는 문자들을 인식하지 않게 인코딩한다.
htmlspecialchars(PHP)는 HTML에서 사용하는 특수 문자를 UTF-8로 반환한다.
htmlspecialchars함수에서 변환하는 특수문자는 & , " , ' , < , > 이다.
UTF-8: 유니코드를 인코딩(encoding)하는 방식
UTF-8 출처 https://jeongdowon.medium.com/unicode%EC%99%80-utf-8-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-b6aa3f7edf96

htmlspecialchars($data, ENT_QUOTES, "UTF-8");

profile
현역 '개'발자에서 '보'안 어'린'이로

0개의 댓글