시큐어코딩

개발보안 취약 사례 및 대응방안 - 2

메오백 2024. 12. 4.

지난 글에 이어서 sql injection과 xxs등 이외 최약 사례에 대해 알아보자. 

sql injection

sql injection은 db 질의와 관련된 웹 파라미터에 악성 sql을 주입해 db, 서버를 공격하는 것이다. 

여러가지 종류가 있는데, 하나씩 확인하며 이해해보자.

sql injection 종류

error based sql injection

웹 페이지 응답 데이터에 dbms error message가 응답될 때 할 수 있는 공격 기법이다. 

dbms 에러를 유발할 수 있는 입력값을 입력하고 에러 메세지를 통해 정보를 탈취한다. 

blind sql

sql where 절 조건이 true일때와 false 일 때 응답값 유무를 확인해 취약점을 찾고 추가적인 공격을 통해 데이터를 얻는 방식이다. 

select *
from user
where id = 'adcd' and (~~ pw 등 추가 조건);

공격자가 예상하는 로그인 쿼리가 위와 같다고 해보자. 그리고 공격자가 admin 이라는 id가 존재하는 것을 아는 상황이다.

select *
from user
where id = 'admin' and 1=1#' (~이하는 주석처리됨)
-> 응답값 O

select *
from user
where id = 'admin' and 1=2#'
-> 응답값 X

공격자는 id 입력란에 admin' and 1=1# 값을 대입한다. # 이하는 주석처리되므로 where 절이 true and true 가 된다. 이 때 응답값이 있는 것을 확인한다. 다음에는 admin' and 1=2# 값을 대입해서 true and false 조건으로 false가 되었고 이 때 응답값이 없는 것을 확인한다. 즉 true, false 전달하는 것에 따라 응답값 유무가 달라지고 이것이 공격포인트가 된다. 

select *
from user
where id = 'admin' and substring((select database()), 1, 1)='o';
-> 데이터베이스명 추출 

select *
from user
where id = 'admin' and substring((select table_name from information_schema.tables where table_schema='openeg' limit 0, 1),1,1)='b';
-> 테이블 명 추출

공격포인트에 의한 실제 공격은 위와 같이 이루어진다. (mysql 예시)

id값에 데이터베이스 시작 글자가 o 라면 true인 조건을 전달해 응답값의 유무를 통해 데이터베이스 이름을 한 글자씩 알아내는 것이다. 

데이터베이스 명을 알았으면 같은 방법으로 테이블 명도 알아낸다. 

물론 한 글자씩 대입해야 하기 때문에 수동으로 하는 것이 아닌 burpsuite 같은 도구로 a,b,c,~~,z 에 대해 요청을 보내고 혼자 응답 length가 긴 것이 (true 일 경우 응답값이 있는 것이므로) 정답이 된다. 

이런 식으로 데이터베이스, 테이블, 컬럼 값 등을 알아내 쿼리를 작성해서 공격할 수 있다. 

조치방법 

조치 방법은 간단하다. 쿼리 작성 시  native sql이 아닌 prepared statement를 쓰거나 spring의 경우 쿼리 작성 시 mybatis등을 사용해서 방지할 수 있다. 

XSS

사용자가 웹 사이트에 접근하는 순간 인지하지 못하는 스크립트(자바 스크립트와 같은 스크립트 코드)가 실행되어 개발자가 고려하지 않은 기능(DBD(Drive-by Download), 피싱 사이트 이동, 사용자 세션 탈취, 개인정보가 유출)이 작동하게 할 수 있는 취약점이다. 

Hello”><sciprt>alert(‘xss’);</script>

게시물 내용을 위와 같이 작성하면 게시물 조회 시 alert 창이 표시되는 것을 공격자가 확인하고 공격포인트로 삼는다. 

공격자는 악성 script가 포함된 url로 강제접속되도록 글을 작성한다. 사용자가 게시물을 조회하면 url에 강제접속되고 url에 있는 악성 스크립트가 실행되어 공격한다. 

reflected xss, stored xss등으로 나뉘지만 의도하지 않은 악성 script가 실행되게 하여 공격한다는 점은 같다. 

조치방안

Spring

  • lucy-xss-servlet-filter를이용하여XSS 입력 값 필터링
    • 사용 방법 : JSTL 태그를 이용하여 XSS 출력 값 인코딩

공통

  • XSS 공격 패턴에 사용되는 특수문자를 치환한다. 

  • XSS 공격에 사용되는 이벤트 핸들러를 미사용 시 제한한다.
  • XSS 공격에 사용되는 HTML 태그 목록이 서비스 이용에 필요하지 않을 경우 입력 제한한다. 

검증되지 않은 URL Redirection

burpsuite와 같은 도구로 forwarding 되는 url을 조작하여 사용자를 악성 사이트로 접속시키는 공격이다. 

예를 들어 리다이렉션 되는 기능이 있는 페이지에 접속할 때 리다이렉션 url 값을 악성 사이트로 바꿔 정보를 탈취하는 것이다. 

조치 방안 

@RequestMapping(value="/test/forward_test.do", method = RequestMethod.POST)
public String testForwarding(HttpServletRequest request,HttpServletResponse response){
String allowURL[] = {"http://www.naver.com", "http://www.nate.com", "http://www.daum.net"};
String url=request.getParameter("data");
try {
for(int i=0; i<allowURL.length; i++){
if(url.equals(allowURL[i])){
response.sendRedirect(url);
break;
}
} catch (IOException e) {
return "redirect 테스트 오류";
}

검증되지 않은 url로 리다이렉션 되지 않도록 리다이렉션 url을 white list로 관리한다. 

악성 파일 업로드

  • 파일 업로드 모듈을 통해 Server-Side Script 파일(WebShell) 업로드가 가능할 경우, 시스템 장악을 통해 시스템에 연결된 모든 시스템에 악성코드를 감염시킬 수 있고 DB 내 저장되어 있는 개인정보를 유출시킬 수 있는 취약점이다.
    •  WebShell : 파일 업로드 취약점을통하여시스템 명령어를 사용할수 있는 파일
  • 게시판 파일 업로드 등에 파일 확장자 제한이 없어 php, jsp, asp

공격 시나리오

  • 게시판의 파일 업로드 모듈에 server side script 파일 업로드 
<?php
system(‘cat /etc/passwd’);
?>

 

  • 브라우저를 활용해 파일 업로드 경로로 직접 접근해 파일을 실행시킨다. 

  • 또는 파일 확장자 제한이 js에 구현되어 있다면 js를 조작해 파일 확장자 체크 로직을 jsp를 업로드 할 수 있도록 바꿔버리고 업로드한다. 

조치방안 

  • content-type 제한 : 허용 하려는 파일 외 content-type은 실행 제한 
  • 업로드 파일이 웹 브라우저에서 실행되지 못하게 파일 디렉터리 실행 권한 제한 (읽기,쓰기만 허용)
  • white-list 기반으로 허용된 파일만 업로드 되도록 구현 
  • 업로드 파일 사이즈 제한
  • 업로드 파일 디렉터리기 노출되지 않도록 구현 
  • 업로드 파일명 난수값으로 변경 
    • 원본 파일명과 변경된 파일명 db에 저장 
    • 난수 파일명을 key로 해 원본 파일명 (파일위치) 탐색 
  • 파일 확장자 확인 로직은 server side에 white list 기반으로 구현 
@RequestMapping(value="/write.do", method=RequestMethod.POST)
public String boardWriteProc(@ModelAttribute("BoardModel") BoardModel boardModel, MultipartHttpServletRequest request, HttpSession
session){
String uploadPath = session.getServletContext().getRealPath("/")+"files/";
MultipartFile file = request.getFile("file");
if ( file != null && ! "".equals(file.getOriginalFilename())) {
String fileName = file.getOriginalFilename();
String fileExt = fileName.substring(fileName.lastIndexOf(".")+1, fileName.length());
if (!"jpg".equals(fileExt) && !"png".equals(fileExt)){ //허용하고자 하는 확장자 이외의 업로드 제한
System.out.println("Upload Error"); (WHITE LIST)
return ....
}
File uploadFile = new File(uploadPath+ fileName);
fileName = new Date().getTime() + fileName;
uploadFile = new File(uploadPath + fileName);
file.transferTo(uploadFile);
boardModel.setFileName(fileName);
}

파일 다운로드

파일 다운로드 모듈의 웹 파라미터를 조작하여 시스템 파일, 웹 소스코드 등을 다운로드 하는 취약점. 일반적으로 디렉터리 트레버셜(../) 문자열을 활용하여 시스템 파일을 다운로드

공격 시나리오

  • 파일 다운로드 시도 
  • js상에서 다운로드 하는 파일 경로를 /etc/password 등으로 좢ㄱ 
  • 중요 파일 다운로드 해 정보 탈취 

조치방안

  • 웹 파라미터에 파일 다운로드에 사용되는 특수문자가 사용되지 않게 필터링 적용 
  • 허용된 파일만 다운로드 할 수 있게 server side에서 white list로 확장자 리스트 적용 
  • 허용 디렉토리 외 파일은 다운로드 하지 못하도록 디렉토리 접근 권한 제어

출처

- https://beaglesecurity.com/blog/vulnerability/error-based-sqli.html

 

Error based SQL Injection

Error-based SQL injection is a type of security vulnerability and attack that occurs when an attacker injects malicious SQL statements into a web application's input fields, causing the application to generate SQL errors.

beaglesecurity.com

- 개발자를 위한 보안 실무 (kt ds university) 

- https://4rgos.tistory.com/1

 

XSS(Cross Site Scripting) 공격이란?

XSS 란? 웹 해킹 공격 중 XSS라는 공격 기법이 있다. Cross Site Scripting의 약자로 CSS라고 하는 것이 맞지만 이미 CSS가 Cascading Style Sheets의 약어로 사용되고 있어 XSS라 한다. XSS는 게시판이나 웹 메일 등

4rgos.tistory.com

 

'시큐어코딩' 카테고리의 다른 글

https 취약점  (0) 2024.12.01
개발보안 취약 사례 및 대응 방안 - 1  (0) 2024.11.24

댓글