php+mysql注入详细

前言   2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早 的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个 技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击 也相当熟悉了,国内各大站点都有些堪称经典的作品,不过作为一篇完整的文章,我觉得还是有必要再说 说其定义和原理。如果哪位高手已经达到炉火纯青的地步,不妨给本文挑点刺。权当指点小弟。 关于php+Mysql的注入   国内能看到php+Mysql注入的文章可能比较少,但是如果关注各种WEB程序的漏洞,就可以发现,其实 这些漏洞的文章其实就是一个例子。不过由于国内研究PHP的人比研究ASP的人实在少太多,所以,可能没 有注意,况且PHP的安全性比ASP高很多,导致很多人不想跨越这个门槛。   尽管如此,在PHP站点日益增多的今天,SQL注入仍是最有效最麻烦的一种攻击方式,有效是因为至少 70% 以上的站点存在SQLInjection漏洞,包括国内大部分安全站点,麻烦是因为MYSQL4以下的版本是不支 持子语句的,而且当php.ini里的magic_quotes_gpc 为On 时。提交的变量中所有的 ‘ (单引号), ” (双 引号), (反斜线) and空字符会自动转为含有反斜线的转义字符。给注入带来不少的阻碍。   早期的时候,根据程序的代码,要构造出没有引号的语句形成有效的攻击,还真的有点困难,好在现 在的技术已经构造出不带引号的语句应用在某些场合。只要有经验,其实构造有效的语句一点也不难,甚 至成功率也很高,但具体情况具体分析。首先要走出一个误区。 注:在没有具体说明的情况下,我们假设magic_quotes_gpc均为off。 php+Mysql注入的误区   很多人认为在PHP+MYSQL下注入一定要用到单引号,或者是没有办法像MSSQL那样可以使用 “declare@a sysname select @a=<command> execmaster.dbo.xp_cmdshell@a”这类的命令来消除引号, 其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。   为什么呢?因为不管在什么语言里,在引号(包括单双)里,所有字符串均是常量,即使是dir这样 的命令,也紧紧是字符串而已,并不能当做命令执行,除非是这样写的代码: $command = “dir c:”; system($command);   否则仅仅只是字符串,当然,我们所说的命令不单指系统命令,我们这里说的是SQL语句,要让我们 构造的SQL语句正常执行,就不能让我们的语句变成字符串,那么什么情况下会用单引号?什么时候不用 呢?看看下面两句SQL语句: ①SELECT * FROM article WHERE articleid=’$id’ ②SELECT * FROM article […]