今天我要给大家讲解的是一个非常NB的入侵过程,我自己觉得非常的精彩,里面包含了非常多的知识点,这对与完全不懂php的朋友一样能够读懂,并且按照里面的技术自己来进行入侵类似的网站,并且能够得到非常好的效果。
现在SQL注入漏洞满地揭是,并且开发出很多优秀的工具例如NBSI,和CASI等等。这对于我们这样的菜鸟来说非常好了,因为完全避免了我们自己手动来一点点的猜测了,大大的提高了入侵率。。好了废话不多说直接进入我们的文章,来一次梦幻之旅,相信你再这里一定能够找到属于你自己的东西。
一.基础知识
首先我还是罗嗦一句php漏洞的形成的基本的原理,很多人认为在PHP MYSQL下注入一定要用到单引号,或者是没有办法像MSSQL那样可以使用 “declare @a sysname select @a= exec master.dbo.xp_cmdshell @a”这类的命令来消除引号,其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。
为什么呢?因为不管在什么语言里,在引号(包括单双)里,所有字符串均是常量,即使是dir这样的命令,也紧紧是字符串而已,并不能当做命令执行,除非是这样写的代码:
$command = "dir c:\";
system($command);
否则仅仅只是字符串,当然,我们所说的命令不单指系统命令,我们这里说的是SQL语句,要让我们构造的SQL语句正常执行,就不能让我们的语句变成字符串,那么什么情况下会用单引号?什么时候不用呢?看看下面两句SQL语句:
①SELECT * FROM article WHERE articleid=$id
②SELECT * FROM article WHERE articleid=$id
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,我们针对两个句子分别提交两个成功注入的畸形语句,来看看不同之处。
① 指定变量$id为:
1 and 1=2 union select * from user where userid=1/*
此时整个SQL语句变为:
SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1/*
②指定变量$id为:
1 and 1=2 union select * from user where userid=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设置