HTML Injection
Reflected
URL에 악의적인 HTML 태그를 삽입하여 링크를 클릭한 사용자의 PC에서 HTML 태그가 실행되게 하는 공격이다.
공격자는 이메일, 게시판이나 SNS를 통해 악의적인 URL을 유포하고, 해당 URL을 클릭하면 피싱 사이트로 접속되어 개인 정보 유출, 악성 프로그램 설치 등의 피해를 입을 수 있다.
Stored
서버에 악의적인 HTML 태그를 저장시켜, 사용자가 태그가 저장된 게시물을 읽을 경우 HTML 태그가 실행되게 하는 공격이다.
공격자는 게시글에 악의적은 스크립트를 삽입하고, 사용자가 게시글을 읽으면 태그가 실행되어 쿠키 정보 갈취, 악성 코드 유입, 랜섬웨어, 피싱 사이트 접속 등의 피해를 입을 수 있다.
저장(Stored)

htmli_stored.php 페이지는 블로그 형식이다.
따라서 HTML 태그를 저장하여 관리자가 의도하지 않은 내용을 출력하게 하는 공격이 가능하다.
또한 블로그에 실린 텍스트 필드에 내용을 입력하고 GO 버튼을 클릭하면 입력 내용을 전송하고 다른 페이지로 이동한다.
이번 실습에서 목표로 하는 것은 stored(Blog) 페이지에 코드를 삽입하여 html injection - reflected(POST)에서 다음 화면을 출력하는 것이다.

난이도 low
태그가 실행되는지 확인해 보았다.

태그가 실행되는 것을 확인할 수 있다.
그렇다면 <form>을 사용해서 이전 문제인 html injection - reflected (POST)를 삽입할 수 있을 것 같다.
<form>은 입력한 데이터를 서버로 보내는 기능을 한다.

개발자도구를 이용해서 Reflected(post)의 form 코드를 확인했다.
<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>

form 태그를 이용해서 삽입하니 Reflected(post)의 화면이 출력되었다.

각각 필요한 코드를 삽입하고 Go를 클릭하면 문제를 해결할 수 있었다.
난이도 medium

난이도를 medium으로 변경하면 태그를 사용할 수 없게 된다.
이유를 알아내기 위해서 터미널로 가서 코드를 확인해 보았다.

난이도를 medium으로 변경하면 security_level이 1로 변경된 것을 확인할 수 있었다.
터미널로 들어가서 파일을 살펴보았다.
경로는 /var/www/bWAPP/htmli_stored.php이다.

medium 난이도는 xss_check_3() 라는 함수를 통해서 데이터를 받고 있다.
해당 함수는 functions_external.php에 정의되어 있다.

htmlspecialchars라는 기본함수를 이용해서 입력값을 우회한다.
htmlspecialchars 함수는 문장내에 HTML코드가 들어가는 특수문자를 포함시켜 입력하고 화면으로 출력할 때, HTML의 특수문자가 HTML태그로 적용되는 것이 아니라 일반 문자로 인식되어 그대로 출력한다.
따라서 HTML 코드를 이용한 방법을 사용할 수 없게 되었기 때문에 원하는 화면을 출력할 수 없다.