본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 7-1.크로스 사이트 스크립팅 [Stored XSS-Change Secret]

by Robert8478 2023. 12. 13.

이번 페이지는 비밀번호 힌트를 새로 설정하는 기능을 제공한다.
이 비밀번호 힌트는 sqli_16.php 인 Login Form 페이지로 가면 볼 수 있다.

[난이도 하]

Secret 페이지에서 secret을 1로 변경하고 Login Form 페이지에서 bee/bug로 로그인 해보았더니 secret이 1로 변경되었다.
이제 secret에 자바 스크립트 코드를 넣어보자.

<script>alert(document.cookie)</script> 를 넣어서 change 버튼을 눌러 secret에 자바 스크립트 코드를 넣어보자.
그리고 다시 login 페이지로 가서 bee bug로 로그인 해보자.

그랬더니 성공적으로 세션값을 확인할 수 있었다.
이번 페이지는 hidden 타입으로 정의된 login 변수에 다른 사용자의 아이디를 입력해서 다른 사용자의 힌트 수정도 가능하다. 우선 robert 라는 계정을 새로 만들어 주겠다. 페이지의 검은 막대부분의 Create User 메뉴를 사용한다.

이처럼 계정을 만들어 주고 다시 해킹 페이지로 넘어간다.
이 계정의 Secret은 분명 "this is robert" 로 설정해 준 상태이다.

여기서 개발자도구(f12) 를 열고 위처럼 hidden 타입으로 된 input 폼의 value 값을 다른 사용자인 robert로 넣어주었다.
그 뒤 텍스트 입력 칸에 <script>alert(document.cookie)</script> 를 넣어보자.

그 다음 다시 로그인 페이지로 가서 아까 만든 robert 계정으로 로그인 해보자.

그랬더니 세션값이 정상적으로 노출이 된 것을 볼 수 있다.

[난이도 중,상]

난이도 중에서 개발자 도구를 보니 value 값이 토큰 값으로 되어 있는 것을 볼 수 있다.
그렇기에 다른 사용자로의 변경이 쉽지 않다.
low와 똑같은 방법을 사용해 보았다.

그러나 문자열화가 되어서 출력될 뿐 XSS 구문이 먹히지는 않았다.

url 인코딩을 해도 마찬가지였다.
PHP 코드를 살펴보니 난이도 중은 xss_check_4 , 상은 xss_check_3 함수로 필터링 중이었다.

코드를 보니 4는 addslashes 함수로 특수문자를 필터링 하며, 3은 htmlspecialchars 함수로 특수문자를 필터링 중이었다.
addslashes 함수는 특수문자에 \를 붙이는 필터링으로 XSS 구문이 먹히지 않게 한다.
htmlspecialchars는 입력 데이터를 UTF-8로 인코딩하며, 두번째 인자에 ENT_QUOTES 를 추가해서 XSS에 사용되는 특수문자들을 HTML 엔티티 코드로 변환시켜 스크립트 코드를 입력하여도 웹 브라우저에서는 문자로 인식하도록 한다.
htmlspecialchars 함수가 우회하는 특수문자는 &,",',<,> 가 있다.

또한, 개발자 도구에서 보았듯이 난이도 상에서는 사용자 정보를 'token' 으로 받아서 다른 사용자로 접근할 가능성을 막아버린다. 또한 힌트값을 받는 secret 변수는 mysqli_real_escape_string 함수를 통해 SQL 인젝션을 방어하면서 htmlspecialchars 함수로 필터링한다.