作为评估的一部分,我正在使用 mysql 在受损主机的文件系统中四处寻找。我似乎记得上次玩它时,有些文件可以读取(例如 /etc/passwd),而其他文件则不能(/etc/shells。)
mysql 文档特别指出:出于安全原因,在读取位于服务器上的文本文件时,文件必须驻留在数据库目录中或所有人都可以读取... https://dev.mysql.com/doc/refman/ 5.6/en/load-data.html
但情况似乎并非如此,因为这两个文件具有相同的有效权限和所有权,并且只有前者可以被 load_data() 或 LOAD DATA INFILE 读取。
-rw-r--r-- 1 root root 73 Feb 13 2013 shells
-rw-r--r-- 1 root root 1.7K Oct 9 04:49 passwd
mysql> select load_file("/etc/passwd");
| load_file("/etc/passwd")
| root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
...
mysql> select load_file("/etc/shells");
+--------------------------+
| load_file("/etc/shells") |
+--------------------------+
| NULL |
+--------------------------+
1 row in set (0.00 sec)
这种歧视是如何进行的,是否可以进一步限制?(我知道您可以禁用加载数据 infile,但可以说由于 ETL 或其他原因您不能,例如,您将如何选择性地在 /etc/passwd 上强制执行此操作。)