슈개's IT/SW개발보안

[SW개발보안] SR1-7. HTTP 프로토콜 유효성 검증

슈개 2021. 1. 23. 10:14
반응형

[SW개발보안] SR1-7. HTTP 프로토콜 유효성 검증

 

HTTP 응답 분할

 

외부 입력값을 응답 헤더의 값으로 사용하는 경우, 

외부 입력값에 개행 문자 포함 여부를 확인하지 않고 사용하면 응답이 여러 개로 분할되어 전달되는 현상

→ 분할된 응답에 만들어지는 본문 영역을 이용해서 공격 코드를 전달 실행

 

[대응방안]

외부 입력값을 응답 헤더의 값으로 사용하는 경우, 반드시 개행 문자 포함 여부를 확인 후 사용

 

[외부 입력값을 응답 헤더의 값으로 사용하는 경우]

  1. 리다이렉트

String url = request.getParameter("url");

response.sendRedirect(url);

⇒ Location: _____;

 

 

 

   2. 쿠키

String age = request.getParameter("age");

Cookie c = new Cookie();

c.add("age", age);

response.addCookie(c);

⇒ Set-Cookie: age=_____;

 

 

 

    3. setHeader() 

String fname = request.getParameter("filename");

response.setHeader("Content-Disposition", "inline; filename=" + fname);

⇒ Content-Disposition: inline; filename=______;

 

[개행 문자 포함 여부 확인 후 제거 코드 예]

String url = request.getParameter("url");

if (url != null) {

url = url.replaceAll("\\r", "");

url = url.replaceAll("\\n", "");

}

response.sendRedirect(url);


 

응답 구조

시작 HTTP/1.1 200 OK↳ 

헤더 Content-Type: text/html↳

            :

     Content-Length: 1023↳ 

     ↳

본문 <html>...</html>

 

예)

HTTP/1.1 200 OK↳ 

Content-Type: text/html↳

Locaion: main.jsp↳ … ↳↳ …<script>...</scrip> ↳HTTP/1.1 200 OK↳ … ↳

Content-Length: 1023↳ 

<html>...</html>

 

 

 

신뢰되지 않은 URL 주소로 자동 접속 연결

 

외부 입력값이 리다이렉트 또는 포워드의 주소로 사용되는 경우, 

외부 입력값을 검증, 제한하지 않고 사용하면 의도하지 않은 주소로 리다이렉트 또는 포워드되는 문제가 발생

→ 사용자를 속여서 사용자 입력을 유도하고 정보를 탈취 ⇒ 피싱 

 

리다이렉트(redirect), 포워드(forward)

 

        GET login.do?id=a&pw=b HTTP/1.1

login --------------------------> login.do

 

        HTTP/1.1 302 Move Temp.   일치하는 정보가 있는 경우  

        Location: main.do         response.sendRedirect("main.do"); 

      +-----------<-------------- 

      |  

      |   GET main.do HTTP/1.1

      +----------->-------------+ main.do

                                |

           HTTP/1.1 200 OK      | 

 main <-----------<-------------+ 


 

        GET login.do?id=a&pw=b HTTP/1.1

login --------------------------> login.do

                                    : 

           HTTP/1.1 200 OK          :

 main <-----------<-------------- main.do 


 

goto.jsp

===========================================

String url = request.getParameter("url");

response.sendRedirect(url);

 

[의도한 입력]

http://다음.com/goto.jsp?url=main.jsp

http://다음.com/main.jsp

 

[의도하지 않은 입력]

http://다음.com/goto.jsp?url=http://그다음.com/main.jsp

http://그다음.com/main.jsp


 

아래와 같은 공격 문자열을 생성해서 불특정 다수에게 메일 또는 SMS로 전파

<a href="http://다음.com/goto.jsp?url=http://그다음.com/main.jsp"> 궁금한 내용 </a>


 

개행문자 = 줄바꿈문자 = CRLF = \r\n = %0d%0a


 

banned function 

https://github.com/intel/safestringlib/wiki/SDL-List-of-Banned-Functions


 

포맷 문자열 ⇒ 데이터의 출력 형식을 지정하는 문자 %s %d %c %x … 

포맷 문자열 처리 함수 ⇒ printf(포맷문자열, 포맷문자열에 들어갈 데이터)

 

printf(" … %s %s … ", " … ", " … ")


 

input = " %s %s ";

printf(input);



 

입력  ---->  처리  ---->  출력

             ~~~~

             

개발자가 의도한 데로 동작하기 위해서는 개발자가 의도한 형식으로 입력

                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                       ⇒ 해당 입력값을 서버에 미리 가질 수 있도록

 

중요한 처리

  • 가급적이면 외부에서 들어오는 값을 이용하지 말고, 서버의 값을 이용 ⇒ 중요한 처리에 사용되는 값은 서버가 미리 가질 수 있도록 설계

  • 외부 입력이 필요한 경우에는 외부 입력값의 개수를 최소로 하고 반드시 검증 후 사용

 

검증

 

사용자 입력 ---->    …    ---> 처리

   ID             형식검증    내용검증 

회원가입                      회원가입 

로그인                        로그인

회원조회                      회원조회

:                         :

 

쿠키, 세션

쿠키(cookie)

 CLIENT                       SERVER

        -------------------->   *

          Set-Cookie: name=hong;age=24;email=abc@test.com;   

        <--------------------

 

     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STATELESS

 

          Cookie: name=hong;age=24;email=abc@test.com;  

        -------------------->   *

        <--------------------


 

세션(session)

 CLIENT  login.do?id=a&pw=b   SERVER

        -------------------->    SID=123 ⇒ name=hong;age=24;email=abc@test.com;

          Set-Cookie: SID=123;

        <--------------------

 

          Cookie: SID=123;

        -------------------->    

        <--------------------


 

쿠키를 안전하게 운용하는 방법

 

  1. 중요 정보를 쿠키에 포함하지 않는다. 

  2. 중요 정보를 포함할 경우, 반드시 암호화한다.

  3. 쿠키의 지속시간과 유효기간을 최소로 설정한다. 

    1. 긴 경우 → 디스크에 파일로 저장

    2. 짧은 경우 → 메모리에 일시적으로 저장

    1. Max-Age, Expires

 

cookie.setMaxAge(숫자)

  • 양수 : 설정된 시간 동안 쿠키가 유지

  • 음수 : 해당 세션 동안만 쿠키가 유지

  • 0 : 해당 쿠키를 삭제 (무효화)

https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/Cookie.html#setMaxAge(int)

  1. 쿠키의 보안 속성을 활성화한다. 

    1. 보안 쿠키 → HTTPS 통신을 할 때만 동일 서버로 요청이 갈 때 자동으로 전달

    2. 비보안 쿠키 → 동일 서버로 요청이 갈 때 자동으로 전달

    1. Secure 

  2. HttpOnly 속성을 활성화한다. 

    1. 클라이언트에서 자바스크립트 등을 이용한 쿠키 접근을 차단




 

   송금 

A ------> B 

 

if (A잔고 >= (송금액+수수료) && 송금액 >= 0) {

A잔고 = A잔고 - (송금액+수수료)

B잔고 = B잔고 + 송금액

}


 

<input type="password" value="" name="userPswd" maxlength="8">

                                                ~~~~~~~~~~~~~

                                                사용자 입력을 8자 이하로 제한


 

해쉬(hash, message digest)

임의 크기 입력, 고정 크기의 유일한 출력

 

단방향성 = 일방향성 : a ---> H(a) ---> a ⇒ 인증정보 저장 및 처리에 사용

                         o         x

  

유일성 : a <> b ⇒ H(a) <> H(b) ⇒ 무결성 검사

충돌회피

빠른연산

 

해쉬 크래킹 기법

PW ---> H(PW)  ==  H(???)

                          ~~~

                       1) 사전대입공격   

                       2) 무작위대입공격

                       3) Rainbow Table 

 

해쉬 크래킹을 방어

숫자 10자리 구성 ⇒ 10^10

영문자, 숫자, 특수문자 10자리 구성 ⇒ (26*2 + 10 + 13)^10

 

영문자, 숫자, 특수문자 80자리 구성 ⇒ (26*2 + 10 + 13)^(8+72)

                                                          ~~ salt



 

양방향성 

      --------------------------> 암호화

      P -------> A + key -------> E

      <-------------------------- 복호화


 

USER ---> PW ------> A + key ------> E(PW)

                     ~~~~~~~~~~~~~~~~~~~~~ admin

 

USER ---> PW ------> H(PW)



 

  A   ---------------------->  B

 data                         data' ⇒ H(data')

 H(data) ~~~~~~~~~~~~~~~~~~~> H(data)     ⇒ 동일하면 ⇒ data = data'


 

  A   ---------------------->  B

 data ~~~~~~~~   DATA  ~~~~~> DATA ⇒ H(DATA)

 H(data) ~~~~~ H(DATA) ~~~~~> H(DATA)         ⇒ 동일 


 

  A                            B

 key                          key 

 data ~~~~~~~~~~~~~~~~~~~~~~> data' ⇒ H(data'+key) 

 H(data+key) ~~~~~~~~~~~~~~~> H(data+key)           ⇒ 동일


 

  A                            B

 key                          key 

 data ~~~~~~~~ DATA ~~~~~~~~> DATA ⇒ H(DATA+key)

 H(data+key) ~ H(DATA) ~~~~~> H(DATA)             ⇒ 불일치 ⇒ 데이터 변조

 

 

반응형