SQL注入测试 - mysql_query

时间:2013-10-12 10:01:11

标签: php mysql sql sql-injection

我正在为我的同学创建一个测试项目,以显示带有未经检查的变量的php代码是如何危险的。 我正在使用已弃用的mysql_*函数和一个包含2个表的简单数据库:

users  
data

在用户中我只有管理员用户。

我创建了一个简单的html表单:

    <form action="login" method="POST">
    username: <input type="text" name="username">
    password: <input type="text" name="password">
<input type="submit" value="login">
    </form>

和login.php页面只是获取发布数据并构建如下查询:

$uname = strtolower(trim($_POST['username']));
    $passw = strtolower(trim($_POST['password']));

$result = mysql_query("
    SELECT *
    FROM users
    WHERE username='".$uname."' and password=MD5('".$passw."')"
    );
if(mysql_num_rows($result) != 1){
        echo "Non valid";
    }else{
        echo "Logged in";
    }

这是我在用户名字段输入的内容:

&#39; or 1=1 --&#32;

应该产生如下查询:

SELECT * FROM users WHERE username='' or 1=1 -- ' and password=MD5('') 

如果我在SequelPro或PhpMyAdmin上运行此查询,查询会给我表格的第一行,以便它可以工作。 但是,如果我提交表单,则结果为Not valid

我还尝试在此输入中使用密码字段:

&#39;) or 1=1 --&#32;

这是生成的查询:

SELECT * FROM users WHERE username='' and password=MD5('') or 1=1 -- ') 

但结果是一样的,它适用于SequelPro,但不适用于表格。

我认为mysql_query函数无法识别--注释。我是对的吗? 我做错了什么?

1 个答案:

答案 0 :(得分:1)

在用户名字段中尝试此操作:

' or 1=1 or '

并输入您想要的密码。 在'之后不要忘记空间。 它会像你那样改变你的代码:

mysql_query("select * from users where username='' or 1=1 or '' and 
password=".md5('$pass'))

并且它总是返回true。

必须工作,如果没有, 这样做:

echo "
    SELECT *
    FROM users
    WHERE username='".$uname."' and password=MD5('".$passw."')";

并将结果发布给我作为评论,也许我可以帮助你