시스템이야기2010. 5. 31. 19:14
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/ 파일까지 캡쳐하여 블로그에 공개한 적이 있다.

mysql


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으로 제한이 된다.

자세한 글은 커피닉스의 'MySQL에서 보안위해 load_file() 경로 제한하기' ( 2010.5 )를 읽어보기 바란다.


* 관련글

- 2009/11/30 - [IT이야기] - nProtect 웹사이트, SQL Injection공격 당해
- 2008/12/11 - [시스템이야기] - MySQL 인젝션 공격 방어하는 GreenSQL
- 12.22~23 커피닉스 이야기 (Intel사이트 SQL Injection등) (2009.12.24)
- 대량 SQL Injection 공격 주의 (2009.12.11)


Posted by 좋은진호