할일
HTTP&Network 책읽기(~314)
C프로그래밍 책읽기(~308)
HTTP&Network 책
웹 공격기술
- 리퀘스트는 클라이언트에서 변조 가능
웹 애플리케이션에 대한 공격은 HTTP 리퀘스트 메세지에 공격 코드를 실어서 실행
쿼리나 폼, HTTP 헤더, 쿠키 등을 경유해서 보내져 웹 애플리케이션에 취약점이 있을 경우 정보를 탈취
-서버를 노리는 능동적 공격
공격자가 직접 웹 애플리케이션에 액세스해서 공격 코드를 보내는 타입의 공격
서버 상의 리소스에 대해 직접 실행되기 때문에 공격자가 리소스에 액세스할 필요가 있음
대표적인 능동적 공격에는 SQL 인젝션과 OS 커맨드 인젝션 등이 있음
-유저를 노리는 수동적 공격
함정을 이용해서 유저에게 공격 코드를 실행시키는 공격
1.공격자가 설치한 함정에 유저를 유도한다.
-> 함정에는 공격 코드를 심어둔 HTTP 리퀘스트를 발생시키기 위한 장치가 준비되어 있음
2.사용자가 함정에 걸리면 유저의 브라우저나 메일 클라이언트에서 함정을 열게됨
3.유저의 브라우저에 장착된 공격 코드를 포함한 HTTP 리퀘스트를 공격 대상 웹 애플리케이션에 송신
4.취약점이 있는 웹 애플리케이션은 유저가 가지고 있는 쿠키 등의 기밀 정보를 도둑맞거나 로그인 중인 유저의 권한이 악용되는 등의 문제가 발생
대표적인 수동적 공격에는 XSS와 CSRF 등이 있음
클라이언트 / 웹 애플리케이션(서버 측)에서 입력,출력 체크하는 2가지 방법이 있음
클라이언트 측에서의 체크는 대부분 JavaScript를 사용함
그러나 변조되었거나 무효화될 가능성이 있기 때문에 근본적인 보안 대책으로는 적합하지 않음
웹 애플리케이션 측의 입력 값 체크는 웹 애플리케이션 내에서 처리할 때에 공격 코드로서 의미를 갖는 것도 있기 때문에 근본적인 보안 대책으로는 적합하지 않음
웹 애플리케이션에서 처리한 데이터를 데이터베이스나 파일 시스템, HTML, 메일 등에 출력할 때 출력하는 곳에 따라 이스케이프 처리하는 출력 값의 이스케이프가 보안 대책으로 중요하다.
출력 값의 이스케이프가 미비할 경우 공격자가 보낸 공격 코드가 출력하는 대상에 피해를 입힐 수 있음
- 크로스 사이팅 스크립팅
취약성이 있는 웹 사이트를 방문한 사용자의 브라우저에 부정한 HTML 태그나 Javascript 등을 동작시키는 공격
공격자가 작성한 스크립트가 함정이 되고 유저의 브라우저 상에서 움직이는 수동적 공격
1.가짜 입력 폼 등에 의해 유저의 개인정보를 도둑맞는다.
2.스크립트에 의해 유저의 쿠키 값이 도둑맞거나 피해자가 의도하지 않는 리퀘스트가 송신된다.
3.가짜 문장이나 이미지 등이 표시된다.
- SQL 인젝션
웹 애플리케이션을 이용하고 있는 데이터베이스에 SQL을 부정하게 실행하는 공격
1.데이터베이스 내의 데이터 부정 열람이나 변조
2.인증 회피
3.데이터베이스 서버를 경유한 프로그램 실행
- OS 커멘드 인젝션
웹 애플리케이션을 경유하여 OS 명령을 부정하게 실행하는 공격
쉘을 호출하는 함수가 있는 곳에서 발생할 가능성이 있다.
- HTTP 헤더 인젝션
공격자가 리스폰스 헤더 필드에 개행 문자 등을 삽입함으로써 임의의 리스폰스 헤더 필드나 바디를 추가하는 수동적인 공격
특히 바디를 추가하는 공격을 HTTP 리스폰스 분할 공격이라고 부른다.
헤더 필드에 값을 출력하는 처리가 있던 곳에 개행 문자를 삽입함으로써 발생
1.임의의 쿠키 세트 지정(개행 문자 후 Set-Cookie 지정)
2.임의의 URL에 리다이렉트
3.임의의 바디 표시(HTTP 리스폰스 분할 공격)
3번 공격으로 인해 가짜 웹 페이지를 표시해서 개인 정보를 입력하게 하거나 XSS 같은 효과를 얻을 수 있음
- 메일 헤더 인젝션
웹 애플리케이션의 메일 송신 기능에 공격자가 임의로 To 및 Subject 등의 메일 헤더를 부정적으로 추가하는 공격
스팸 메일이나 바이러스 메일 등을 임의의 주소에 송신할 수 있음
- 디렉토리 접근 공격(디렉토리 트래버설)
비공개 디렉토리의 파일에 대해서 부정하게 디렉토리 패스를 가로질러 액세스하는 공격
디렉토리를 지정받을 수 없게 해야함(상대경로,절대경로로 접근가능)
- 리모트 파일 인클루션
스크립트의 일부를 다른 파일에서 읽어올 때 공격자가 지정한 외부 서버 URL을 파일에서 읽게함으로써 임의의 스크립트를 동작시키는 공격
출력 값의 이스케이프 문제로 볼 수도 있지만 임의의 파일명을 지정할 수 없도록 해야함(주로 PHP에서 발생하는 취약점)
웹 서버의 설정이나 설계 미비로 인한 취약성
- 강제 브라우징
웹 서버의 공개 디렉토리에 있는 파일 중에서 공개 의도가 없는 파일이 열람되게 하는 취약성
1.고객 정보등 중요 정보 누설
2.본래 액세스 권한이 있는 사용자에게만 표시하지 않는 정보 누설
3.어디에서도 링크되지 않은 파일 누설
세션 관리 미비로 인한 취약성
유저의 상태를 관리하기 위한 기능이지만 취약한 경우 유저 인증 상태를 빼앗겨 버리는 피해가 발생됨
- 세션 하이잭
공격자가 어떠한 방법으로 유저의 세션 ID를 입수해서 악용하는 것으로, 유저로 위장하는 공격
세션 ID를 입수하는 방법
1.부적절한 생성 방법에 의한 세션 ID 추측
2.도청이나 XSS 등에 의한 세션 ID 도용
3.세션 고정 공격에 의한 세션 ID 강제
- 세션 픽세이션
공격자가 지정한 세션 ID를 유저에게 강제적으로 사용하게 하는 공격으로 수동적 공격임
-크로스 사이트 리퀘스트 포저리(CSRF)
인증된 유저가 의도하지 않는 개인 정보나 설정 정보 등을 공격자가 설치해둔 함정에 의해 어떤 상태를 갱신하는 처리를 강제로 실행시키는 공격으로 수동적 공격임
1.인증된 유저의 권한으로 설정 정보등을 갱신
2.인증된 유저의 권한으로 상품을 구입
3.인증된 유저의 권한으로 게시판에 글 작성
XSS,CSRF,SQL 인젝션 같은 개념들은 많이 들어봤는데 그 외에 것들은 처음 들어보는 개념이라 신기하기도 하고 좋은 애플리케이션을 개발하려면 여러가지 측면을 고려해야 하겠구나 하는 생각이 들었다.
C프로그래밍 책
포인터 변수는 메모리의 주소 값을 저장하기 위한 변수이다.
int main(void)
{
int num = 7;
int * pnum; // 포인터 변수 pnum의 선언
pnum = # // num의 주소 값을 포인터 변수 pnum에 저장-> &연산자가 주소값을 반환함
}
int main(void)
{
int num = 10;
int * pnum = # // 포인터 변수 pnum이 변수 num을 가리키게 하는 문장
*pnum = 20; // pnum이 가리키는 변수(num)에 20을 저장하는 문장
printf("%d", *pnum); // pnum이 가리키는 변수를 부호 있는 정수로 출력하는 문장
}
int main(void)
{
int num1 = 100, num2 = 100;
int *pnum;
pnum = &num1; // 포인터 pnum이 num1의 주소 값을 가리킴
(*pnum)+=30; // pnum이 가리키는 변수(num1)에 +=30
pnum = &num2; // 포인터 pnum이 num2의 주소 값을 가리킴
(*pnum)-=30; // pnum이 가리키는 변수(num2)에 -=30
printf("num1%d, num2:%d", num1, num2); //130, 70이 출력
}