[웹보안] 웹보안 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



http://testphp.vulnweb.com/redir.php?r=aaa%0d%0a%20new_header
이렇게 날리면

HTTP/1.1 302 Moved Temporarily
Server: nginx/1.4.1
Date: Sat, 03 Jun 2017 01:43:21 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.3.10-1~lucid+2uwsgi2
Location: aaa new_header:


이렇게 응답받아옴

리다이렉트가 성공하면 된거임

저걸 막아야함


웹고트를 파인드 버그로 돌려보면



이런식으로 잡히는게 있다.


이걸 수정 하려면


아래와 같이 수정한다.


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는 정적 분석에선 잡아내기 힘들고 동적 분석에서 발견 하는 것이 좋은 것 같다.











+ Recent posts