SQL使用sql注入从其他数据库中选择

时间:2011-06-28 21:27:43

标签: php mysql sql

我被SQL注入攻击,他们获得了我的数据库“root”用户名和密码。

但他们也向我展示了一些来自其他数据库的数据,该网站的名称肯定没有。

是否可以使用SQL注入从其他数据库(具有完全访问权限的用户)中进行选择? 或者唯一的方法是使用有权访问此数据库的URL。

如果可以的话,它有什么样的SQL?所以我可以在我的日志中找到它。

3 个答案:

答案 0 :(得分:0)

如果他们有您的数据库root密码,他们可以做任何事情。 SQL绝对可以从同一服务器内的其他数据库中选择,使用与引用多个表相同的机制:

select database1.table.field, database2.othertable.otherfield, etc...

使用'root'来做你面向前端的东西绝对不是一个好主意。特别是如果你正在编写易受攻击的代码。总是创建一个专用的用户,只需要你所需的权限。例如,一个简单的博客引擎不需要更改表,删除数据库或更改权限的权限。

您的日志只会显示GET查询参数。如果所有黑客都使用POST调用,则日志将不包含发送的实际数据,因此很可能您在此方面是SOL。如果你启用了mysql二进制日志记录,那么每个查询都会执行很多。

答案 1 :(得分:0)

当然,MySQL查询可以引用同一个MySQL实例中的任何数据库。

SELECT * FROM `databasename`.`tablename` ...

如果攻击者可以使用SQL注入以root身份执行任意查询,那么获取数据库名称列表也很容易:

SHOW DATABASES;

或者:

SELECT DISTINCT table_schema FROM INFORMATION_SCHEMA.TABLES;

我鼓励您对所有代码执行全面的代码审查,并且更安全地编写动态SQL查询。在大多数情况下,您可以使用正确的类型强制,字符串转义函数和查询参数,但是还有更多情况需要构建动态SQL字符串,而这些解决方案无济于事。

在我的书SQL Injection Myths and Fallacies中查看我的演示文稿SQL Antipatterns: Avoiding the Pitfalls of Database Programming或有关SQL注入的章节。

答案 2 :(得分:0)

SHOW DATABASES;

这将为您提供您有权访问的数据库列表。 root可以访问所有这些(在大多数安装中)。

查看表格:

SHOW TABLES IN `myDB`;

要查看那些表结构,你可以做多件事

SHOW CREATE TABLE `myDB`.`myTable`; /* This shows a executable query that can be used to recreate the table structure */

or

SHOW COLUMNS FROM `myTable` IN `myDB`; /* This shows a list of columns */