[웹보안] 웹보안 3일차 - 오전
1. HTTP 응답분할 (CRLF Injection)
http://testphp.vulnweb.com/redir.php?r=http://www.google.com
이렇게 주소 입력 하면 구글로 이동함
우왕 싱기방기
GET http://testphp.vulnweb.com/redir.php?r=aaa%0d%0a%20new_header HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: ko-KR
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Host: testphp.vulnweb.com
DNT: 1
Proxy-Connection: Keep-Alive
이런식으로 잡히는게 있다.
이걸 수정 하려면
아래와 같이 수정한다.
1) 해결 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private void setHttpOnly(WebSession s) { String value = createCustomCookieValue(); HttpServletResponse response = s.getResponse(); String cookie = s.getCookie(UNIQUE2U); // 쿠키에 들어오는 취약점을 제거하기 위해 \r과 \n 을 없애 준다. cookie = cookie.replaceAll("\r", "").replaceAll("\n",""); if (cookie == null || cookie.equals("HACKED")) { response.setHeader("Set-Cookie", UNIQUE2U + "=" + value + "; HttpOnly"); original = value; } else { response.setHeader("Set-Cookie", UNIQUE2U + "=" + cookie + "; HttpOnly"); original = cookie; } } | cs |
저렇게 8번 라인의 내용을 추가 해 주면 되겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private void removeHttpOnly(WebSession s) { String value = createCustomCookieValue(); HttpServletResponse response = s.getResponse(); String cookie = s.getCookie(UNIQUE2U); // 쿠키 취약점 수정 cookie = cookie.replaceAll("\r", "").replaceAll("\n",""); if (cookie == null || cookie.equals("HACKED")) { response.setHeader("Set-Cookie", UNIQUE2U + "=" + value + ";"); original = value; } else { response.setHeader("Set-Cookie", UNIQUE2U + "=" + cookie + ";"); original = cookie; } } | cs |
이곳도 마찬가지.
근데 저거 수정해도
파인드버그에선 계속 나타나니까
수정하고 나면 파인드버그에서 수정한걸로 필터를 걸어주면 되겠다.
단 해당 취약점에 필터를 걸면 다른소스에 걸린 것들도 다 필터가 되니까
동일 취약점에 대해선 전부 수정을 해 준 후에 파인드버그에서 필터를 걸어주도록 하자.
2. XSS(Cross Site Script)
제일 많이 아는 취약점이고 가장 많이 나오는 취약점임
<script>alert("xss test"); </script>
이걸로 테스트 많이 함
저 스크립팅이 먹히면 온갖 스크립트로 할 수 있는 공격이 가능 하다.
1) 개념
DOM(local) XSS - 사용자측 스크립트
Reflected XSS - 서버측 스크립트
Stored Xss - 서버측 스크립트
Reflected
사용자 입력 값이 웹 화면에 바로 출력 되는 것
Stored
사용자 입력값이 DB에 저장되고 다시 출력되는 것
DOM
위험한 입력처리 오브젝트
아래의 dom 오브젝트들을 외부에서 검증되지 않는 값을 사용 할 수 있기 때문에 취약한
입력 값 이라고 정의 할 수 있다
document.URL
document.URLUnenCoded
document.location
document.referrer
위험한 출력처리 오브젝트
document.write 등등
해결방법
1 2 3 4 5 | <p> jsp basic : <%=input %></p> <p>EL : ${param.input }</p> <p>JSTL : <c:out value="${param.input }"></c:out></p> | cs |
stored 류의 XSS는 출력값을 JSTL을 이용해
c:out 를 이용해 출력하게 하도록 한다.
그럼 해결됨 JSTL 짱짱맨
위의 코드를 각각 테스트 해보면 됨.
jsp와 el은 스크립트 실행이 되는데 jstl은 실행 안됨
jsp와 el은 스크립트 실행이 되어 팝업이 뜨는데
JSTL에서는 팝업이 뜨지 않고 텍스트로 출력이 되는 것을 확인 할 수 있다.
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#XSS_Locator
여기 가면 온갖 방법들이 있으니 필터 한두개 걸었다고 안심하지 말자
1 | \";alert('XSS');// | cs |
이런 꺽쇠를 사용하지 않은 공격 방법도 있다
XSS는 정적 분석에선 잡아내기 힘들고 동적 분석에서 발견 하는 것이 좋은 것 같다.
'Yame Programmer > 웹보안' 카테고리의 다른 글
[웹보안] 웹보안 4일차 - 오전 (0) | 2017.06.10 |
---|---|
[웹보안] 웹보안 3일차 - 오후 (0) | 2017.06.03 |
[웹보안] 웹보안 2일차 - 오후 (0) | 2017.05.27 |
[웹보안] 웹보안 2일차 - 오전 (0) | 2017.05.27 |
[웹보안] 웹보안 1일차 - 오후 (0) | 2017.05.20 |