SQL通过SQL注入从其他数据库中进行选择


SQL select from other database with sql injection

我受到SQL注入的攻击,他们得到了我的数据库"root"用户名和密码。

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

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

如果这是可能的,它有什么sql?所以我可以在日志中找到它。

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 */

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

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

使用"root"来做面向前端的事情从来都不是一个好主意。尤其是在编写易受攻击的代码时。始终创建一个具有所需权限的专用用户。例如,一个简单的博客引擎不需要更改表、删除数据库或更改特权的权限。

您的日志将只显示GET查询参数。如果POST调用了所有的黑客攻击,日志将不会包含实际发送的数据,所以很可能你是SOL。如果您启用了mysql二进制日志记录,那么将执行大量的每个查询。

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

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

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

SHOW DATABASES;

或者:

SELECT DISTINCT table_schema FROM INFORMATION_SCHEMA.TABLES;

我鼓励您对所有代码进行彻底的代码审查,并在编写动态SQL查询时更加安全。在大多数情况下,可以使用适当的类型强制、字符串转义函数和查询参数,但在更多情况下,您需要构建动态SQL字符串,而这些解决方案没有帮助。

回顾我的演讲《SQL注入神话与谬误》,或者我的书《SQL反模式第1卷:避免数据库编程的陷阱》中关于SQL注入的章节,以获得一些想法。