【问题标题】:Basic sql injection基本sql注入
【发布时间】:2016-05-01 16:52:13
【问题描述】:

我正在努力学习 SQL 注入,以便将来保护自己。

这是 PHP 代码:

  $req = mysql_query("INSERT INTO ip_change VALUES('', '".$_SESSION['id']."', '".$_POST['raison']."')") or die(mysql_error());

并且用户可以完全控制 $_POST['raison'] 内容。

当我使用 'hello 作为 $_POST['raison'] 值时,我得到

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行的'hello')' 附近

当我使用 '); DELETE * FROM tabledetest;") or die(mysql_error());-- 作为 $_POST['raison'] 值时,我得到

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在'DELETE * FROM tabledetest;") 或 die(mysql_error());--')' 附近 1

所以我不明白为什么我的请求没有被注入并且我无法删除我的 tabledetest 表。

任何帮助将不胜感激。

【问题讨论】:

  • 你应该停止使用mysql,开始使用mysqli或PDO。
  • @Amous 讽刺的是,就本练习而言,它实际上是最好的工具。这是出了名的缺陷。
  • mysql_query 接口非常糟糕,以至于它在 PHP 7 中被删除。如果您尝试编写安全代码,您必须使用类似mysqli 或 PDO以准备好的语句作为绝对最低限度。通常最好使用像 DoctrinePropel 这样的 ORM 来包裹您的数据库,这会使开发更加愉快,或者更好的是,使用像 Laravel 这样的 development framework 这样可以为您提供更多支持。
  • 来自mysql_query() 的文档 - mysql_query() 发送一个唯一查询(不支持多个查询)。这就是第二个代码失败的原因,因为 mysql_query() 只允许 1 个查询,所以 ; 之后的任何内容都会抛出错误
  • 默认情况下您不能运行多个命令,想象一下:SELECT * FROM user WHERE username = '{$_POST['username']}' AND email = '{$_POST['email']}'。现在,这应该是安全的,因为用户需要知道用户名和电子邮件,但是admin' -- 的用户名意味着我们不必知道管理员电子邮件,因为-- 将使查询的其余部分成为评论.您还可以开始加入其他表并获取您不允许查看的信息。

标签: php mysql


【解决方案1】:

那是因为你没有做正确的注射!

这是你所做的。自动格式化会提示你:

<?php
$_SESSION['id'] = "123"; //Just assume

$req = mysql_query("INSERT INTO ip_change VALUES('', '123', ''hello')") or die(mysql_error());

它没有正确结束语句。

下一个:

$req = mysql_query("INSERT INTO ip_change VALUES('', '123', ''); DELETE * FROM tabledetest;") or die(mysql_error());--')") or die(mysql_error());
  1. 来自the manual:

mysql_query() 发送一个唯一查询(多个查询不 支持) 到服务器上当前活动的数据库 与指定的 link_identifier 关联。

mysqli 支持multiple statements

  1. -- 不能评论 PHP 代码! PHP 注释为//#

一些可能对您有所帮助的链接:[类似于您的问题]

  1. https://en.wikibooks.org/wiki/PHP_Programming/SQL_Injection_Attacks
  2. http://roshanbh.com.np/2007/12/sql-injection-attack-examples-and-preventions-in-php.html
  3. SQL injection test - mysql_query

【讨论】:

  • 现在的问题是让非工作注入做坏事。
  • 我已经解释了 OP 的问题:我不明白为什么我的请求没有被注入
  • 我得到了这么多,但你能让它正确注入吗?
  • 谢谢 Thamizhan 这是否意味着由于 mysql_query() 不支持多个查询,所以我可以安全地免受这种不安全查询的此类攻击?这是否意味着我不能用这个缺陷删除我的 tabledetest ?如果是这样,您如何建议我更改该 php 代码以使其可注入?
  • @shrimpdrake 绝对是,mysql_* 消除了一种 SQL 注入。如果你想使用多个语句,你应该选择mysqli_*。我已经在答案中提到了,接近尾声
【解决方案2】:

为了防止 SQL 注入,您不应该直接注入变量来查询,而是使用 Prepared Statements

【讨论】:

  • 在这种情况下,OP 想要直接注入变量,正如开头所说的那样我正在尝试学习 SQL 注入,以便将来保护自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多