很多人认为在PHP+MYSQL下注入一定要用到单引号,或者是没有办法像MSSQL那样可以利用
\公众declare@asysnameselect@a=<command>execmaster.dbo.xp_cmdshell@a\"大众这类的命令来肃清引号,实在这个是大家对注入的一种误解或这说是对注入认识上的一种误区。为什么呢?由于不管在什么措辞里,在引号(包括单双)里,所有字符串均是常量,纵然是
dir这样的命令,也牢牢是字符串而已,并不能当做命令实行,除非是这样写的代码:

$command=\"大众dirc:\公众;
system($command);
否则仅仅只是字符串,当然,我们所说的命令不单指系统命令,我们这里说的是SQL语句,要让我们布局的SQL语句正常实行,就不能让我们的语句变成字符串,那么什么情形下会用单引号?
什么时候不用呢?看看下面两句SQL语句:
①SELECTFROMarticleWHEREarticleid='$id'
②SELECTFROMarticleWHEREarticleid=$id
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,纵然包含了精确的SQL语句,也不会正常实行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的统统,只要包含空格,那空格后的变量都会作为SQL语句实行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同
之处。
①指定变量$id为:
1'and1=2unionselectfromuserwhereuserid=1/
此时全体SQL语句变为:
SELECTFROMarticleWHEREarticleid='1'and1=2unionselectfromuserwhere
userid=1/'
②指定变量$id为:
1and1=2unionselectfromuserwhereuserid=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程序的时候,记得用单引号把变量包含起来。当然,必要的安全方法是必不可少的。
弈安传媒科技微教室,每天分享财经资讯,打算机技能知识,人生感悟,创业辅导以及各种专业技能知识资料学习互换.移动学习平台、知识分享平台。随时随地的学习,如果你喜好发展,这里你不容错过的地方.弈安传媒科技培训关注:关注自己发展,分享内容,分享自己的技能,造诣未来.
[弈安传媒科技提升自己的平台]请关注:头条号及公众年夜众号 弈安传媒科技