MySql LOAD_FILE bizzare权限问题?

时间:2015-04-26 17:14:28

标签: mysql security sql-injection mysql-loadfile

我管理的网站是 SQL注入攻击的受害者通过检查日志,攻击者似乎使用了 {{1} 使用文件读取选项并从服务器中获取了一堆配置文件,因为我们的Web开发人员很草率并使用root mysql帐户进行连接(具有FILE权限) )。

这是我想要了解的地狱部分。文件被读取 - 我知道它们是 - 因为攻击者然后在其中一个文件中使用密码来进行一些系统渗透。看着日志,他首先抓住了一个 index.php,它引用了config.php 和其他几个。他们都是目标。

为了加强安全性,我抓住了sqlmap并点击了我们的服务器,在弄清楚它是如何工作之后,我能够抓住这些文件。

我们的SQL服务器不在外面,因此攻击者无法尝试这一点。这是奇怪的部分:

我已从桌面连接到 sqlmap ,并尝试选择 MySQL server 以及 LOAD_FILE < /强>

其中一些人工作。例如, LOAD DATA INFILE into TABLE. 返回 select LOAD_FILE('/etc/passwd')

但并非所有人都有效。

/etc/passwd. 已退回 select LOAD_FILE('/var/www/site_name/index.php')

NULL 返回:

  

错误29(HY000):找不到文件'/var/www/site_name/index.php'(错误代码:13)

什么?文件未找到?咦?

所以我针对同一个文件运行了sqlmap并将其下载。

我使用 LOAD DATA INFILE '/var/www/site_name/index.php' INTO temp; 运行了 sqlmap ,所以我可以看到所有内容 - 它使用LOAD_FILE来获取文件。

为什么注入攻击中的LOAD_FILE会起作用,但是从mysql客户端命令行加载文件会返回NULL还是找不到文件?但仅适用于SOME文件? / etc / passwd和/ etc / hosts是可读的。

有任何线索吗?

1 个答案:

答案 0 :(得分:0)

事实证明,经过几天的反对之后,我发现另一个管理员搬了一下东西,以便面向外部的服务器,我以为我打的那个,实际上是将端口80转发到另一个更新的服务器。两台服务器都有一个数据库副本。因此,当执行SQL注入时,它正在访问内部/更新的数据库,并且可以读取该服务器上的文件。当我使用mysql客户端访问相同的IP地址时,它正在读取不同文件系统上的旧数据库副本,该数据库与其他服务器没有相同的文件。

此后头已经滚动。感谢您的努力和遗憾,浪费任何人的时间。