这只是为了学习目的。我想从 MySQL 服务器中的表中获取所有用户名和密码,其中“魔术引号”已被禁用。在用户名的输入中:我输入了类似的内容:
username'; SELECT * FROM users;
但是我怎样才能得到我的注入查询的输入呢?我做了一些研究,发现sp_makewebtask在 Microsoft SQL server 中,可以将 .html 文件输出到共享文件夹。我怎样才能在 MySQL 中做到这一点?或者,还有更好的方法?非常感谢。
这只是为了学习目的。我想从 MySQL 服务器中的表中获取所有用户名和密码,其中“魔术引号”已被禁用。在用户名的输入中:我输入了类似的内容:
username'; SELECT * FROM users;
但是我怎样才能得到我的注入查询的输入呢?我做了一些研究,发现sp_makewebtask在 Microsoft SQL server 中,可以将 .html 文件输出到共享文件夹。我怎样才能在 MySQL 中做到这一点?或者,还有更好的方法?非常感谢。
您的方法的问题是 PHP 不会(好的,正如评论中指出的那样,有可能,但不太可能)执行多个同时查询,并且当您用半-冒号,然后尝试在SELECT. 您将不得不UNION或UNION ALL他们。
username'; SELECT * FROM users;
应该类似于:
username='admin' UNION ALL SELECT CONCAT(username, 0x3A, password) AS details FROM users LIMIT 0,1;
阅读此链接以了解 MySQL 的 UNION 语法http://dev.mysql.com/doc/refman/5.0/en/union.html
SQL注入有两种主要类型,它们是盲目的和基于错误的。
盲区是您不会从给定查询中获得任何输出的地方,您可能只是注意到页面中缺少一段文本或图像或其他内容,并且您必须枚举各种选项以获得所需的结果。
顾名思义,基于错误是脚本将抛出错误的地方,您可以准确地看到您需要做什么。您将在页面的某处或至少在页面的源代码中看到注入的结果。
在所有情况下,您都应该能够使用 MySQL 的INTO OUTFILE语法将查询结果输出到文件中,前提是您具有这样做的正确权限。
http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
这适用于大多数 MySQL 注入情况,但是,SQLi 的类型不止两种,但就本次讨论而言,它们是您需要了解的主要类型。
这是关于 SQL 注入的一个很好的教程:http ://www.exploit-db.com/papers/13045/
好吧,有像SQLMap这样的工具可以为你做这件事,不幸的是,我不够聪明,无法确切地知道他们是如何获取这些数据的。使用 SQLMap,您可以输出许多内容,例如数据库名称、表名称、表列、表数据等。
但是,我可以举例说明如何在非常特定的场景中输出数据。您很少谈论 SQL 注入攻击的上下文,因此很难说这是否适用于您的情况。
例如,假设您有一个网页,该网页输出如下所示的小表格:
Product Name | Price
----------------------
Door knobs | $5.00
Hammers | $10.00
Saws | $12.00
根据底层查询和编程的设置方式,可能会返回将显示在该表中的其他数据。假设您确定search查询字符串参数可在以下 URL 中注入:
http://mysite.com/store.php?search=hardware
如果您能够制作如下所示的查询(出于演示目的将攻击保留为纯文本):
http://mysite.com/store.php?search=blah';SELECT username, password FROM USERS where '1'='1
该站点可能以这样一种方式进行编程,即它只需要返回任何两列并将它们吐出到表格中。
同样,这是一个非常具体的例子。SQLMap 方法似乎无论如何都可以工作,所以我很想知道是否有人知道他们在做什么。
通常,从 SQL 获取的值会显示在页面的某处。因此,例如,如果查询正在获取名称 ( Select name from users where id=%s),则注入类似1;select top 1 columnname from (your query here);--. 根据数据库和实现,可能有也可能没有一种方法可以使用单个命令转储整个表(否则我们总是可以枚举表行)。
在其他情况下,可以诱使应用程序显示 SQL 错误。在这种情况下,您可以尝试使用查询(返回 1x1 输出)作为列名,例如select (your query here) from somerandomtable;. 通常,这将返回一个错误(因为该列将不存在),其中建议的列名将被公开。
您可以通过将其放在某处来做到这一点:例如 SELECT ... INTO OUTFILE。(http://dev.mysql.com/doc/refman/5.0/en/select-into.html)
之后,您可以使用 load_file() 覆盖字段,该字段将文件作为单个字符串返回,并在应用程序读取和显示的单行中填充已知字段。
(例如:“UPDATE Accounts SET bio=load_file('/etc/passwd') WHERE UserName='prettypinkponi3s';”
您甚至可以跳过该步骤,直接在原始注入中使用更新。这就是重点。
如果你是盲注,你可以利用应用程序缺乏从数据库到渲染语言的输入验证。你必须找到一些值来保存你试图提取的数据。(个人资料图片、简历、描述字段等)