본문 바로가기
Projects/애플리케이션 보안

[bWAPP] HTML Injection - Stored (Blog) 공격 실습

by rimystory 2025. 8. 21.

실습 환경 구축은 이 글에 설명되어있다. (https://rimystory.tistory.com/18)

 

HTML Injection - Stored (Blog) 공격 설명: HTML 태그를 블로그 형식의 페이지에 저장하여 관리자가 의도하지 않은 내용을 출력 혹은 권한 없이 우회하여 다른 페이지로 이동하는 공격.

 

1. 난이도: low

htmli_post.php 페이지의 형식을 사용하기 위해서 Reflected(POST) 페이지로 이동하여 개발자 도구(F12)를 키고 HTML 소스 코드를 복사한다.

 

[실행 화면]

 

복사한 코드:

<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>

 

다시 Stored(Blog) 페이지로 접속하여 textarea에 위 내용을 붙여넣고 Submit 버튼을 누르면 입력한 코드가 실행된다. 

 

[실행 화면]

안에 내용을 채워놓고 Go 버튼을 누르면 아래와 같이 htmli_post 페이지로 이동할 수 있게 된다.

 

[결과 화면]

 

2. 난이도: medium, high

위와 같은 방법으로 HTML 코드를 붙여넣기 하고 Submit 버튼을 눌러보면 해석되지 않고 그냥 문자열로 출력하는 것을 볼 수 있다.

 

[결과화면]

 

공격이 실패한 이유를 찾기 위해 /var/www/bWAPP/htmli_stored.php 코드를 확인한다.

if security_level == 1(중) or 2(상) 일 경우,

xss_check_3 함수를 사용하여 Entry 항목에 들어가는 내용을 필터링하는 것을 볼 수 있다.

 

(대응방안)

xss_check_3 함수의 세부 로직은 앞 글들의 다른 html injection과 마찬가지로 <htmlspecialchars> 함수를 사용하며, /var/www/bWAPP/funtions_external.php에 정의되어 있다. 이 글에서는 사진 및 함수 설명을 생략한다.