您的位置 首页 php

网络安全关于php+Mysql注入的误区

1.1php+ Mysql 注入的误区

很多人认为在PHP+MY sql 下注入一定要用到单引号,或者是没有办法像 MSSQL 那样可以使用

“declare@asysnameselect@a=<command>execmaster.dbo.xp_cmdshell@a”这类的命令来消除引号,其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。为什么呢?因为不管在什么语言里,在引号(包括单双)里,所有 字符串 均是常量,即使是

dir 这样的命令,也紧紧是字符串而已,并不能当做命令执行,除非是这样写的代码:

$command=”dirc:”;

system($command);

否则仅仅只是字符串,当然,我们所说的命令不单指系统命令,我们这里说的是SQL语句,要让我们构造的SQL语句正常执行,就不能让我们的语句变成字符串,那么什么情况下会用单引号?

什么时候不用呢?看看下面两句SQL语句:

①SELECT*FROMarticleWHEREarticleid=’$id’

②SELECT*FROMarticleWHEREarticleid=$id

两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同

之处。

①指定变量$id为:

1’and1=2unionselect*fromuserwhereuserid=1/*

此时整个SQL语句变为:

SELECT*FROMarticleWHEREarticleid=’1’and1=2unionselect*fromuserwhere

userid=1/*’

②指定变量$id为:

1and1=2unionselect*fromuserwhereuserid=1

此时整个SQL语句变为:

SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1

看出来了吗?由于第一句有单引号,我们必须先闭合前面的单引号,这样才能使后面的语句

作为SQL执行,并要注释掉后面原SQL语句中的后面的单引号,这样才可以成功注入,如果php.ini

中magic_quotes_gpc设置为on或者变量前使用了addslashes()函数,我们的攻击就会化为乌有,但第二句没有用引号包含变量,那我们也不用考虑去闭合、注释,直接提交就OK了。

大家看到一些文章给出的语句中没有包含单引号例如pinkeyes的《php注入实例》中给出的那句SQL语句,是没有包含引号的,大家不要认为真的可以不用引号注入,仔细看看PHPBB的代码,就可以发现,那个$forum_id所在的SQL语句是这样写的:

$sql=”SELECT*

FROM”.FORUMS_TABLE.”

WHEREforum_id=$forum_id”;

由于没有用单引号包含变量,才给pinkeyes这个家伙有机可乘,所以大家在写PHP程序的时候,记得用单引号把变量包含起来。当然,必要的安全措施是必不可少的。

弈安传媒科技微课堂,每天分享财经资讯,计算机技术知识,人生感悟,创业指导以及各种专业技术知识资料学习交流.移动学习平台、知识分享平台。随时随地的学习,如果你喜欢成长,这里你不容错过的地方.弈安传媒科技培训关注:关注自己成长,分享内容,分享自己的技术,成就未来.

[弈安传媒科技提升自己的平台]请关注:头条号及公众号 弈安传媒科技

文章来源:智云一二三科技

文章标题:网络安全关于php+Mysql注入的误区

文章地址:https://www.zhihuclub.com/79369.shtml

关于作者: 智云科技

热门文章

网站地图