메뉴 건너뛰기

infra

[mysql] load_file 취약점

박영식2011.04.29 02:06조회 수 6045댓글 1

  • 1
    • 글자 크기
아래의 url로 기사가 나와서 직접 test를 하려고 했다.

http://www.boannews.com/media/view.asp?page=1&gpage=1&idx=25904&search=&find=&kind=0# [1]

이미 매뉴얼을 보거나 누군가의 지적에 의해 구현된 사항이었다.


http://coffeenix.net/board_print.php?bd_code=1707 [3]

그러나, root 권한으로 /tmp, /etc, /var/tmp 는 접근이 되는데, 그 외의 디렉터리 /var/www 등은 접근이 안 된다.

load_file하면, null 이 나온다.

my.cnf 를 수정하여, 
secure-file-priv 를 고치게 되면, 해당 디렉터리만 접근하게 되는 건 맞다.

이를 적용함으로써 /etc 폴더를 보호할 수 있다.

그런데, 기본값이어도, web관련 폴더에 접근하지 못한다면, [1]의 결과는 무용지물 일 것이다.

현재 기본값으로 secure-file-priv 변수가 설정되지 않았는데, null 로 찍힌다. 즉 접근할 수 없다는 것이다.

[1] 은 windows 환경에서 apm을 설치해서 test 한 것인데, 나는 ubuntu에서 했기 때문에, wamp에서도 해봐야 할 듯 하다.


mysql> select load_file('/var/test/test.txt');
+---------------------------------+
| load_file('/var/test/test.txt') |
+---------------------------------+
| NULL                            |
+---------------------------------+
1 row in set (0.00 sec)


mysql> select load_file('/var/tmp/test.txt');
+--------------------------------+
| load_file('/var/tmp/test.txt') |
+--------------------------------+
| slkjf
                         |
+--------------------------------+
1 row in set (0.00 sec)


mysql> select load_file('/var/test.txt');
+----------------------------+
| load_file('/var/test.txt') |
+----------------------------+
| NULL                       |
+----------------------------+
1 row in set (0.00 sec)


mysql> select load_file('/tmp/test.txt');
+----------------------------+
| load_file('/tmp/test.txt') |
+----------------------------+
| slkjf
                     |
+----------------------------+
1 row in set (0.00 sec)

07_25_.jpg

박영식 (비회원)
  • 1
    • 글자 크기

댓글 달기

댓글 1
  • 추가적으로 secure-file-priv 의 경우 into outfile도 제한한다.

    http://dev.mysql.com/doc/refman/5.0/en/cannot-create.html

    1) MySQL데몬이 쓰기 권한이 없어서 에러가 발생
    mysql> select * from myfile into outfile "/var/test/test.txt";
    ERROR 1 (HY000): Can't create/write to file '/var/test/test.txt' (Errcode: 13)

    기본 설정이라면 아래는 가능하다.

    mysql> select * from myfile into outfile "/tmp/test.txt";

    루트로 mysql을 이용한다면, 기본 설정에서 아래와 같이 접근 가능하기 때문에 취약하다.
    LOAD_FILE("/etc/passwd"); 
첨부 (1)
07_25_.jpg
68.4KB / Download 120
위로