一个令人深思的小注入【警惕】

  •   2009-07-31/22:45
  • 先举一个例子来给大家了解一下PHP下的注入的特殊性和原理。当然,这个例子也可以告诉大家如何学习构造有效的SQL语句。
    我们拿一个用户验证的例子,首先建立一个数据库和一个数据表并插入一条记录,如下:
    PHP代码:
    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`)
    ) TYPE=MyISAM AUTO_INCREMENT=3 ;
    #
    # 导出表中的数据 `user`
    #
    INSERT INTO `user` VALUES (1, 'angel', 'mypass');

    验证用户文件的代码如下:
    PHP代码:
    <?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 Query:$sql<p>";
    ?>

    这时我们提交:

    1=1

    就会返回:

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:wwwinjectionuser.php on line 13
    登陆失败
    SQL Query:SELECT * FROM user WHERE username='angel' or 1=1' AND password='
    PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:wwwinjectionuser.php on line 13

    看到了吗?单引号闭合后,并没有注释掉后面的单引号,导致单引号没有正确配对,所以由此可知我们构造的语句不能让Mysql正确执行,要重新构造:
    '1=1

    这时显示“登陆成功”,说明成功了。或者提交:
    *

    这样就把后面的语句给注释掉了!说说这两种提交的不同之处,我们提交的第一句是利用逻辑运算,在ASP中运用可以说是非常广泛的,这个不用说了吧?第二、三句是根据mysql的特性,mysql支持/*和#两种注释格式,所以我们提交的时候是把后面的代码注释掉,值得注意的是由于编码问题,在IE地址栏里提交#会变成空的,所以我们在地址栏提交的时候,应该提交%23,才会变成#,就成功注释了,这个比逻辑运算简单得多了,由此可以看出PHP比ASP强大灵活多了。


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多