2023. 4. 12. 10:44ㆍESG 사업 점검 자료/개인정보 및 저작권 보호 관련
•중국 해킹조직(샤오치잉)은 웹서버 장악 후 홈페이지 변조 또는 DB 내 개인정보를 탈취 후 공개하는 등 실력 과시형 공격 행태를 보이고 있습니다.
•다만, ‘취약점 점검도구’를 실행 후 발견된 취약점을 활용하는 초보적 공격을 수행함에 따라 기본적인 보안조치 만으로도 해킹피해를 예방할 수 있습니다.
• 웹호스팅 업체에 위탁 운영중이던 OOO 홈페이지가 ‘원격접속서비스 활성화 및 취약한 계정정보 사용’으로 해커에 의해 웹서버 장악 후 홈페이지 변조
•해커가 OOO 홈페이지의 OOO 게시판 파일첨부 기능에 ‘파일업로드 취약점’을 악용, 웹서버를 장악 후 홈페이지 변조 및 DB內 개인정보 탈취
• 외부에서 FTP, SSH, Telnet, 윈도우터미널, VNC 등 원격접속서비스 차단 및 계정정보 일제 점검을 통해 유추할 수 있거나 초기 설정된 패스워드 변경 등 보안강화
* 기관 자체 보안장비(방화벽 등)를 운영하는 경우 모니터링 강화 및 일체 점검
•✔파일 업로드 ✔파일 다운로드 ✔SQL-Injection ✔WAS서버 및 웹관리자 페이지 외부노출 등 중대 웹취약점 일제 점검 후 확인된 취약점 개선조치
* 웹ㆍWASㆍDB 등은 취약점이 내재된 구버전 사용금지 및 최신 버전으로 업데이트ㆍ보안패치 실시
• 서버 백신 미설치 시, 반드시 설치 후 점검하여 정보자산 보호 강화
(점검방법)
• 외부에서 ‘포트스캐너’(superscan, netsacan 등)를 활용하여 웹서비스를 위한 80, 443 포트 외 불필요 포트가 열려있는지 확인하거나 방화벽 설정정보 확인
• 특히, 21(FTP), 22(SSH), 23(Telnet), 512(rsh), 513(rexec), 514(rlogin), 3389(윈도우터미널), 5800(VNC) 포트 등 원격접속서비스 활성화 여부 집중 점검
(보안대책)
• 홈페이지 운영 시 필요한 80, 443 포트 외 불필요한 포트 오픈 유무 확인 및 반납 조치
• 서버에서 불필요한 또는 사용하지 않는 원격접속서비스는 비활성화
(점검방법)
•개별사용자 및 공용 정보시스템 관리자들에게 ‘서울대학교 정보보안 기본지침 제57조(비밀번호 관리)’에 따라 비밀번호가 설정되어 있는지 확인토록 공지
(보안대책)
• 패스워드는 숫자ㆍ문자ㆍ특수문자 등을 혼합하여 안전하게 설정하고 정기적으로 변경ㆍ사용하는 것을 원칙으로 하고 아래 사항에 유의
- 사용자 계정(아이디)과 동일하지 않을 것
- 개인 신상 및 부서 명칭 등과 관계가 없을 것
- 일반 사전에 등록된 단어의 사용을 피할 것
- 동일한 단어 또는 숫자를 반복하여 사용하지 말 것
- 사용된 비밀번호는 재사용하지 말 것
- 동일한 비밀번호를 여러 사람이 공유하여 사용하지 말 것
- 응용프로그램 등을 이용한 자동 비밀번호 입력기능을 사용하지 말 것
(개요)
•대부분의 웹사이트에 제공하는 게시판, 프로필 페이지 등과 같이 파일을 업로드 기능을 가진 서비스에서 존재한다. 업로드 기능을 이용하여 공격자는 악의적인 목적으로 제작한 파일을 업로드하여 웹 서버 내 기밀정보에 접근하거나 악성코드를 유포하는 등의 공격 수행
( 취약형태 )
•공격자는 공격 대상 웹사이트 게시판의 파일 업로드 기능을 이용하여 자신이 제작한 파일 업로드 가능하다. 파일이 업로드 된 경로를 유추한 다음 해당 경로에 접근하여 파일을 실행하여 공격을 수행한다.
•서버 쉘 권한을 획득하고 시스템 명령어를 실행한 후, 그 결과를 웹 브라우저를 통해 보여주는 코드를 작성했다면 시스템 관리자 권한 획득, 기밀정보 조회, 인근 서버의 침입 등의 공격 수행이 가능하다. 파일 업로드 취약점은 악성코드 유포에도 빈번하게 활용된다.
( 점검방법 )
- 웹쉘은 웹 서버에 원격으로 접속하여 쉘을 사용하듯 명령을 수행하고, 그 결과를 볼 수 있도록 하는 스크립트 파일이며 웹쉘 파일은 웹 서버측에 존재해야 하며, 사용자는 웹 브라우저에 웹쉘 파일경로를 입력함으로써 실행 가능한다.
- 일단, 웹쉘이 실행되면 웹 서버를 자유자재로 제어할 수 있기 때문에 웹 페이지 소스 코드 열람, 서버 내 자료 유출, 백도어 프로그램 설치, 악성코드 유포, 시스템 관리자 권한 획득 등 매우 다양한 공격 가능하다.
- 본 예제에서는 웹쉘을 통하여 홈페이지 구현 소스 내용을 열람하는 방식으로 데이터베이스 로그인 정보를 획득한 후, 해당 정보로 데이터베이스에 접속하여 사용자 정보 조회를 수행한다.
- 본 예제에서는 잘 알려진 웹쉘인 ‘r57shell.php’ 사용한다. ‘r57shell.php’는 PHP 환경에서 동작하는 웹쉘로서, 단순히 터미널 환경을 구현해 주는 것뿐만 아니라 서버 정보, 상태 및 사양 등 조회가 가능하다. 또한, 다양한 데이터베이스를 지원하며, 데이터베이스 조회 및 제어 가능
- [그림]과 같이 게시판을 작성하면서 ‘r57shell.php’ 파일을 업로드하고 업로드가 잘 되었는지 확인한다.
- 이후 [그림]와 같이 파일 업로드 경로를 유추하여 브라우저 주소창에 경로를 입력하여 웹쉘을 실행한다.
- 파일 업로드 경로가 올바르고, 업로드된 파일에 실행권한이 있다면, 웹 서버에서 웹쉘이 실행되어 [그림]와 같이 브라우저에 실행된다.
- 초기화면에 ‘r57shell.php’ 파일이 저장된 경로와 해당 경로에 존재하는 파일이 모두 출력됨을 확인한다.
- ‘Execute command on server' 메뉴에서는 일반적인 쉘 명령어를 입력하여 그 결과를 확인할 수 있으며, 따라서 [그림]과 같이 'ls /'을 입력할 경우 [그림]처럼 시스템 루트 디렉터리 확인이 가능하다.
- 홈페이지의 루트 디렉터리 내 파일 구성을 조회하기 위하여 다음 명령을 입력하면 [그림]처럼 ‘/var/www'내 파일 구성 확인이 가능하다.
- ‘db_func.php’ 파일의 이름으로부터 데이터베이스와 관련되어 있음을 유추할 수 있으므로 이 파일을 열람한다. ‘Php Bypass’ 메뉴의 ‘Read File' 서브 메뉴 입력창에 파일의 경로를 입력하면 해당 파일의 내용을 열람할 수 있다.
- PHP 언어에서 ‘mysql_connect()’ 함수는 데이터베이스에 접속하기 위하여 계정정보를 파라미터로 입력받으며, 다음과 같은 형식으로 표현된다.
mysql_connect(데이터베이스 주소, 계정 아이디, 계정 비밀번호); |
- 또한 PHP 언어에서 ‘mysql_select_db()’ 함수는 사용할 데이터베이스를 선택하는 기능을 제공하며, 다음과 같은 형식으로 표현된다.
mysql_select_db(데이터베이스 명); |
- 따라서 공격 대상 웹 사이트에서는 아이디 'root'와 비밀번호 '1q2w3e4r'로 데이터베이스에 접속이 가능하며 사용하는 데이터베이스는 'hack_test' 라는 이름의 파일 보유 확인이 가능하다.
- ‘Databases' 메뉴는 [그림 48]처럼 다양한 기능을 가진 데이터베이스 관련 서브 메뉴를 제공하는데, 본 예제에서는 'Run SQL query' 서브 메뉴를 사용하여 특정 질의문을 데이터베이스에 전달하여 원하는 정보 획득이 가능하다.
- 파일 업로드 기능 구현 시 아무런 확장자도 검사하지 않은 경우나 일부 확장자만을 검사하는 경우에 악의적인 사용자가 악성 웹 스크립트 파일을 업로드하여 공격 가능하다. 따라서 ‘html, php’ 등과 같이 웹 스크립트로 인식될 수 있는 확장자를 갖는 파일 업로드를 제한하는 기능 보유 여부 확인이 필요하다. [그림]과 같이 파일 업로드 기능이 있는 페이지에서 웹 스크립트 확장자를 갖는 파일을 업로드 했을 때 경고창이 뜨고 업로드가 취소되어야 한다.
- 웹 스크립트 파일 업로드가 가능하더라도, 업로드 경로를 유추할 수 없으면 해당 스크립트 실행이 불가하다. 하지만 대부분의 경우 편의를 위하여 파일 업로드 경로에 게시판 이름과 동일하거나 비슷한 디렉터리 명을 사용함으로 이에 대한 확인이 필요하다.
- 특히, 홈페이지 루트 디렉터리 내에 파일 업로드 디렉터리가 위치하지 않도록 분리시키는 것이 중요하다. 앞서 살펴본 공격 예제의 경우 홈페이지 루트 디렉터리인 ‘/var/www/' 경로에 속한 디렉터리에 파일이 업로드되어 공격자가 쉽게 업로드된 파일 경로를 유추하여 공격이 가능하다.
- 웹 스크립트 파일 업로드가 가능하더라도, 웹 서버 내에 저장될 파일 명을 임의로 생성하여 저장하면 해당 스크립트 실행이 불가하다.
- [그림]처럼 'Cloud.png'와 같은 일반적인 파일명을 가진 파일을 업로드한 후 웹 서버의 업로드 경로에 저장되는 파일 명을 확인하였을 때 [그림 51]과 같이 임의의 이름으로 변경되면 안전하다고 판단한다.
( 조치방법 )
가. 업로드 파일의 확장자 필터링
- 업로드 가능한 파일의 확장자만을 허용하는 확장자 필터링 기법을 적용한다. 확장자 필터링은 클라이언트 측에서 동작하는 스크립트가 아닌, 반드시 서버 측에서 동작하는 언어로 필터링 (PHP,JSP,ASP 등)을 수행한다.
- PHP에서는 ‘explode’ 함수를 통하여 확장자명만 추출해 내고 ‘in_array’ 함수를 이용하여 허용 확장자 목록과 비교하는 코드를 쉽게 작성이 가능하다.
$file = 파일명 ; $spllit_fname = explode(".", $file); $ext = $split_fname[count($split_fname)-1]; if( !in_array(strtolower($ext), array("jpg", "ppt", "hwp", "doc", "txt"))){ echo " <script>alert('bad file extension[".$ext."]'); history.back(1); </script> "; die(); } |
- 업로드 가능 확장자 필터링 적용이 불가피한 경우에는 차단할 파일 확장자 목록을 구성하고 서버에서 웹 스크립트 파일로 인식될 가능성이 있는 모든 확장자를 포함한다. 업로드 되는 파일의 확장자를 검사할 때는 반드시 확장자를 대문자 또는 소문자로 일괄변경한 뒤에 검사한다.
html, htm, php, php2, php3, php4, php5, phtml, pwml, inc, asp, aspx, ascx, jsp, cfm, cfc, pl, bat, exe, com, dll, vbs, js, reg, cgi, asis, sh, shtml, shtm, phtm... |
- 확장자를 조작하는 방식으로 확장자 필터링을 우회할 가능성이 존재하므로, 파일 헤더를 검사하여 파일 형식에 대한 정확한 판별을 수행한다.
if($_FILES["board_input_file"]){ $file = $_FILES["board_input_file"]; $fp = fopen($file["tmp_name"], "rb"); $file_hdr = fread($fp, 2); $file_hdr_hex = bin2hex($file_hdr); fclose($fp); if(!in_array($file_hdr_hex, array("ffd8", "8950", "4d42", "4749", "504b", "d0cf", "2550", "31be", "cf11"))){ echo "<script>alert('bad file type');history.back(1);</script>"; die(); } ... |
- 업로드 된 파일이 웹 서버에 저장되는 경로를 유추하기 어렵도록 설정한다. 업로드 된 파일과 경로는 웹 소스 상에서 노출되지 않도록 설정한다. 업로드 된 파일이 저장되는 디렉토리는 홈페이지 루트 디렉토리보다 상위에 존재하여야 하며, 파일의 실행권한이 없도록 설정한다.
- 업로드 된 파일이 기존의 이름 그대로 저장되지 않도록 임의의 파일명을 생성하는 메커니즘을 사용한다. 파일명을 생성할 때 숫자 또는 인코딩된 문자열 같은 유추가 불가능한 이름으로 생성하고 확장자를 제거하거나 임의로 변경 가능하도록 설정한다.
- 아래와 같은 메커니즘으로 파일명을 생성하면 '1339441512. upload'와 같이 예측하기 힘든 파일명으로 웹 서버 내에 저장한다.
$tmp = explode(" ", microtime()); $new_name = $tmp[1].".upload"; $move_upload_file(업로드한 파일, "업로드 디렉터리 경로/“.$new_name); |
( 개요 )
• 파일 다운로드 취약점은 악의적인 사용자가 웹 애플리케이션 취약점을 이용하여 웹 서버에 있는 파일을 다운로드 받을 수 있는 취약점이다. 파일 다운로드 취약점으로 인해 웹 서비스를 구성하는 소스 파일 및 시스템 파일, 사용자 계정 파일 등이 노출될 경우, 이를 이용한 2차 공격 수행 가능하다.
( 취약형태 )
• 대부분의 웹 애플리케이션 개발자는 파일 다운로드 기능 구현 시에 해당 기능을 담당하는 파일을 별도로 생성하고, 그 경로로 다운로드 받고자 하는 파일명을 파라미터로 전달하게 하여 다운로드를 수행한다. 이러한 취약점을 이용하여 공격자는 웹 서버 내에 존재하는 임의의 파일 다운로드가 가능하며 파일 명에 해당하는 파라미터에 원하는 파일의 경로 및 파일 명을 삽입하는 방식으로 파일 경로와 상관없이 다운로드가 가능함으로 매우 위협적이다.
( 점검방법 )
- 많은 웹 페이지가 <표 8>과 같이 URL에 다운로드 받고자 하는 파일명을 파라미터로 붙이는 형식으로 파일 다운로드 기능을 제공한다.
http://웹서버 주소/download.php?file=파일명 |
- [그림]의 예제 웹 사이트에서는 ‘file_download.php‘ 파일이 다운로드 기능을 제공하며, 파라미터 명 'path'로 다운로드 받고자 하는 파일명을 인자로 전송한다.
- 다음과 같이 공격 문자열을 작성하여 주소창에 입력하면, 웹 서버 내 사용자 계정 정보 획득이 가능하다.
http://웹서버 주소/file_download.php?path=../../../etc/passwd |
- 다운로드한 파일을 문서 편집기로 열어 보면 [그림 35]과 같이 웹 서버의 사용자 계정 정보를 확인할 수 있다.
- 웹 사이트의 시작 페이지의 이름은 대부분 ‘index.html’ 혹은 ‘index.php’이므로, 이를 다운로드한 후 분석하여 2차 공격 수행 가능하다. 본 예제에서는 다음과 같이 주소창에 입력하여 ‘index.php’를 다운로드한다.
http://웹서버 주소/file_download.php?path=../index.php |
- 다운받은 index.php을 살펴보면 또 다른 웹 애플리케이션 소스 파일 경로를 확인할 수 있으며 [그림]에서 가장 먼저 등장하는 ‘board/board_index.php’를 다운받아 계속 분석을 진행한다.
- 다음과 같은 문장을 주소창에 입력하여 ‘board_index.php’ 파일을 다운로드한 후에 살펴보면 [그림]의 2)와 같이 데이터베이스 질의문이 등장함을 볼 수 있으며, 따라서 가장 첫 문장 1)에 나오는 ‘db_func.php’가 데이터베이스 연결과 관련된 파일임을 예측 가능하다.
http://웹서버 주소/file_download.php?path=../board/board_index.php |
- 앞서 설명한 방식을 이용하여 ‘db_func.php’를 다운로드 받아 내용을 열람해 보면 [그림]과 같다.
- 웹 소스파일 내의 PHP의 데이터베이스 관련 함수인 ‘mysql_connect’와 ‘mysql_select_db’에 입력된 인자를 확인하여 웹 서버 내 데이터베이스 계정 정보(아이디 : root, 패스워드 : 1q2w3e4) 와 사용 데이터베이스 명(hask_test) 획득이 가능하며 데이터베이스 사용자 계정 정보를 획득하였으므로 데이터베이스 원격 접속 툴을 사용하면, 웹 서버 내의 데이터베이스에 연결하여 정보 유출 및 조작 가능하다.
- 파일을 다운로드받는 부분에서 웹 소스 또는 스크립트 소스를 확인하여, 파일 경로 또는 파일명의 직접 노출 여부를 검사한다. 파일 경로나 파일명이 노출되어 있으나, 알 수 없는 문자열로 인코딩 또는 암호화되어 있으면, 인코딩이나 암호화 방식을 검사한다.
- 인코딩 방식을 찾은 경우에는 파일 경로 또는 파일명을 조작하여, 파일 다운로드 취약점 점검을 계속 진행하며 파일 경로 또는 파일명이 암호화 되어 있는 경우에는 해당 서버 내에 사용자 입력 값을 동일한 암호화 함수로 사용하는 부분을 검색하여 찾고, 동일한 암호화 함수를 사용하는 부분을 이용하여 파일 경로와 파일명을 조작하여 파일 다운로드를 시도해본다.
- 파일 다운로드 기능이 POST 방식을 사용하는 경우에는 로컬 웹 프락시 도구를 사용하여 조작하거나 또는 웹 서버 스크립트에서 폼 관련 부분을 가져와서 HTML 파일로 만든 다음 조작된 웹 요청을 생성한다.
- 파일을 다운로드하는 요청이 인자값을 숫자로 사용하는 경우에는 숫자값을 양수, 음수, 매우 큰 수로 다양하게 변조하여 접근할 수 없는 파일 또는 웹 서버 에러를 유발하는 방법 등을 시도한다.
( 조치방법 )
- 파일명이 아닌 다른 참조 값으로 파일을 다운로드 받을 수 있도록 로직을 구성한다. 요청 메시지로부터 게시판 ID 및 게시물의 번호를 넘겨받아 데이터베이스로부터 해당 게시물이 존재하는 파일명을 추출한다.
- 예들 들어 filedown.php?BoardNo=13&No=2345&file=2 와 같이 게시판(BoardNo)와 글번호(No) 첨부된 파일 번호(file)를 지정하고 매칭되는 파일경로를 데이터베이스로부터 추출하여 파일을 다운로드 한다. (파라미터 값은 int(숫자형)만 허용)
<? // 데이터 베이스 연결 include "db_func.php"; // 요청 메시지 인자로 부터 게시판 ID와 게시물 번호를 받음 $board_id = $_POST["board"]; $content_num = $_POST["num"]; // 데이터베이스에서 게시판 ID에 해당하는 게시판 테이블로부터 // 게시물 번호로 식별되는 게시물의 파일명을 획득함 $file_sql = "SELECT `file` FROM `board_".$board_id."` WHERE `id` = ".$content_num; $file_res = mysql_query($file_sql); $file_data = mysql_fetch_assoc($file_res); $file_name = file_data["file"]; // 파일이 존재하는 디렉터리 경로와 파일명을 합쳐 // 온전한 파일 경로를 생성 $DownloadPath = "board/".$board_id."/".$file_name; // 파일을 열어서 응답 메시지에 넣고 전송 Header("Content-Type: file/unknown"); Header("Content-Disposition: attachment; filename=".$file); Header("Content-Length: ".(string)(filesize($DownloadPath))); Header("Content-Transfer-Encoding: binary "); Header("Pragma: no-cache"); Header("Expires: 0"); if ($fp = fopen($DownloadPath, "rb")) { while(!feof($fp)){ echo fread($fp, 100*1024); } } fclose($fp); flush(); ?> |
- 파일 다운로드 방식에서 인자를 “파일명이 아닌 다른 참조 값 사용” 방법을 사용하지 못할 경우에는 파라미터 경로를 검사하여 디렉터리를 변경할 수 있는 패턴을 필터링한다. ASP의 경우, 다운로드 가능한 절대 경로를 사전에 정의해 놓고 파일이름에 삽입되는 디렉터리 이동패턴을 검사하는 로직 구성이 가능하다.
<% file = Request.Form("file") strFile = Server.MapPath("./upfiles/") & "\" & file strFname = Mid(Fname, InstRev(file, "\") + 1) strFPath = Server.MapPath("./upfiles/") & "\" & strFname If StrFile = strFPath Then ... |
- PHP의 경우 정규표현식을 통해 파일명에 특수 문자 삽입 여부 검사가 가능하다.
<? if(preg_match("/[^a-z0-9_-]/i", $upload_dir)) exit; if (preg_match("/[^\xA1-\FEa-z0-9._-]|\.\./I", urdecode($dn_file_name))) exit; ... |
- JSP에서는 equalsIgnoreCase 함수를 사용하여 디렉터리 이동 패턴을 차단할 수 있다.
<Script> String UPLOAD_PATH="/upload"; String filename = response.getParameter("filename"); String filepathname = UPLOAD_PATH + filename; if(filename.equalsIgnoreCase("..") || filename.equalsIgnoreCase"/")) ... |
•SQL 인젝션 취약점은 신뢰할 수 없는 데이터가 명령어나 질의문의 일부분으로서 인터프리터로 보내질 때 발생한다. 공격자의 악의적인 데이터는 예상하지 못하는 명령을 실행하거나 적절한 권한 없이 데이터에 접근하도록 인터프리터를 속일 수 있다.
(개요)
•로그인 부분에서 데이터베이스 질의처리 시 SQL 질의문의 구현이 부적절할 경우 질의문을 조작할 수 있는 입력을 통해 사용자 및 관리자 권한을 획득할 수 있는 취약점이다.
(취약 형태)
•홈페이지 로그인 인증 기능 구현 시 입력 값 검증을 하지 않는 경우 취약하며, 인증처리를 위한 SQL 질의문 구조가 아이디와 패스워드를 AND 연산을 통해 한 번에 질의하는 경우 더욱 위험하다.
※ 아이디와 패스워드를 AND 연산을 통해 한번에 질의하도록 구현한 예 SELECT * FROM member_table WHERE user_id=’$id’ AND user_pw=’$password’ |
•공격자는 신청인의 인터넷접수번호를 알지 못하더라도 ’or‘ 1’=’1 라는 악의적인 값을 입력함으로써 로그인이 가능하다.
SELECT신청인명, 접수번호 FROM user_table WHERE 신청인명 =‘test’AND 접수번호 =‘1’OR‘ 1’=‘1’ |
•이 경우 구문의 WHERE 절은 “True AND False OR True”로 전체구문이 “True”가 되어 사용자 인증 모듈을 우회하여 로그인이 가능하게 된다. 이는 웹 프로그램이 사용자 입력 값을 적절하게 검증하지 않아 발생한 것이다.
(점검방법)
•SQL Injection 취약점 점검 첫 번째 대상은 로그인을 위한 아이디, 패스워드를 입력란부터다. 먼저 아이디 입력란부터 점검을 해야 하는데 [그림 1]에 ①처럼 먼저 ‘ 문자열을 입력해서 오류 페이지가 발생하는지 점검한다. 0x80040E14 에러가 발생한다면 취약점이 존재하는 것으로 소스를 수정할 필요가 있다.
•만약 취약점이 존재하더라도 에러페이지가 발생하지 않도록 해 취약점을 확인할 수 없는 경우가 있으므로 ②번과 같이 [표 1]에 있는 문자열들을 입력해 아이디 검사를 우회할 수 있는지 점검해야 한다. 다음은 패스워드 입력 부분을 점검하는데 아이디 테스트처럼 ‘를 입력하는 것부터 같은 순서로 하되 ③번과 같이 본인이 알고 있는 아이디나 추측되는 아이디를 함께 [표 1]와 같은 인젝션 문구를 입력해 패스워드 없이 로그인이 되는지 확인해야 한다.
“or 0=0 -- | or 0=0 -- | ‘ or 0=0 # | “ or 0=0 # | or 0=0 # | ‘ or ’x’ = ‘x | “or ”x“=”x |
‘) or (’x’=’x | ‘ or 1=1-- | “ or 1=1-- | or 1=1-- | hi“)or(”a“=”a | ‘ or a=a-- | “ or ”a“=”a |
‘) or (’a’ = ‘a | “) or (”a“=”a | hi“ or ”a“=”a | hi“ or 1=1 -- | hi’ or 1=1-- | hi’ or ‘a’=’a | hi’) or (‘a’=’a |
(조치방법)
•데이터베이스 질의문에 사용자 입력 값을 사용할 경우 입력에 대한 데이터 타입 및 길이를 정확히 제한하고 악의적인 특수문자에 대한 검증을 수행하여야 한다.
※데이터베이스 질의문 입력 값 검사 시 제한해야 하는 패턴 · /, *, --, “, ‘, (, ), #, =, <, >, @, . ; 등 |
•로그인 기능 구현 시 아이디를 통한 질의 결과로 구해진 패스워드와 사용자가 입력한 패스워드를 비교하는 방법으로 구현하여야 한다.
※로그인 기능 구현 시 질의결과로 구해진 패스워드와 사용자가 입력한 패스워드간의 비교 예 SELECT user_pw FROM member_table WHERE user_id=’$id’ 위 질의결과로 얻은 user_pw와 사용자가 입력한 $password가 동일한지 비교하여 인증수행 |
•또한 [표 2]와 같은 문자열을 추가적으로 점검해 보아야 한다.
필터링 대상 | |||
‘or 1=1;-- | or 1=1-- | ‘)or(’a’=’a | + or 1=1- - |
‘’ or 1=1-- | ‘or ’a’=’a | sql’ or 1=1- - | “ |
“or 1=1 -- | “ or ”a“=”a | sql’ or 1=1-- | ‘ |
(개요)
•웹 스크립트에서 데이터베이스 질의 처리 중 에러 발생 시 상세한 에러정보를 노출하여 악의적인 사용자가 에러정보를 통해 데이터베이스 내 데이터를 열람하거나 SQL 인젝션 공격 성공률을 높여줄 수 있는 취약점이다.
(취약 형태)
•데이터베이스 질의 처리 중 에러 발생시 관련 에러정보를 화면에 그대로 출력하도록 구현된 경우에 취약하다.
•Union은 2개 이상의 쿼리를 요청하여 결과를 얻을 수 있는 SQL 연산자이다.
•공격자는 이를 악용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 공격자가 원하는 정보를 얻어내는 방식이다.
즉, 결과값이 “True”인 경우와 “False”인 경우를 식별해서 정보를 추출한다.
(점검방법)
•간단한 에러를 유발시키기 위해 ‘(single quote)를 넣어 sql injection에 취약한지를 확인한다.
http://www.ganadashop.com/board_view.asp?num=50’
•전통적인 sql injection에서 이용하는 에러메시지(디버깅정보)를 사용자에게 보여주지 않으므로 blind sql injection을 시도하여 DB정보를 추출하게 된다.
•게시판의 글보기 페이지에서 DB명을 알아낼 때를 알아보면, DB명 중 첫 번째 값이 어떤 문자인지 추출하는 과정이며, 만약 확인 과정에서 자료 값이 일치하면 정상페이지가 출력되고, 아니면 오류페이지가 출력됩니다.
•http://www.ganadashop.com/board_view.asp?num=50 and (select Unicode (substring(db_name(),1)))>100 -> db_name 의 값 중 첫 번째 문자 한글자가 ASCII 값으로 100(알파벳 d)보다 큰 값인지 확인한다.
•http://www.ganadashop.com/board_view.asp?num=50 and (select Unicode (substring(db_name(),1)))<120 -> db_name 의 값 중 첫 번째 문자 한글자가 ASCII 값으로 120(알파벳 x)보다 작은 값인지 확인한다.
•이런 식으로 범위를 줄여서 문자를 순서대로 찾아가게 되는데 SQL 에러정보를 기반으로 동작하는 SQL 인젝션 자동화 도구를 통한 데이터베이스열람도 가능하다.
(조치방법)
•홈페이지에서 데이터베이스 질의문 처리시 발생되는 에러정보가 사용자에게 노출되지 않도록 설정 하여야 한다.
•또한, 데이터베이스 질의문에 사용자 입력 값을 사용할 경우 입력에 대한 데이터타입 및 길이를 정확히 제한하여야 하며 악의적인 특수문자에 대한 문자열검증을 수행하여야 한다.
※데이터베이스 질의문 입력 값 검사 시 제한해야 하는 패턴 · /, *, --, “, ‘, (, ), #, =, <, >, @, . ; 등 |
(개요)
•웹 스크립트에서 데이터베이스 질의처리 시 질의문을 조작할 수 있는 입력을 통해 웹 서버의 특정경로에 파일을 생성하거나 웹 서버 내부에 존재하는 파일을 읽을 수 있는 취약점이다.
(취약 형태)
•데이터베이스 질의문 처리 시 웹 스크립트상에서 사용자 입력 값에 대한 검증 과정 없이 입력 그대로 SQL 질의문으로 전달되는 경우에 취약하다.
(점검방법)
•파일읽기 관련기능이 존재하는 데이터베이스 사용환경(e.g, MySQL)에서 게시판, 우편번호 검색등 입력값에 대한 검증 없이 데이터베이스 질의문이 사용되는 부분에 시스템내부의 파일을 읽는 SQL 질의문을 삽입한다.
•질의문의 결과를 파일로 쓰는 기능이 존재하는 데이터베이스 사용환경(e.g, MySql)에서 시스템 명령 수행하는 웹 스크립트소스를 게시글로 작성 후 SQL 인젝션 공격을 통해 웹 쉘 스크립트를 생성할 수 있다.
※게시된 글의 데이터를 파일로 생성하는 SQL 인젝션 공격의 예 · http://victimserver.com/read.php&document_srl=179708' into outfile '/www/shell.php' %23 ·공격성공시 /www/shell.php 경로에웹쉘파일이생성됨 |
(조치방법)
•데이터베이스 질의문에 사용자 입력 값을 사용할 경우 입력에 대한 데이터 타입 및 길이를 정확히 제한하여야 하며 악의적인 특수문자에 대한 문자열검증을 수행하여야 한다.
※데이터베이스 질의문 입력 값 검사 시 제한해야 하는 패턴 · /, *, --, “, ‘, (, ), #, =, <, >, @, . ; 등 |
(개요)
•시스템명령을 수행하는 기능을 가진 데이터베이스(e.g, MS-SQL)환경에서 데이터베이스 질의처리 시 질의문을 조작할 수 있는 입력을 통해 웹 서버시스템권한을 획득할 수 있는 취약점이다.
(취약 형태)
•MS-SQL 데이터베이스 사용 환경에서 시스템 명령수행이 가능한 확장저장 프로시저 기능을 활성화 시켜놓은 경우에 취약하다.
(점검방법)
•입력 값에 대한 검증없이 데이터베이스 질의문이 사용되는 부분에 악의적인 사용자가 질의문구분자(;)를 이용하여 시스템명령 실행 질의문을 삽입하여 시스템명령을 수행할 수 있다.
※시스템명령(echo)을통해웹쉘파일을생성하는 SQL 인젝션공격 ·http://victimserver.com/bbs/view.asp?id=5;exec%20master.dbo. xp_cmdshell%20'echo%20^<script%20language=VBScript%20 runat=server^> execute%20request^("l"^)^</script^>%20 >c:\cmd.asp';-- |
(조치방법)
•데이터베이스 질의문에 사용자 입력 값을 사용할 경우 입력에 대한 데이터타입 및 길이를 정확히 제한하고 악의적인 특수문자에 대한 검증을 수행하여야 한다.
※데이터베이스 질의문 입력 값 검사 시 제한해야 하는 패턴 · /, *, --, “, ‘, (, ), #, =, <, >, @, . ; 등 |
•불필요한 시스템 명령 수행 및 정보수집이 가능한 확장저장프로시저기능을 데이터베이스 설정을 통해 비활성화 시켜야 한다.
※시스템 명령 수행 및 정보수집에 사용되는 확장 저장 프로시저의 예 xp_cmdshell(쉘명령수행), xp_regread(레지스트리읽기), xp_regwrite(레지스트리쓰기), xp_msver(시스템정보열람), xp_delete_file(시스템파일삭제), xp_dirtree(시스템디렉터리목록보기) 등 |
(개요)
•PHP를 사용하여 구현된 홈페이지에서 SQL 인젝션 공격을 방지하기 위해 PHP의 설정파일에 magic_quotes_gpc 옵션이 설정되어있는 경우 필터링 기능이 적용되지 않는 다른 HTTP 헤더정보를 이용하여 SQL 인젝션 공격을 수행하는 취약점이다.
(취약 형태)
•대부분의 홈페이지에서 사용자 접속기록을 관리하기 위해 사용자의 헤더정보(e.g, 레퍼러, 브라우저정보)를 이용한 데이터베이스 질의문 처리루틴이 존재하지만 따옴표처리를 위한 magic_quotes_gpc 옵션은 GET, POST, Cookie로 전달되는 입력에만 필터링 적용된다.
•따라서 SQL 인젝션 공격에 대한 대응방안으로 magic_quotes_gpc 옵션을 설정한 경우에도 GET, POST, Cookie 를 제외한 다른 헤더값을 이용한 SQL 질의문 처리루틴이 존재하는 경우에 SQL 인젝션 공격에 노출될 수 있다.
(점검방법)
•SQL 인젝션 취약점이 존재하는 헤더필드에 질의문을 조작할 수 있는 입력을 삽입하여 SQL 인젝션 공격을 수행한다
(조치방법)
•본 취약점에 대해 안전하게 조치하기 위해서는 SQL 인젝션 취약점을 방지하기 위한 입력 값 검사 시 GET, POST, COOKIE 방식의 입력 이외에 SQL 질의문에서 사용하는 모든 정보에 대한 입력 값 검증을 하여야 한다.
※데이터베이스 질의문 입력 값 검사 시 제한해야 하는 패턴 · /, *, --, “, ‘, (, ), #, =, <, >, @, . ; 등 |
6. 문자열 제거방식의 검사 필터링 우회취약점
(개요)
•SQL 인젝션 공격을 방지하기 위해 사용자로부터 입력된 문자열을 검사하여 부적절한 문자또는 문자열이 발견되면 발견된 문자 및 문자열을 제거하는 방식으로 필터링을 적용한 환경에서 우회할 수 있는 취약점이다.
(취약 형태)
•사용자로부터 입력된 문자열에서 SQL 인젝션 공격코드에서 사용되는 특정문자열을 제거하도록 구현된 경우 취약할 수 있다.
※ SQL 인젝션 공격에 즐겨 사용되는 문자열을 제거하도록 구현한 예 <? ... str_replace("or", "", $id); str_replace("or", "", $password); ... SELECT * FROM member_table WHERE user_id=’$id’ AND user_pw=’$password’ ... ?> |
(점검방법)
•공격자는 문자열 검사 시 제거될 문자열을 고려하여 문자열 검사 후 질의문이 완성되도록 구성한 입력을 삽입하여 SQL 인젝션 공격을 수행한다.
※“or“문자열을 제거하도록 구현된 경우“oorr“를 입력하여 필터링 우회 // $id 변수를 "' oorr 1=1--"로사용자가입력할경우 필터링에의해가운데“or”이제거되어정상적인질의문완성 SELECT * FROM member_table WHERE user_id=’‘oorr 1=1--' AND user_pw='xxxx' |
(조치방법)
•본 취약점에 대해 안전하게 조치하기 위해서는 SQL 인젝션 취약점방지를 위한 사용자 입력값 검사과정에서 부적절한 문자열 발견 시 사용자처리를 바로 종료시키거나 악성코드문자열을 제거하는 과정을 대소문자에 관계없이 반복 실행하여 모든 검사문자열이 완전히 제거 되도록 하여야 한다.
※대소문자에 관계없이 모든 악성코드패턴을 차단하는 코드 <? ... while (stristr($id, "or")) str_ireplace("or", "", $id); while (stristr($password, "or")) str_ireplace("or", "", $password); ... ?> |
(개요)
•밑의 그림의 구성도는 일반적인 기업에서의 구성환경이다. 보통IIS WEB 서버와DB 서버가 별도의Zone으로 분리되어 있을 경우 방화벽을 별도로 두는 경우가 더 많다.
•이러한 환경에서 공격자와 일반 사용자는 웹방화벽(WAF)을 통해서 서비스를 이용하게 된다. 보통IIS WEB서버에MSSQL 조합을 많이 사용하나ORACLE, MySQL 등등의DB서버를 다양하게 연결해서 사용하게 된다. 여기에서 IIS WEB서버에서 특수한 현상이 발생하게 되는데Keyword Filtering 형태의WAF는 모두 우회가 가능하다는 취약점이다.
(취약 형태)
http://victim.com/news.php?id=1+un/**/ion+se/**/lect+1,2,3..... http://victim.com/news.php?id=1+/*!union*/ /*!select*/ 1,2,3,4…. |
* 방화벽 필터설정이 다음과 같을 때 /union\select/g http://victim.com/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3... |
- 일부 방화벽에서는 인코딩된SQL 키워드 디코딩을 통해 탐지가 가능. 하지만 더블인코딩을 통해 우회가 가능하다.
http://victim.com/news.php?id=1%252f%252a*/union%252f%252a/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users-- http://victim.com/news.php?id=1/**/union/*/select/**/1,2,3/**/from/**/users-- |
- character “%“는ASP/ASP.NET에서 생략되어 인식된다.
•다음과 같이 정형화된 SQL문을 시도할 경우 방화벽에서 탐지가 되는데, SQL문중간에“%” 삽입을 통해 우회가 가능하다.
[방화벽탐지] http://victim.com/news.asp?id=10 and 1=0/(select top 1 table_name from information_schema.tables) [방화벽우회] http://victim.com/news.asp?id=10 a%nd 1=0/(se%lect top 1 ta%ble_name fr%om info%rmation_schema.tables) |
(점검방법)
•공격자는 문자열검사 시 제거될 문자열을 고려하여 문자열검사 후 질의문이 완성되도록 구성한 입력을 삽입하여SQL 인젝션 공격을 수행한다.
(조치방법)
•모든 사용자 입력 폼(로그인 폼, 검색 폼, URL 등)을 대상으로 특수문자, 특수구문 필터링 규칙을 적용한다.
필터링대상 | ||||
‘ | “ | -- | # | = |
( | ) | */ | /* | + |
< | > | && | || | % |
union | select | insert | from | where |
update | drop | if | join | declare |
and | or | column_name | table_name | openrowset |
substr | substring | xp_ | sysobjects | syscolumns |
•취약점에 대한 보안조치를 보안 장비에만 의존하는 경우가 많으나 SQL 인젝션 취약점 조치시 반드시 웹 스크립트 소스 레벨에서 사용자 입력 문자열에 대해 검증하여야 한다.
( 개요 )
•현재 인터넷 웹 환경에 사용되는 웹 서버는 단순한 HTML로 이루어진 컨텐츠 제공 용도의 웹 서버보다는 서버 단에서 이플리케이션이 동작하는 웹 어플리케이션 서버(WAS)를 운용
•대표적인 웹 어플리케이션 서버(WAS)는 Apache Tomcat, Jboss, Jeus, WebLogic 등이 존재하며 다양한 기능을 제공하는 WAS의 취약점을 사용하여, 공격자는 웹쉘 업로드, DB자료 절취 등이 가능
( 취약 형태 )
•외부에서 WAS서버에 직접 접근이 불가능하도록 차단하여야 하나 접근통제 소홀로 직접 접근이 가능한 경우 WAS 관리자 탈취 우려
•WAS 관리자 계정을 디폴트 계정(ID : admin, PW : jeusadmin 등)으로 방치하거나 유추 가능한 패스워드 설정시 손쉽게 권한 탈취 우려
•WAS 관리자 계정을 획득하면 웹쉘 업로드를 통해 서버장악이 가능할 뿐만아니라 DB 내 자료 무단접근 가능 등 취약요인 다수 존재
( 보안대책 )
•WAS 서버는 외부에서 직접 접근이 불가능하도록 방화벽에서 차단
•WAS 관리자 계정 패스워드는 문자ㆍ숫자ㆍ특수문자 등을 혼합하여 9자리 이상으로 안전하게 설정하여 운영
(점검방법)
•웹관리자 접속 페이지가 외부에서 접속 가능한지 테스트
(보안대책)
• 웹관리자 페이지는 특정 IP에서만 접속이 가능하도록 접근통제 설정. 끝.
[2023 챗GPT] 챗GPT 활용방법 및 개인정보 주의사항 안내 (0) | 2023.05.26 |
---|---|
[개인정보보호 수준진단 점검표 Hwp] 영상정보처리기기 개인영상정보 관리대장 서식 (표준 개인정보 보호지침) (0) | 2023.04.13 |
[개인정보 관리 점검표.hwp] 개인정보 처리 유의사항 및 홍보 포스터 PDF, 홍보 포스터JPG, 개인정보 안전성 확보 조치(법 제29조) 체크리스트 (0) | 2023.04.13 |
[정보 보안 관련]사이버보안 정책 일부 변경 시행 통보(영상정보처리기기(CCTV))」영상정보처리기기 보안정책(정보보안 지침 제89조) (0) | 2023.04.13 |
[개인정보보호] 개인정보보호를 위한 윤리선언문 (0) | 2023.03.15 |