php+Mysql注入详解





前言
  2003年开端,爱好脚本袭击的人越来越多,而且研讨ASP下注入的友人也逐步多了起来,我看
过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经出神入化了,国内才
开始留神这个技术,由此看来,国内的这方面的泛亚娱乐技术:yuan01.bc88.info/fei相对国外仍是有一段很大差距,话说回来
,大家对SQL注入攻击也相称熟习了,国内各大站点都有些堪称经典的作品,不过作为一篇完全的
文章,我感到还是有必要再说说其定义和原理。如果哪位高手已经到达炉火纯青的田地,不妨给
本文挑点刺。权当指导小弟。
对于php+Mysql的注入
  海内能看到php+Mysql注入的文章可能比拟少,然而如果各种WEB程序的破绽,就可以发
现,其实这些漏洞的文章实在就是一个例子。不外由于国内研究PHP的人比研究ASP的人切实少太
多,所以,可能没有注意,况且PHP的安全性比ASP高良多,导致许多人不想逾越这个门槛。
  只管如斯,在PHP站点日益增多的今天,SQL注入还是最有效最麻烦的一种攻击方法,有效是
因为至少70 以上的站点存在SQL Injection漏洞,包括国内大局部平安站点,麻烦是因为MYSQL4
以下的版本是不支撑子语句的,而且当php.ini里的 magic_quotes_gpc 为On 时。提交的变量中
所有的 \' (单引,), " (双引,), (反斜线) and 空字符会主动转为含有反斜线的本义字符。给
注入带来不少的妨碍。
  早期的时候,依据程序的代码,要结构出没有引,的语句构成有效的攻打,还真的有点艰苦
,好在当初的技巧已经构造出不带引,的语句利用在某些场所。只要有教训,其实构造有效的语
句一点也不难,甚至成功率也很高,但具体情况详细剖析。首先要走出一个误区。
注:在不详细阐明的情形下,我们假设magic_quotes_gpc均为off。
php+Mysql注入的误区
  很多人认为在PHP+MYSQL下注入必定要用到单引,,或者是没有措施像MSSQL那样可以使用
“declare a sysname select a mand exec master.dbo.xp_cmdshell a”这类的命令来
打消引,,其实这个是大家对注入的一种曲解或这说是对注入意识上的一种误区。
  为什么呢·由于不论在什么语言里,在引,包含单双里,所有字符串均是常量,即便是
dir这样的命令,也牢牢是字符串罢了,并不能当做命令执行,除非是这样写的代码:
mand "dir c:";
system( mand);
  否则仅仅只是字符串,当然,我们所说的命令不单指体系命令,我们这里说的是SQL语句,要
让我们构造的SQL语句畸形执行,就不能让我们的语句变成字符串,那么什么情况下会用单引,·
什么时候不必呢·看看下面两句SQL语句:
①SELECT . FROM article WHERE articleid\' id\'
②SELECT . FROM article WHERE articleid id
  两种写法在各种程序中都很广泛,但保险性是不同的,第一句因为把变量 id放在一对单引,
中,这样使得我们所提交的变量都变成了字符串,即使包含了准确的SQL语句,也不会正常执行,
而第二句不同,因为没有把变量放进单引,中,那我们所提交的所有,只有包括空格,那空格后
的变量都会作为SQL语句执行,我们针对两个句子分辨提交两个成功注入的畸形语句,来看看不同
之处。
① 指定变量 id为:
1\' and 12 union select . from user where userid1/.
此时全部SQL语句变为:
SELECT . FROM article WHERE articleid\'1\' and 12 union select . from user where
userid1/.\'
②指定变量 id为:
1 and 12 union select . from user where userid1
此时整个SQL语句变为:
SELECT . FROM article WHERE articleid1 and 12 union select . from user where
userid1

  看出来了吗·由于第一句有单引,,我们必需先闭合前面的单引,,这样才干使后面的语句
作为SQL履行,并要解释掉后面原SQL语句中的后面的单引,,这样才可以胜利注入,假如php.ini
中magic_quotes_gpc设置为on或者变量前应用了addslashes()函数,我们的攻击就会子虚乌有,
但第二句没有用引,包含变量,那我们也不用斟酌去闭合、正文,直接提交就OK了。
  大家看到一些文章给出的语句中没有包含单引,例如pinkeyes的.php注入实例.中给出的那
句SQL语句,是没有包含引,的,大家不要以为真的可以不用引,注入,细心看看PHPBB的代码,
就可以发明,那个 forum_id所在的SQL语句是这样写的:
sql "SELECT .
FROM " . FORUMS_TABLE . "
WHERE forum_id forum_id";

  由于没有用单引,包含变量,才给pinkeyes这个家伙有机可乘,所以大家在写PHP程序的时候
,记得用单引,把变量包含起来。当然,必要的安全办法是必不可少的。
简略的例子
  先举一个例子来给大家懂得一下PHP下的注入的特别性和原理。当然,这个例子也能够告知大
家如何学习构造有效的SQL语句。
  咱们拿一个用户验证的例子,首先树立一个数据库跟一个数据表并插入一条记载,如下:
CREATE TABLE `user` (
`userid` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL default \'\',
`password` varchar(20) NOT NULL default \'\',
PRIMARY KEY (`userid`)
) TYPEMyISAM AUTO_INCREMENT3 ;
#
# 导出表中的数据 `user`
#
INSERT INTO `user` VALUES (1, \'angel\', \'mypass\');

  验证用户文件的代码如下:
php
servername "localhost";
dbusername "root";
dbpassword "";
dbname "injection";
mysql_connect( servername, dbusername, dbpassword) or die ("数据库衔接失败");
sql "SELECT . FROM user WHERE username\' username\' AND password\' password\'";
result mysql_db_query( dbname, sql);
userinfo mysql_fetch_array( result);
if (empty( userinfo))

echo "登陆失败";
else
echo "登陆成功";

echo " p SQL Querysql p ";

09-27 08:32