5

我想首先指出,这是对我自己的数据库的教育尝试,以更好地理解 MySQL 注入以保护我自己的代码。

我需要制定几个示例来说明如何针对以下代码构建 MySQL 注入。这是一个基本的用户登录系统,我接受用户名和密码而没有任何转义

$user = (!empty($_POST['user'])) ? $_POST['user'] : '';
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : '';

MySQL 查询然后尝试在我的名为 users 的表中查找输入的用户名和密码,如下所示:

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'");

这是未转义的输入,我正在尝试使用 MySQL 注入来:

  1. 绕过密码知道合法用户的用户名(我的用户表中的一个用户是测试人员),并且
  2. 将完全删除用户表的注入。

我已经尝试了来自Wikipedia的几个 MySQL 注入示例,但我猜{}我的查询中的内容阻止了注入,所以我希望得到对此有信心的人的一些帮助,并感谢大家。

4

6 回答 6

5

这样的事情应该做:

  1. 要以用户“foo”身份登录,请将用户名设置为“foo”--

这将使您的查询看起来像

$res = mysql_query("SELECT * from users where user='foo' -- ' AND pass=''");

“--”表示该行的其余部分被注释掉

  1. 不确定这是否可行,但尝试将用户名设置为“foo”或(DROP TABLE 用户)--”

这将使您的查询看起来像:

$res = mysql_query("SELECT * from users where user='foo' OR (DROP TABLE users) -- ' AND pass=''");

不过可能不接受 - 我认为子查询只能选择。

mysql_query 函数只会运行一个查询 - 其他的会让你这样做:

$res = mysql_query("SELECT * from users where user='foo'; DROP TABLE users -- ' AND pass=''"); 
于 2009-10-02T09:12:34.280 回答
3

您将无法访问DROP该表,因为使用mysql_query您无法发送多个查询。

于 2009-10-02T09:16:31.807 回答
1

这是一个很长的清单。

http://ha.ckers.org/sqlinjection/

您的代码显然几乎无法通过所有测试,因为它完全不受保护。

于 2009-10-02T09:10:53.813 回答
1
$user = (!empty($_POST['user'])) ? $_POST['user'] : '';
$pass = (!empty($_POST['pass'])) ? $_POST['pass'] : '';

$user = mysql_real_escape_string($user);
$pass = msyql_real_escape_string($pass);

$res = mysql_query("SELECT * from users where user='{$user}' AND pass='{$pass}'");

这将为您保护代码。任何人都无法DROP上桌。

于 2011-04-09T04:58:25.727 回答
0

试试这个,看看它是否会转储整个表:

For both username and password, I enter:

' OR 1=1 AND '}' '= 

这当然假设我知道您正在使用花括号来包装数据值。

我真的不确定MySQL如何处理这样的混合逻辑,因为它没有括在括号中,所以让我知道它是否有效!

于 2009-10-02T09:21:39.067 回答
0

{} 不是原因。可能是 php 的Magic Quotes(现已弃用)保护您免受相当简单的攻击。

但是,您可以关闭它们,然后再次测试。

于 2009-10-02T09:11:37.417 回答