我被SQL注入攻击,他们获得了我的数据库“root”用户名和密码。
但他们也向我展示了一些来自其他数据库的数据,该网站的名称肯定没有。
是否可以使用SQL注入从其他数据库(具有完全访问权限的用户)中进行选择? 或者唯一的方法是使用有权访问此数据库的URL。
如果可以的话,它有什么样的SQL?所以我可以在我的日志中找到它。
答案 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 */