【问题标题】:need assistance with sql injection在 sql 注入方面需要帮助
【发布时间】:2011-12-06 11:27:09
【问题描述】:

首先,我并没有试图破解或做任何非法的事情。以为我让你们知道。我有一个客户希望我对他的系统进行一些修改,当我查看它时,我注意到没有任何东西被逃脱。我不是在开玩笑,什么都没有逃脱。我向他解释说,拥有这样的系统是不安全的。然后他继续告诉我,他的系统像这样已经好几年了,但什么也没发生。我需要向他展示他的系统不安全,但我真的不知道执行 sql 注入。以下是一些使用 $_GET 且未转义的查询。

SELECT *,DATE_FORMAT(joined,'%M %d, %Y') as \"Joined\" FROM `members` WHERE `name` LIKE '".$ltr."%' ORDER BY points DESC LIMIT $page,50

这是另一个:

SELECT * FROM groups WHERE id=$thisladder[grid]

我看到“可能”清理 $_GET 的唯一内容是这个函数:

if (!ini_get('register_globals')) {
   $superglobals = array($_SERVER, $_ENV,
       $_FILES, $_COOKIE, $_POST, $_GET);
   if (isset($_SESSION)) {
       array_unshift($superglobals, $_SESSION);
   }
   foreach ($superglobals as $superglobal) {
       extract($superglobal, EXTR_SKIP);
   }
}

上面的函数可能正在清理变量。是的,系统还使用寄存器全局变量,这也很糟糕。

我也做了备份,以防万一。

【问题讨论】:

  • 您想知道如何防止 SQL 注入,或者向您的客户证明它是不安全的吗?
  • 哦,伙计,它们不仅不会逃避任何东西,而且如果 register_globals 功能被禁用,它们会明确模拟它!这是第一次!
  • 不知道怎么证明。但我确实知道 mysql_real_escape 和prepared statements 是要走的路。
  • "...他的系统像这样已经好几年了,但什么也没发生。"按照同样的逻辑,他应该得出结论,“我以前从来没有出过车祸,所以我不需要系安全带。”
  • 只是因为你的社交能力不够好,无法告诉你工作的人需要解决的问题,你需要从技术上解决这个问题吗?你最好从根本上解决你的问题。不要告诉其他人你不熟悉 SQL 注入。

标签: php sql sql-injection


【解决方案1】:

不能说比http://xkcd.com/327/ 更好。

但话又说回来,正如Marc B 所说,忘记 SQL 注入,register_globals 更糟糕。没想到我真的会看到它仿真,以防万一它关闭了。

【讨论】:

  • 天哪,我们真是书呆子,看到这些图片笑得停不下来,哈哈。所以全局变量比注射更糟糕? o_0
【解决方案2】:

如果登录代码看起来像这样:

$query = 'SELECT id FROM users WHERE username=\''.$_POST['username'].'\' AND password=\''.$_POST[password].'\'';
$result = mysql_query($query);
etc, etc...

尝试在登录字段中输入此内容

username = "whatever"
password = "' OR 1"

有意义吗?

【讨论】:

  • 密码是散列的。所以我猜这个脚本还不错:/
  • 然后使用“' OR 1”作为用户名。
  • 请注意,我不擅长 sql 注入。所以我只需输入' OR 1 ?
  • @user962449,您可以使用“admin'--”之类的名称作为用户名。这将使查询类似于SELECT id FROM users WHERE username='admin' -- ' AND ...-- 之后的任何内容都是评论。
  • @Radu 好电话。这样,如果您知道他的用户名,您就可以作为老板登录。
【解决方案3】:

一些有趣的事情可以向你的“朋友”展示他的代码有多愚蠢:

http://example.com/badscript.php?_GET[]=ha+ha+I+pwned+your+GET+superglobal
http://example.com/badscript.php?_SESSION[issuperuser]=1

这种事情是完全为什么 register_globals 是一个彻头彻尾的愚蠢想法,并且(在 FAR 太久之后)最终被设为默认为 OFF。

忘记了 SQL 注入 - 那段愚蠢的代码允许远程 PHP 变量注入。

【讨论】:

  • @Marc B:我不同意,无论注册全局变量是否打开,该代码都不起作用。 $_SESSION 如果它关闭并且会话尚未初始化,则可能会被覆盖,但 session_start 无论如何都会删除它。在 register globals 设置为 on 之前,您可能希望引用 PHP 版本。
  • @hakre:确实如此,会话完全取决于相对于伪寄存器全局变量何时调用 session_start。只是用它来演示如何可能是 BAD register_globals。
  • @MarcB:伪寄存器全局变量实际上使用EXTR_SKIP。因此,如果会话已启动,它将无法正常工作。如果会话稍后启动,$_SESSION 数组无论如何都会被重置。但是使用 register_globals 曾经有一段时间,这些东西实际上是可能的 ^^ ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2011-04-02
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多