1.1php+ Mysql 注入的误区
很多人认为在PHP+MY sql 下注入一定要用到单引号,或者是没有办法像 MSSQL 那样可以使用
“declare@asysnameselect@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程序的时候,记得用单引号把变量包含起来。当然,必要的安全措施是必不可少的。
弈安传媒科技微课堂,每天分享财经资讯,计算机技术知识,人生感悟,创业指导以及各种专业技术知识资料学习交流.移动学习平台、知识分享平台。随时随地的学习,如果你喜欢成长,这里你不容错过的地方.弈安传媒科技培训关注:关注自己成长,分享内容,分享自己的技术,成就未来.
[弈安传媒科技提升自己的平台]请关注:头条号及公众号 弈安传媒科技
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~