커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
*
HanIRC의 #coffeenix 방
[
장비 및 회선 후원
]
> Forum <
IT 일정
N
e
w
!
자동화 프로젝트
HOME
>
데이터베이스(database)
>
MySQL
도움말
검색 :
사이트
WHOIS
웹서버 종류
MySQL에서 보안위해 load_file() 경로 제한하기
작성일 : 2010/05/27 21:02
글쓴이 : 좋은진호 (
http://coffeenix.net/
)
조회수 : 28281
[
이전화면
/
수정
] 비밀번호 :
제 목 : MySQL에서 보안위해 load_file() 경로 제한하기
작성자 : 좋은진호(truefeel,
http://coffeenix.net/
)
작성일 : 2009.12.1(화)
정리일 : 2010.5.14(금)
1. SQL Injection에서 load_file() 함수의 위험
SQL Injection(SQL 인젝션) 공격에 대처하기 위해서는 다음과 같은 조치가 필요하다.
- SQL Injection공격 등 웹취약성이 없도록 프로그래밍을 하는게 우선이다. (그러나 많은 사이트에서 이부분은 뒷전이다.)
- 주기적으로 모의 테스트를 한다.
- 웹방화벽에서 UNION SELECT, UNION ALL SELECT, LOAD_FILE() 등 다양한 SQL Injection 공격 유형을 차단한다.
- 그리고, load_file() 함수의 경로 제한도 고려한다.
MySQL의 SELECT LOAD_FILE() 함수, LOAD DATA는 서버내에 있는 파일을 읽어들이는 명령이다. MySQL 데몬이 파일을 읽을 권한이 있다면, 서버내의 경로와 상관없이 어떠한 파일이라도 읽을 수 있다. 웹페이지가 SQL Injection 공격의 취약점이 있다고 할 때 다음과 같은 형식으로 쉽게 웹에서 서버 내의 파일을 확인할 수 있는 위험성이 존재한다.
select ...생략... from ...생략...
UNION SELECT LOAD_FILE("/etc/passwd");
이 함수가 편리성, 활용성 측면에서는 좋을 수 있지만, 보안에는 취약한 통로를 제공하는 셈이다.
최근(2009월 말) 루마니아의 Unu 해커는 세계 주요 사이트와 국내 보안 업체 사이트를 SQL Injection공격으로 해킹을 했다. 그리고, MySQL의 load_file() 함수로 서버의 /etc/ 파일까지 캡쳐하여 블로그에 공개한 적이 있다. 이 글에서는 작은 부분인 load_file() 함수의 경로 제한에 대해서 얘기할 것이다.
2. MySQL서버로 직접적 접근이 불가능해도 DB서버의 파일을 볼 수 있다.
[ 구성 예 ]
- A서버 : 웹서버
- B서버 : MySQL서버
위처럼 웹서버와 MySQL서버가 분리되어 있을 때, 웹서버에서 load_file("/etc/passwd") 함수를 호출했다면 어떤 서버의 파일을 보여줄까? MySQL 데몬이 local 파일에 접근하여 보여주는 것이므로, B서버의 파일이 된다. 그러므로 외부에서 MySQL서버로의 직접적인 접근이 불가능하더라도, load_file()함수를 이용할 수 있다면 DB서버 내부의 파일을 볼 수 있다.
3. MySQL에서 load_file() 함수의 경로를 제한하는 방법
MySQL 매뉴얼을 살펴보자.
--secure-file-priv=path
이 옵션은 LOAD_FILE() 함수 및 LOAD DATA 와 SELECT ... INTO OUTFILE 명령문이 특정 디렉토리에 있는 파일에서만 동작을 하도록 한정한다. 이 옵션은 MySQL 5.1.17에서 추가되었다.
위처럼 MySQL 5.1.17부터는 LOAD_FILE() 함수, LOAD DATA, SELECT ... OUTFILE을 특정 디렉토리내의 파일만 허용하도록 설정할 수 있다. --secure-file-priv 옵션은 동적으로는 설정값을 변경할 수가 없다. my.conf 의 '[mysqld]' 섹션에 다음과 같은 설정을 한다. (경로는 운영 환경에 맞게 할 것)
[mysqld]
secure-file-priv=/var/tmp
위처럼 설정하고 MySQL 데몬을 실행하면 load_file()을 사용할 수 있는 경로가 /var/tmp으로 제한이 된다.
4. secure-file-priv 설정 적용 전/후 비교
1) secure-file-priv= 적용전
① SELECT 결과를 /tmp/result.txt 파일로 저장
mysql>
select * from log into outfile "/tmp/result.txt";
Query OK, 151 rows affected (0.00 sec)
② 권한이 있는 파일을 load_file()로 읽으면 화면에 파일 내용이 그대로 출력된다. (결과 화면은 생략)
③ 권한이 없는 파일을 load_file()로 읽을 면 NULL만 표시된다.
1) 파일 권한
#
ls -al syslog.conf protocols
-rw-r--r-- 1 root root 6108 Oct 12 2006 protocols
-rw-r----- 1 root root 734 Jul 2 2009 syslog.conf
2) load_file() 함수 사용
mysql>
select load_file("/etc/syslog.conf");
+-------------------------------+
| load_file("/etc/syslog.conf") |
+-------------------------------+
| NULL |
+-------------------------------+
1 row in set (0.00 sec)
2) secure-file-priv= 적용후
① 설정값 확인
mysql>
show variables like 'secure%';
+------------------+-----------+
| Variable_name | Value |
+------------------+-----------+
| secure_auth | OFF |
| secure_file_priv | /var/tmp/ |
+------------------+-----------+
2 rows in set (0.00 sec)
② 경로를 /var/tmp/ 로 제한했으므로, /etc/ 아래 파일은 NULL로 표시된다. (/etc/protocols 파일은 누구나 읽기 권한이 있음)
mysql>
select load_file("/etc/protocols");
+-----------------------------+
| load_file("/etc/protocols") |
+-----------------------------+
| NULL |
+-----------------------------+
1 row in set (0.00 sec)
③ SELECT ... INTO OUTFILE 사용할 때 에러가 발생한다.
1) MySQL데몬이 쓰기 권한이 없어서 에러가 발생
mysql>
select * from myfile into outfile "/var/log/result.txt";
ERROR 1 (HY000): Can't create/write to file '/var/log/result.txt' (Errcode: 13)
2) MySQL데몬이 쓰기 권한은 있지만, --secure-file-priv 설정으로 경로 제한되어 나오는 에러
mysql>
select * from myfile into outfile "/tmp/result.txt";
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
5. 참고 자료
1) MySQL 관련
*
MySQL 사용자매뉴얼 - 명령어 옵션
http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=user&m_no=23109&cat1=&cat2=&cat3=〈=k&ver_name=USER
*
MYSQL 5.1 매뉴얼 - 5.1.2. Server Command Options ( --secure-file-priv=path )
http://dev.mysql.com/doc/refman/5.1/en/server-options.html
*
MYSQL LOAD_FILE SQL Injection
http://www.tullyrankin.com/mysql-load_file-sql-injection
LOAD_FILE 함수는 16진수 문자열로 파일을 읽을 수도 있다.
(예) /etc/passwd 는 0x2f6574632f706173737764.
LOAD_FILE(0x2f6574632f706173737764)
※ 이 URL에 소개된 perl스크립트 4번째 줄의 0x$encn"; 은 0x$enc\n"; 를 잘 못 표기한 것임
2) SQL Injection 관련
*
SQL Injection Cheat Sheet
http://michaeldaw.org/sql-injection-cheat-sheet
*
Backdoor webserver using MySQL SQL Injection
http://www.greensql.net/publications/backdoor-webserver-using-mysql-sql-injection
*
12.22~23 커피닉스 이야기 (Intel사이트 SQL Injection등)
(2009.12.24)
http://coffeenix.net/bbs/viewtopic.php?p=5988#5988
*
대량 SQL Injection 공격 주의 (2009.12.11)
http://coffeenix.net/bbs/viewtopic.php?p=5978#5978
*
nProtect 웹사이트, SQL Injection공격 당해
(2009.11.30)
http://truefeel.tistory.com/171
커피닉스 카페 최근 글
[08/25]
#gpt_question_subje
[08/20]
From what I've seen
[08/14]
сайт
[06/16]
[질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
[04/22]
Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
[10/20]
Cross Compiler 깔
[07/14]
SSL АО
[04/26]
Re: 도스화면 원격조종 여부
[04/25]
도스화면 원격조종 여부
[10/30]
Cshell에서 난수 설정
[10/23]
공항철도주식회사 SE 구인 件
[01/26]
Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
[01/25]
wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
[01/11]
특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
[08/01]
DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
N
e
w
! 최근에 등록한 페이지
KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
오픈캐스케이드 캐드 (OpenCASCADE CAD)
QCad for Windows --- GNU GPL (Free Software)
The Hello World Collection
IPMI를 활용한 리눅스 서버관리
DNS 설정 검사
nagiosgraph 설치 방법
Slony-I 설치 방법 (postgresql replication tool)
Qmail기반의 Anti spam 시스템 구축하기
clusterssh
[ 함께하는 사이트 ]
운영진 :
좋은진호(truefeel)
, 야수(yasu), 범냉이, sCag
2003년 8월 4일~