XSSλ HTML μΈμ μ μ μΌμ’ μΌλ‘ μΉνμ΄μ§μ λ΄μ©μ λ³κ²½νκ±°λ νΌν΄μμ μΉλΈλΌμ°μ μ μμμ μλ° μ€ν¬λ¦½νΈλ₯Ό μ€ννλ 곡격μ΄λ€. 곡격μκ° μλλ°©μ λΈλΌμ°μ μ Scriptλ₯Ό μ€νν μ μκ² νμ¬ μ¬μ©μ Sessionμ κ°λ‘μ±κ±°λ μΉ μ¬μ΄νΈ λ³μ‘°, μ μμ 컨ν μΈ μ½μ , νΌμ± 곡격μ ν μ μλ€. μΉμ¬μ΄νΈμμ λ©μΌ μ£Όμ, μ¬μ©μ ID, λΈλ‘κ·Έ λκΈ, μ°νΈλ²νΈ λ±κ³Ό κ°μ μ¬μ©μμ μ 보λ₯Ό μ λ ₯ λ°μ ν μ΄λ₯Ό λ€μ 보μ¬μ£Όλ κ³Όμ μμ λ°μνλ€.
π€ 3) DOMκΈ°λ° XSS
μΈλΆ μ λ ₯κ°μ μ€ν¬λ¦½νΈκ° μ½μ λμ§ λͺ»νλλ‘ λ¬Έμμ΄ μΉν ν¨μλ₯Ό μ¬μ©νλ€.
μΈλΆ μ λ ₯κ°μ λνμ¬ κ²μ¦ μμ΄ νλ©΄μ μΆλ ₯λ κ²½μ° κ³΅κ²©μ€ν¬λ¦½νΈκ° ν¬ν¨λ URLμ μμ± ν μ μμ΄ μμ νμ§ μλ€.(Reflected XSS)
<% String keyword = request.getParameter("keyword"); %>
κ²μμ΄ : <%=keyword%>
μ λ ₯κ°μ λνμ¬ μ€ν¬λ¦½νΈ 곡격κ°λ₯μ±μ΄ μλ λ¬Έμμ΄μ μΉννλ€.
<% String keyword = request.getParameter("keyword"); %>
keyword = keyword.replaceAll("&", "&");
keyword = keyword.replaceAll("<", "<");
keyword = keyword.replaceAll(">", ">");
keyword = keyword.replaceAll("οΏ¦"", """);
keyword = keyword.replaceAll("'", "'");
keyword = keyword.replaceAll("/"", "/");
keyword = keyword.replaceAll("(", "(");
keyword = keyword.replaceAll(")", ")");
κ²μμ΄ : <%=keyword%>
π Java μνμ΄ μ½λ
π C μνμ΄ μ½λ
μ¬μ©μκ° HTML μ½λλ₯Ό μμ±ν μ μλλ‘ νμ©νκ² λλ©΄ μλ°μ€ν¬λ¦½νΈ μμ μ¬μ©ν μ μκ² λλ―λ‘ XSS곡격μ μ½κ² ν μ μλ νκ²½μ΄ λλ€.
HTMLμ½λμμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ€νν μ μλ λ°©λ²μ μλ μμ΄ λ§μΌλ―λ‘ <script>
νκ·Έμ κ°μ μ§μ λ νΉμ ν¨ν΄μ κ±Έλ¬λ΄λ λΈλ리μ€νΈ λ°©μμΌλ‘λ XSSλ₯Ό λ§κΈ°κ° μ΄λ ΅λ€.
HTML νκ·Έλ₯Ό νμ©νλ κ²μνμμλ νμ©λλ HTML νκ·Έλ€μ νμ΄νΈλ¦¬μ€νΈλ‘ λ§λ€μ΄ ν΄λΉ νκ·Έλ§ μ§μνλλ‘ νλ€.
μ λ ₯κ²μ¦μ μν λ°©λ²μ λ κ°μ§κ° μλ€. μ¦ νμ΄νΈλ¦¬μ€νΈ(white-list)μ λΈλ리μ€νΈ(black-list)λ₯Ό μ΄μ©νλ λ°©λ²μ΄λ€.
- λΈλ리μ€νΈ νν°λ§: νμ©λμ§ μλ μ λ ₯ κ°μ λν 리μ€νΈ
- νμ΄νΈλ¦¬μ€νΈ νν°λ§: νμ© κ°λ₯ν μ λ ₯ κ°μ λν 리μ€νΈ
νμ΄νΈλ¦¬μ€νΈ, λΈλ리μ€νΈλΌλ μ©μ΄ λμ 'positive'μ 'negative' 보μ λ°©λ²μΌλ‘ λΆλ €μ§κΈ°λ νλ€.
JSTL λλ μ μλ €μ§ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½νΈ λ°©μ§ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©νλ€.
μΈλΆ μ λ ₯κ°μ λνμ¬ κ²μ¦ μμ΄ λΈλΌμ°μ μμ μ€νλλ κ²½μ° μλ²λ₯Ό κ±°μΉμ§ μλ 곡격μ€ν¬λ¦½νΈκ° ν¬ν¨λ URLμ μμ± ν μ μμ΄ μμ νμ§ μλ€. (DOM κΈ°λ° XSS)
<script type="text/javascript">
document.write("keyword:" + <%=keyword%>);
</script>
NAVER Lucy-XSS-Filter, OWASP ESAPI, OWASP Java-Encoder-Project λ±μ XSS λ°©μ§ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ€.
<script type="text/javascript">
document.write("keyword:" +
<%=Encoder.encodeForJS(Encoder.encodeForHTML(keyword))%>);
</script>
νμ μμ λΆ, μ μμ λΆ SW κ°λ°Β·μ΄μμλ₯Ό μν μννΈμ¨μ΄ κ°λ°λ³΄μ κ°μ΄λ, 2019. 11