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











[웹보안] 웹보안 2일차 - 오후


이 포스팅에서 나오는거 실습은


경찰서나 회사 법무팀에서 연락받기 싫으면


해킹테스트 하라고 오픈한 사이트나


본인 사이트에서만 하도록 하자





http://findbugs.cs.umd.edu.eclipse


이클립스 추가 설치 플러그인


findbug - http://findbugs.cs.umd.edu/eclipse


findsecurity 




findbug 이클립스에 설치 하고 써먹어 보도록 하자


설치방법이나 사용법은 대충 구글해서 검색해 보고


사용 한다.




정적분석(static)

findbugs security (사용자 정의 룰 X) 

PMD (사용자 정의 룰 xpath query)


동적분석(dynamic)

scanray(paraos)

arachni




static + dynamic => hybrid




xpath


https://www.w3schools.com/xml/xpath_examples.asp


https://www.w3schools.com/xml/tryit.asp?filename=try_xpath_select_cdnodes_first



xml 정보를 가져 올 수도 있다.





juliet (test cases)

=> sink(input form, file ..)


cwe juliet <- 구글에서 검색하면 나옴


https://samate.nist.gov/SRD/testsuite.php




필터링엔


white list

black list가 있다


근데 둘다 짱 귀찮음


화이트 리스트는 허용된 리스트 항목만 전송 시키고


블랙리스트는 작성해놓은 리스트와 일치 하는건 전송 안시키는 것


둘다 개귀찮은데 하긴 해야함


1
2
3
4
5
6
7
8
9
10
package org.owasp.webgoat.lessons;
 
public class XpathFilter {
 private String filter(String data) {
    // TODO Auto-generated method stub
     data = data.replaceAll("\"""");
     data = data.replaceAll("'""");
     return data;
}
}
cs





요런식으로 만들어주자


그리고


1
2
String expression = "/employees/employee[loginID/text()='" + XpathFilter.Xpath(username) + "' and passwd/text()='" + XpathFilter.Xpath(password)
                    + "']";
cs


이렇게 값을 받아 쓰는 곳에 필터를 걸어 주도록 하자.


그럼 역슬래쉬와 싱글쿼테이션은 삭제가 된 문자열을 사용 하도록 하게 된다.



저렇게 바꾸면 실질적으론 차단이 되지만 findbug툴에선 여전히 xpath 취약점으로 나타나게 되는데


이때는 툴에서 예외처리를 해주면 된다.



취약점이 나타난 목록에 오른쪽 클릭 -> 토글 필터 - > this로 시작하는거 클릭 


이렇게 하면 해당 리스트는 빠지게 된다.



툴이 아무리 대단해도 사람이 임의로 만든 클래스가 필터링 하는 클래스인지까진 인지하지 못하기 때문에


취약리스트에 그대로 나타나게 되는 것 이다.



툴ㅇ 다 만능이 아님





http(response) splitting

CRLF Injection

http 응답분할

=> CRLF(\r\n)

위의 세가지는 동일한 취약점임


CRLF = Carriage Return , Line Feed


키보드의 엔터키와 동일한 기능을 한다. 그러나 URL 특정 파라미터에 해당 코드를 삽입하는 경우

임의의 헤더 정보를 생성 할 수 있는 취약점이 발생된다.


대충 헤더가 생겨먹은건


get /test.php HTTP/1.1

Accept : image/gif , 


뭐 대충 이렇게 생겨먹은애들인데


URL에 엔터키 기능 하는 걸 넣어서 다른 헤더정보를 삽입이 가능 하게 만드는 것.



url=%0D%0A%20New_Header:New_Header_Value%0D%0A


이런식으로 공격 문자를 넣는다


제대로된 공격 문자는 검색해서 알아서 찾아 보도록 하자



\r 이거랑 \n 이거 필터링 걸면 됨


근데 사례가 겁내 많음 알아서 막자


세상은 넓고 해커는 많다







CSP - Content Security Policy


검색해서 적용시켜 보자



XSS (Cross Site Scripting)


크로스 사이트 스크립팅


텍스트에 스크립트를 넣어서 관리자 정보를 취득한다거나


다른 페이지로 이동시킨다던가 뭐 스크립트로 해먹을 수 있는건 다 할 수 있다


이건 유명하니까 좀만 검색해도 다 나옴


XSS가 먹히는지 확인하는 간단한 방법임

<script> alert("test"); </script>







burp suite(=scan-ray) 


버프수트 프록시툴임 사람들이 많이 씀 관련한 글들도 검색하면 잘 나옴



client side : server side


# how to use proxy tool

1. proxy 설정(웹 브라우저 $ burp)


[[ web.brw => burp <요기서 가로챔>    ]]<======> www

     로컬 브라우저                                                  웹





2. 대상 페이지 호출 및 변조

3. 재전송







+ Recent posts