如何在此示例中注入SQL

时间:2011-06-20 18:26:13

标签: php mysql

我的问题非常具体,但我认为这将有助于我对安全性和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; -

注射类型,但显然一个人不会在这里工作。所以只是好奇。感谢。

4 个答案:

答案 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()