지난번엔 GET 방식이었다면, 요번에는 POST 방식입니다.
<script>alert('XSS')</script>
<script>alert('XSS')</script>
POST 방식으로 데이터를 보내는 것을 버브스위트를 통해 확인할 수 있습니다.
firstname과 lastname에 원하는 테그를 삽입해서 포워드 해줬습니다.
마찬가지로 GET 방식 때 학습할 때랑 마찬지로 <, >를 필터링하는 str_replace 함수를 사용하고 있습니다.
단순하게 <는 %3C >는 %3E로 이전 GET 방식에 학습했던 인젝션 코드를 넣어줬지만 실행이 되지 않았습니다.
%3Ch1%3ESUCCESS%3C/h1%3E
이때 더블인코딩을 사용하여 해결할 수 있습니다.
%253Ch1%253ESUCCESS%253C/h1%253E
%253Ch1%253ESUCCESS%253C/h1%253E
이게 신기한게 입력 폼 창에 인젝션 코드를 그대로 넣으면 다음과 같이 출력되면서 실패합니다.
하지만, 버프스위트로 인터셉트한 뒤 firstname과 lastname에 더블인코딩한 값을 넣어주니 성공했습니다.
GET 방식은 URL 쿼리 스트링에 데이터를 포함시키는 과정에서 브라우저가 자동으로 인코딩을 처리하기 때문에, 사용자가 더블 인코딩을 할 필요가 없습니다. 반면, POST 방식은 서버 측에서 데이터가 어떤 형식으로 인코딩되어 오는지에 따라 추가적인 디코딩이 필요할 수 있습니다. 서버가 URL 인코딩된 데이터를 다시 인코딩한다고 가정하면, 더블 인코딩된 데이터를 처리하기 위해 디코딩 과정을 한 번 더 거쳐야 하는 경우가 생길 수 있기 때문인 것 같습니다.
필터링이 잘 되어있어 해결할 수 없습니다.