반응형
About Me

안녕하세요, cool & soft한 백엔드 개발자가 되고싶은 토니입니다.

Notice
Recent Posts
Recent Comments
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

Code Art Online

[웹 해킹과 보안 설정 가이드] 1장: 입력 값 조작 공격 본문

보안

[웹 해킹과 보안 설정 가이드] 1장: 입력 값 조작 공격

kiritoni 2024. 9. 18. 10:54
반응형

01장. 입력 값 조작 공격

입력 값 조작 공격은 개발 단계에서부터 서버 측에서 입력 값을 검증하여 예방하는 방법이 가장 효과적이다.

 

 

 


1.1 운영체제 명령 실행

  • 대부분의 공격은 URI의 변수 값에 시스템 명령을 삽입해 Request 패킷을 조작함으로써 이루어진다. (ex. http://도메인명/download.jsp?filename=;/bin/ls -al)
  • 따라서 운영체제 명령 실행 공격의 대상이 되는 취약한 함수들은 가급적 사용하지 않는 것이 좋다.
  • 예를 들어, Java(Servlets, JSP)의 경우 System.* (특히 System.Runtime)이 공격당하기 쉽다.
  • 변수 입력 값에 대해 입력 가능한 문자열을 지정한 후, 지정한 문자열 이외의 나머지 문자열에 대해서는 필터링을 수행하면 된다.(명령어 cd, ls, uname du, mk, mv, rm, pwd, chmod 등등 ... + 다중 명령 실행 구분자'|', ';')

1.2 SQL 인젝션

  • SQL 인젝션 취약점은 게시판을 호출하는 URI의 변수 값 등, 전송되는 문자열에 대해 웹 서버에서 해당 값의 유효성을 검증하지 않음으로써 SQL 쿼리가 데이터베이스 서버로 전송돼 실행되는 취약점이다.
  • 예를 들어, 로그인 인증 우회, 홈페이지 변조, 내부 자료 유출 등의 공격을 당할 수 있다.
  • 데이터를 암호화하는 것이 만능은 아니다.
    • 단방향 암호가 아닌 양방향 암호를 사용할 경우, 홈페이지와의 통신 시 데이터를 복호화하여 전달한다.
    • 이 경우에는 데이터 암호화 여부와 관계없이 정보가 노출될 수 있다.

SQL 인젝션 취약점의 존재 여부를 간단하게 확인하는 방법

1) 특수문자를 추가해 0x80040E14와 같은 오류 메시지가 출력되는지 확인한다.

ex. 정상 URI: http://도메인명/board/view.php?db=free&no=1&page=1

➡️ http://도메인명/board/view.php?db=free&no='1&page=1

➡️ http://도메인명/board/view.php?db= free&no=1'&page=1

  • 오류 메시지가 발생한다면, 이는 입력한 값이 데이터베이스 서버까지 전달돼 특수 문자가 데이터베이스의 쿼리문에 영향을 미친다는 것이다.

2) 정상적인 URI의 변수값이 SQL 쿼리를 추가해 참인 조건일 때와 거짓인 조건일 때 출력되는 결과를 비교해 각각 다른 결과가 출력되는지 확인한다.

ex. 다른 결과 출력 시 SQL 인젝션 취약점이 있다는 것이다.

참인 조건: http://도메인명/view.jsp?idx=1 and 1=1--

거짓인 조건: http://도메인명/view.jsp?idx=1 and 1=2--

블라인드 인젝션

URI의 변수 값에 의도적으로 오류가 발생되는 SQL 쿼리문을 전달해 나타나는 오류 메시지를 통해 테이블의 존재 여부, 테이블명, 필드의 개수, 필드명 등을 하나씩 획득해가는 공격 기법

로그인 화면 SQL 인젝션

  • 로그인 페이지에 SQL 인젝션 취약점이 존재할 경우 로그인이 가능하게 된다.

SQL 인젝션 취약점 제거 방법

1) 입력 값 필터링

SQL 쿼리문에 사용될 수 있는 특수문자 (', ", --, ;, #, /*, */ 등)를 필터링하여 허용하지 않는다.
예를 들어, 로그인 화면의 아이디 입력란에 'or 1=1-- 와 같은 값을 입력해도 SQL 인젝션 공격이 되지 않도록 필터링을 적용한다.

2) 쿼리 문자열의 길이 제한

사용자가 입력할 수 있는 값의 길이를 제한하여, 불필요하게 긴 입력이 쿼리에 사용되지 않도록 한다.

3) 허용되지 않는 문자열 필터링

SQL 쿼리문에서 사용될 수 있는 위험한 문자열 (예: @variable, @@variable, print, set, or, union, and, insert, openrowset 등)을 필터링한다.

4) 오류 메시지 숨기기

데이터베이스 오류 메시지나 상세한 에러 정보를 사용자에게 직접 노출하지 않는다. 오류 메시지가 공격자가 데이터베이스 구조를 파악하는 데 사용될 수 있기 때문이다.

5) 데이터베이스 사용자 권한 제한

웹 애플리케이션이 사용하는 데이터베이스 계정에 최소한의 권한만 부여한다.

6) 위험한 확장 프로시저 제거 (MS-SQL의 경우)

  • MS-SQL 데이터베이스를 사용하는 경우 master..xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask 등의 확장 프로시저를 제거하여 운영체제 명령 실행, SQL 인젝션 공격에 악용되지 않도록 한다.
    7) 입력값 선처리 (서버 측 필터링 사용)
    8) 특수문자와 SQL 예약어를 필터링하거나, 역슬래시()를 공백 문자로 치환하는 등의 입력값 선처리 과정을 서버 측에서 처리한다.
    9) 모든 필터링 및 유효성 검사는 클라이언트 측 스크립트(JavaScript 등)가 아닌 서버 측 스크립트를 통해 이루어져야 한다.
    10) 준비된 쿼리(Prepared Statements) 및 ORM 사용

 


1.3 크로스사이트 스크립팅

크로스사이트 스크립팅 (XSS) 취약점은 악성 스크립트를 홈페이지 게시판, 이메일 등을 통해 유포함으로써 사용자가 해당 게시물이나 메일을 클릭했을 때 악성 스크립트가 실행되게 하는 취약점이다.
JSP에서는 replaceAll()함수를 이용해서 스크립팅 취약점을 제거할 수 있다.


 

1.4 크로스사이트 요청 변조

크로스사이트 요청 변조(CSRF) 취약점은 로그인한 사용자 브라우저로 하여금 사용자의 쿠키와 기타 인증 정보를 포함하는 위조된 HTTP 요청을 웹 애플리케이션에 전송함으로써 타인의 쿠키 값이나 세션 정보를 의도한 사이트로 보내거나, 전송 값을 글에 삽입함으로써 정상 사용자가 해당 게시물 등을 클릭할 때 홈페이지에서 같은 동작이 반복적으로 일어나게 하는 취약점이다.

 


1.5 파일 업로드

파일 업로드 취약점은 첨부 파일을 업로드할 수 있는 게시판에 일반적으로 허용된 파일 이외에 악의적인 스크립트가 포함된 소스 파일등을 업로드해 실행시킬 수 있는 취약점이다.

 


1.6 파일 다운로드

파일 다운로드 취약점은 웹 애플리케이션에서 상대 경로를 사용할 수 있게 설정돼 있는 경우 상대 경로 표시 문자열인 '../'를 통해 허가되지 않은 상위 경로로 이동해 시스템의 주요 파일이나 소스 파일 등에 접근해 파일을 다운로드하는 취약점이다.

 


 

 

위 글은 백승호 저자의 '웹 개발자와 서버 운영자를 위한 웹 해킹과 보안 설정 가이드'를 읽고 작성되었습니다!

반응형

'보안' 카테고리의 다른 글

[웹 해킹과 보안 설정 가이드] 2장: 잘못된 보안 설정  (1) 2024.09.18