快捷搜索:  xxx  as  推理研究所  幼幼  侦探研究所

永乐国际登录网站乐在其中:在PHP中全面阻止SQL注入式攻击之二



一、 注入式进击的类型

可能存在许多不合类型的进击念头,然则乍看上去,彷佛存在更多的类型。这是异常真实的-假如恶意用户发清楚明了一个能够履行多个查询的法子的话。本文后面,我们会对此作具体评论争论。

假如你的脚本正在履行一个SELECT指令,那么,进击者可以逼迫显示一个表格中的每一行记录-经由过程把一个例如"1=1"这样的前提注入到WHERE子句中,如下所示:

SELECT * FROM wines WHERE variety = 'lagrein' OR 1=1;'

正如我们在前面所评论争论的,这本身可能是很有用的信息,由于它揭示了该表格的一样平常布局(这是一条通俗的记录所不能实现的),以及潜在地显示包孕机密信息的记录。

一条更新指令潜在地具有更直接的要挟。经由过程把其它属性放到SET子句中,一名进击者可以改动当前被更新的记录中的任何字段,例如下面的例子:

UPDATE wines SET 永乐国际登录网站乐在其中type='red','vintage'='9999' WHERE variety = 'lagrein'

经由过程把一个例如1=1这样的恒真前提添加永乐国际登录网站乐在其中到一条更新指令的WHERE子句中,这种改动范围可以扩展到每一笔记录,例如下面的例子:

UPDATE wines S永乐国际登录网站乐在其中ET type='red','vintage'='9999 WHERE variety = 'lagrein' OR 1=1;'

最危险的指令可能是DELETE-这是不难想像的。其注入技巧与我们已经看到的相同-经由过程改动WHERE子句来扩展受影响的记录的范围,例如下面的例子:

DELETE FROM wines WHERE variety = 'lagrein' OR 1=1;'

二、 多个查询注入

多个查询注入将会加剧一个进击者可能引起的潜在的毁坏-经由过程允许多条破坏性指令包括在一个查询中。在应用MySQL数据库时,进击者经由过程把一个出乎料想之外的终止符插入到查询中即可很轻易实现这一点-此时一个注入的引号(单引号或双引号)标记期望变量的结尾;然后应用一个分号终止该指令。现在,一个别的的进击指令可能被添加到现在终止的原始指令的结尾。终极的破坏性查询可能看起来如下所示:

SELECT * FROM wines WHERE variety = 'lagrein';

GRANT ALL ON *.* TO 'BadGuy@%' ID永乐国际登录网站乐在其中ENTIFIED BY 'gotcha';'

这个注入将创建一个新的用户BadGuy并付与其收集特权(在所有的表格上具有所有的特权);此中,还有一个"不祥"的口令被加入到这个简单的SELECT语句中。假如你遵照我们在曩昔文章中的建议-严格限定该历程用户的特权,那么,这应该无法事情,由于web办事器守护法度榜样不再拥有你撤回的GRANT特权。然则从理论上讲,这样的一个进击可能给予BadGuy自由权力来实现他对你的数据库的任何操作。

至于这样的一个多查询是否会被MySQL办事器处置惩罚,结论并不独一。这此中的一些缘故原由可能是因为不合版本的MySQL所致,然则大年夜多半环境却是因为多查询存在的要领所致。MySQL的监视法度榜样完全容许这样的一个查询。常用的MySQL GUI-phpMyAdmin,在终极查询之前会复制出曩昔所有的内容,并且仅仅这样做。

然则,大年夜多半的在一个注入高低文中的多查询都是由PHP的mysql扩展认真治理的。幸好,默认环境下,它是不容许在一个查询中履行多个指令的;试图履行两个指令(例如上面所示的注入)将会简单地导致掉败-不设置任何差错,并且没有天生任何输出信息。在这种环境下,只管PHP也只是"规规矩矩"地实现其缺省行径,然则确凿能够保护你免于大年夜多半简单的注入式永乐国际登录网站乐在其中进击。

PHP5中的新的mysqli扩展(参考http://php.net/mysqli),就象mysql一样,内在地也不支持多个查询,不过却供给了一个mysqli_multi_query()函数以支持你实现多查询-假如你确凿想这样做的话。

然而,对付SQLite-与PHP5绑定到一路的可嵌入的SQL引擎(参考http://sqlite.org/和http://php.net/sqlite)环境更为可骇,因为其易于应用而吸引了大年夜量用户的关注。在有些环境下,SQLite缺省地容许这样的多指令查询,由于该数据库可以优化批查询,分外是异常有效的批INSERT语句处置惩罚。然而,假如查询的结果为你的脚本所应用的话(例如在应用一个SELECT语句检索记录的环境下),sqlite_query()函数却不会容许履行多个查询。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: