我的问题非常具体,但我认为这将有助于我对安全性和SQL注入的整体理解。我正在运行一个带有简单表单的本地网页,用于查看SQL注入如何直接工作,通过对我自己的数据库和网页进行操作。我一直在改变我的php文件验证用户的方式,所以我可以看到差异。我是初学者,php文件非常简单。我目前的PHP代码是:
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$conn = mysql_connect('localhost', 'root', 'password');
mysql_select_db(test1);
$query = "SELECT username, password FROM users WHERE username = '$username'";
$result = mysql_query($query) or die("Query failed: " . mysql_error());
$arr = mysql_fetch_array($result);
if($arr['username'] == $username && $arr['password'] == $password && strlen($username) > 0){
header('Location:index.php');
}else{
header('Location:login.html');
}
?>
我不知道这是一种好的还是坏的验证方式。我只是想知道一个如何注入它的例子,因为我无法想出这个。 MySQL_query()只允许1个语句,因此我不能将语句链接在一起,而且我不知道还能做些什么。我已经更改了文件,所以我可以做
'或1 = 1; -
注射类型,但显然一个人不会在这里工作。所以只是好奇。感谢。
答案 0 :(得分:3)
传递给用户名的以下内容将返回所有行:
'或'1'='1
通常,将未经验证的输入传递给SQL查询并不是一个好主意。
答案 1 :(得分:2)
考虑以下问题:
SELECT username, password FROM users WHERE username = 'anything' AND 0 =1
UNION ALL
SELECT '\'anything\' AND 0 =1
UNION ALL
SELECT \'user\',\'password\'','password'
如果$ _POST ['password']等于'password'字样,您的验证将失败,并允许未经授权的用户访问受保护的页面。
答案 2 :(得分:1)
在执行语句之前,您没有对帖子参数进行任何验证。这是不好的!并且SQL注入很容易实现。
例如:
SELECT username, password FROM users WHERE username = '$username' AND (SELECT 1 FROM ([Almost any SQL statement you want...]))
即。
$username = "' AND (SELECT 1 FROM ([Almost any SQL statement you want...])); --"
确保在SQL语句中使用它们之前验证参数。
答案 3 :(得分:1)
以用户名发送:
a' and(select 1 from(select count(*),concat((select concat_ws(0x3a,version(),database())),floor(rand(0)*2))x from information_schema.tables group by x)a) union select 1,'
我不确定,但我认为不可能重定向到index.php,但上面的例子会告诉你一些有趣的事情。
如果SELECT
命令被允许mysql
表等等,恶意用户甚至可以获得mysql的root用户密码,那么这些安全漏洞永远不应该被非消毒。
顺便说一句,您不应该向最终用户显示mysql_error()
。