MySQL“查询”可以被利用吗(在处理服务器时)?

MySQL“查询”可以被利用吗(在处理服务器时)?

(不喜欢/关于 MySQL 注入)我只是想确认一下,有人告诉我,a query在我们提交时,它可以被更改(或)修改(由中间的入侵者/黑客)。这可能吗?

我的意思是,假设 php 中有一个查询(肯定是固定查询):
$query = 'SELECT password WHERE id=1';
$result = mysql_query($query);

  • 假设无论 SQLInject 或任何威胁是什么,最终的$query(字符串)都会被处理。对吗?

(1) 此查询可以在“提交”过程中(到达服务器之前)更改/修改吗?
(2) 或者.. 可以returning result在“返回”过程中(从服务器返回)更改/修改吗?

因此,根据他的说法,$result我们最终得到的结果与我们实际查询的结果相反(即使实际表仍然安全或未被黑客入侵)。 该案例发生在mysql_query流程内部。

那么这可能吗? 抱歉,如果这是一个愚蠢的问题,但我真的很困惑。

答案1

也许,这取决于您是否在查询中使用用户输入。

例如,以下代码可能存在漏洞。请注意,它获取用户输入$_POST['UnsanitisedInput']并直接在查询中使用它,而没有使用类似 之类的方法对其进行清理mysql_real_escape_string()

$result = mysql_query('SELECT Stuff FROM Things WHERE Widget = ' . $_POST['UnsanitisedInput']);

对于您发布的查询,它不需要用户输入,所以无法修改,除非您的服务器受到威胁。

如果你想更多地了解这个话题,这种攻击被称为SQL 注入

答案2

一切皆有可能,具体取决于您的设置。其他人已经写过有关不检查用户输入时可能发生的 SQL 注入的文章,但是如果您的查询没有用户输入怎么办?

如果网络受到威胁,则网络通信可能像许多其他网络协议一样遭受 MITM 攻击,导致您以为自己正在连接到自己的服务器,而实际上却连接到别人的服务器。

如果您正在使用与本地 mysql 服务器通信,mysql.sock那么如果服务器本身受到威胁,则该mysql.sock文件可能会被替换为与假 mysql 服务器通信的套接字文件(这可能会更改查询并将其发送到真正的 mysql 服务器,或者将其发送到真正的 mysql 服务器并在返回结果之前更改结果)。

不过,最有可能的是,如果服务器被入侵,无论是谁干的,都只会编辑你的 php 文件并更改查询,而不是做所有这些额外的工作。

答案3

他可能指的是 SQL 注入攻击,如果您在查询中直接使用未清理的用户输入,则可以使用该攻击来修改查询,例如

$query = 'SELECT * FROM table WHERE id = ' . $_GET['id'];
mysql_query($query);

这里你直接使用了 '`$_GET['id'],但你无法保证其值。你应该这样做。

$query = 'SELECT * FROM table WHERE id = ' . mysql_real_escape_string($_GET['id']);
mysql_query($query);

除此之外,攻击者在通过网络时更改实际查询的问题仅在以下情况下出现:

  • Web 服务器 (使用 PHP 代码) 和数据库服务器是分开的,
  • 查询是通过互联网进行的,而不仅仅是通过私人网络。
  • 在这种情况下,您没有在数据库连接上使用 SSL

如果以上任何一项为假,答案是

不,攻击者无法改变数据库和 Web 服务器之间的查询或结果

因此,如果您通过公共互联网查询数据库服务器,则可以使用 SSL 来避免任何网络数据包的窃听或篡改。

更新
你说的处理是指在数据库和应用服务器之间传输,对吗?还是指在服务器内存中,比如 MySQL/PHP 进程的内存篡改?

我已经解决了上述网络问题。

至于在查询处理过程中更改查询,这只能通过本机进程来完成,只有当您的服务器受到攻击时,黑客才能安装本机进程。
在这种情况下,攻击者不必经历所有这些麻烦,因为他只需编辑您的 PHP 文件即可。

答案4

由于中间人攻击,从服务器返回的数据很容易被篡改,因此请运行 SSL(尽管 SSLStrip 理论使得这并不万无一失)。

至于在最终用户和 PHP 页面之间编辑查询,实际上并非如此,除非您站点中的其他地方有漏洞,允许他们编辑您的 PHP。另外,我认为 PHP 和 MySQL 之间的数据默认未加密,您可以对其进行隧道传输(极高的安全性)或运行 SSL MySQL IIRC。

相关内容