我正在为我的同学创建一个测试项目,以显示带有未经检查的变量的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";
}
这是我在用户名字段输入的内容:
' or 1=1 -- 
应该产生如下查询:
SELECT * FROM users WHERE username='' or 1=1 -- ' and password=MD5('')
如果我在SequelPro或PhpMyAdmin上运行此查询,查询会给我表格的第一行,以便它可以工作。
但是,如果我提交表单,则结果为Not valid
。
我还尝试在此输入中使用密码字段:
') or 1=1 -- 
这是生成的查询:
SELECT * FROM users WHERE username='' and password=MD5('') or 1=1 -- ')
但结果是一样的,它适用于SequelPro,但不适用于表格。
我认为mysql_query函数无法识别--
注释。我是对的吗?
我做错了什么?
答案 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."')";
并将结果发布给我作为评论,也许我可以帮助你