为什么 MYSQL 的 LOAD FILE 只读取一些文件而不读取其他文件?

信息安全 渗透测试 mysql
2021-08-30 03:20:29

作为评估的一部分,我正在使用 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 上强制执行此操作。)

1个回答

看起来这是一个apparmor难题。我已经“停止”了apparmor,并重新测试了,但这似乎并不重要。

启用 APPARMOR_ENABLE_AAEVENTD 以便我可以获取与 apparmor 相关的拒绝日志:

vi /etc/apparmor/subdomain.conf

并更新了这一行:

APPARMOR_ENABLE_AAEVENTD="yes"

并重新启动apparmor

ori@myamdbox:/etc/apparmor$ sudo service apparmor restart

然后我重新运行上面的 load_file("/etc/shells") 并且日志喷涌而出:

Oct 10 04:03:13 myamdbox kernel: [85739.145281] type=1400 audit(1381374193.268:132): apparmor="DENIED" operation="open" parent=1 profile="/usr/sbin/mysqld" name="/etc/shells" pid=22485 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=115 ouid=0

拆除测试的配置文件是有效的,所以它肯定是罪魁祸首。

为了解决它,我打开了 /etc/apparmor.d/usr.sbin.mysqld

并添加了一行:

...

/etc/shells r, 

是的,它有效。

mysql> select load_file("/etc/shells");
+---------------------------------------------------------------------------+
| load_file("/etc/shells")                                                  |
+---------------------------------------------------------------------------+
| # /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
|
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

相反,我只需要在 apparmor 配置中找到引用并将其删除。

谢谢莱肯斯坦!