난이도 : low
Quest. Change Secret 페이지에서 XSS 공격 후 SQL Injection(Login From/users) 페이지에서 확인할 수 있습니다.
다음 화면을 출력해보세요. (bee/bug)

내 아이디를 로그아웃 한 뒤에 bee/bug로 다시 로그인했다.
해당 페이지의 동작을 알아보기 위해 siss를 입력했다.

출력된 것을 확인하기 위해 SQL Injection(Login From/users)로 이동해 보았다.

your secret: 뒤에 내가 입력한 내용이 출력되는 것을 확인할 수 있었다.
따라서 <script>alert("success")</script>를 입력하면 경고창을 띄울 수 있을 것이다.


예상한 대로 success 경고창을 띄울 수 있었다.
Quest. secret을 사용자의 쿠키 정보로 바꿔봅시다.

secret에 <script>alert(document.cookie)</script>를 입력한다.

다시 login form으로 돌아가서 로그인한다.

쿠키를 출력한 경고창을 확인할 수 있다.
난이도 : high
Quest. 공격할 수 없습니다. Secret은 두 개의 함수를 이용해 방어하고 있습니다. 함수의 이름을 적어주세요.

난이도를 high로 바꾸자 스크립트가 실행되지 않고 그대로 텍스트로 출력되는 것을 확인할 수 있었다.
원인을 파악하기 위해 소스코드를 살펴보았다.

특수문자가 출력될 때의 형태가 달라졌다.
아마도 htmlspecialchars() 함수가 적용된 것 같다.

xss_stored_3.php에 데이터가 저장되는 것을 확인할 수 있었다.
xss_stored_3.php 파일을 살펴보았다.

xss_check_3함수가 적용되는 것을 확인할 수 있었다.

또한 DB에 저장되기 전에 mysql_real_escape_string과 htmlspceialchars 함수가 적용되는 것을 확인할 수 있었다.
htmlspcialchars 함수가 적용되어 특수문자들이 필터링되기 때문에 스크립트를 사용할 수 없다.
또한 mysql_real_escape_string함수가 적용되어 mysql과 커넥션을 할 때 특수 문자를 escape한 상태로 만든다.
해당 함수는 '와 같은 특수 문자를 포함한 문자열이 입력되었을 때, '가 mysql의 다른 코드에 영향을 주지 않도록 한다.