[SW개발보안] SR1-7. HTTP 프로토콜 유효성 검증
HTTP 응답 분할
외부 입력값을 응답 헤더의 값으로 사용하는 경우,
외부 입력값에 개행 문자 포함 여부를 확인하지 않고 사용하면 응답이 여러 개로 분할되어 전달되는 현상
→ 분할된 응답에 만들어지는 본문 영역을 이용해서 공격 코드를 전달 실행
[대응방안]
외부 입력값을 응답 헤더의 값으로 사용하는 경우, 반드시 개행 문자 포함 여부를 확인 후 사용
[외부 입력값을 응답 헤더의 값으로 사용하는 경우]
-
리다이렉트
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/goto.jsp?url=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;
-------------------->
<--------------------
쿠키를 안전하게 운용하는 방법
-
중요 정보를 쿠키에 포함하지 않는다.
-
중요 정보를 포함할 경우, 반드시 암호화한다.
-
쿠키의 지속시간과 유효기간을 최소로 설정한다.
-
긴 경우 → 디스크에 파일로 저장
-
짧은 경우 → 메모리에 일시적으로 저장
-
-
Max-Age, Expires
cookie.setMaxAge(숫자)
-
양수 : 설정된 시간 동안 쿠키가 유지
-
음수 : 해당 세션 동안만 쿠키가 유지
-
0 : 해당 쿠키를 삭제 (무효화)
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/Cookie.html#setMaxAge(int)
-
쿠키의 보안 속성을 활성화한다.
-
보안 쿠키 → HTTPS 통신을 할 때만 동일 서버로 요청이 갈 때 자동으로 전달
-
비보안 쿠키 → 동일 서버로 요청이 갈 때 자동으로 전달
-
-
Secure
-
HttpOnly 속성을 활성화한다.
-
클라이언트에서 자바스크립트 등을 이용한 쿠키 접근을 차단
송금
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) ⇒ 불일치 ⇒ 데이터 변조
'슈개's IT > SW개발보안' 카테고리의 다른 글
[SW개발보안] 개발보안 기타 정리 내역1 (0) | 2021.01.23 |
---|---|
[SW개발보안] SR1-10. 업로드·다운로드 파일 검증 (0) | 2021.01.23 |
[SW개발보안] SR1-6. 웹 기반 중요기능 수행 요청 유효성 검증 (0) | 2021.01.23 |
[SW개발보안] SR1-5. 웹 서비스 요청 및 결과 검증 (0) | 2021.01.23 |
[SW개발보안] SR1-4. 시스템 자원접근 및 명령어 수행 입력값 검증 (0) | 2021.01.23 |