【问题标题】:Clarifications about some SQL Injection commands关于一些 SQL 注入命令的说明
【发布时间】:2020-04-28 22:54:52
【问题描述】:

我在 hackthebox 上的 CTF(Capture The Flag)Web 挑战中苦苦挣扎,我不是渗透测试方面的专家,我请求您帮助解释我(使用一些 cmets)一些用于达到解决方案的命令,特别是关于命令本身的语法和逻辑。 (可以在此处找到对命令的引用 (click me),因此您对整个情况非常清楚。

我要求您非常详细,即使是看起来微不足道的事情。 撇开base64编码(我理解)我需要理解这些命令及其相关参数(命令的语法和逻辑):

1th: {"ID":"1"}

2nd: {"ID": "1' or 1-- -"}

3rd: {"ID": "-1' union select * from (select 1)table1 JOIN (SELECT 2)table2 on 1=1-- -"}

关于第三条命令,我看到了相同的命令,但表名有所改变,如下所示:

{"ID": "-1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1-- -"}

有什么区别?查询中表的名称是否无关紧要?

如果您需要进一步说明,或者我没有说清楚,请直接告诉我,我会尽力帮助您。提前谢谢你。

【问题讨论】:

  • 恕我直言,如果您改为显示完整的 SQL 查询,而不仅仅是其中的一个片段,然后指出您不清楚的部分,那么您的问题会更好。
  • 我似乎在您提供的页面上找不到 sql 注入有效负载 -1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1-- -。但我猜它是用来测试WAF是否会阻止包含单词union的payload。
  • @TimBiegeleisen 这是完整的 SQL 查询。不要忘记这是一个网络挑战,你要做一个 SQL 注入攻击,你不知道背后是什么。我不清楚的是查询的语法
  • @Kristian 没错。 WAF 过滤掉了关键字和符号,例如逗号,所以这个查询被这样制定,以避免使用逗号并绕过 WAF。关于另一个查询,它取自我无法向您展示的 pdf,但相信我,它会产生相同且相同的结果,但我想了解语法,因为我从未见过这样的查询,特别是“来自”参数:select * from (select 1)UT1

标签: sql sql-injection penetration-testing ctf


【解决方案1】:

黑客攻击的阶段是:侦察、扫描、获取访问权限、维护访问权限和清除踪迹。基本上就是obtain information,然后是do something with that information 貌似这个SQL注入学习模块是用来教如何获取当前系统的信息的。

SQL注入的基础是插入SQL代码/命令/语法。它通常在 WHERE 子句中完成(因为 webapp 通常具有搜索功能,它基本上是检索用户输入并将其插入到 where 子句中。

例如,最简单的漏洞是这样的(假设 MySQL 和 PHP):

SELECT * FROM mytable WHERE mycolumn='$_GET[myparam]'

有效负载是您放入参数(例如:myparam)中以执行 SQL 注入的内容。 通过这样的查询,你可以注入payload1' OR 1=1来测试SQL注入漏洞。

第一个有效载荷

第一个payload用于检查是否有注入点(可以注入的参数)。

  • 如果更改参数并且输出发生变化,则表示存在注入点。
  • 否则没有注入点

第二个有效载荷

第二个有效载荷用于检查目标应用程序是否存在 SQL 注入漏洞(应用程序是否会清理用户的输入)。

  • 如果应用显示所有输出,则表示该应用存在 SQL 注入漏洞。解释:因为发送到 RDBMS 的查询会变成这样

注射前: SELECT col1, col2, ... colN FROM mytable WHERE col1='myparam'

注射后: SELECT col1, col2, ... colN FROM mytable WHERE col1='1' or 1-- -'

请注意,在 MySQL 中,-- (minus-minus-space) 用于标记内联注释。所以实际的查询是:SELECT col1, col2, ... colN FROM mytable WHERE col1='1' or 1

第三个有效载荷

第三个有效载荷用于检查查询将选择多少列。要理解这一点,您必须了解subqueryjoinunion(快速搜索一下,这是一个非常基本的概念)。名称或表别名并不重要(UT1 或 UT2),它只是标识符,因此它与当前表别名不同。

  • 如果查询成功(无错误,app显示输出),则表示app查询SELECTs 2列
  • 如果查询失败,则表示它不是 2 列,您可以更改有效负载以检查 3 列、4 列等...

检查 SELECT 语句是否有 3 列的示例:

-1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1 JOIN (SELECT 3)UT3 on 1=1 -- -

提示:在学习 SQL 注入时,只需将有效负载键入(或复制粘贴)到 SQL 控制台(如果查询被认为是危险的,则使用虚拟机或沙箱)要容易得多。

编辑 1:

子查询和联合的基本解释

子查询:它基本上是将一个查询放在另一个查询中。子查询可以插入到 SELECT 子句、FROM 子句和 WHERE 子句中。

FROM 子句中的子查询示例:

select * from (select 'hello','world','foo','bar')x;

WHERE 子句中的子查询示例:

select * from tblsample t1 where t1.price>(select avg(t2.price) from tblsample t2);

联合:连接选择输出,示例:

tbl1
+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
|  2 | John   | Doe       | 022  |
+----+--------+-----------+------+
tbl2
+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | AAAAAA | DDDDDDDDD | 022  |
|  2 | BBBB   | CCC       | 022  |
+----+--------+-----------+------+

select * from tbl1 union select * from tbl2
+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
|  2 | John   | Doe       | 022  |
|  1 | AAAAAA | DDDDDDDDD | 022  |
|  2 | BBBB   | CCC       | 022  |
+----+--------+-----------+------+

编辑 2:

关于第三个有效载荷的进一步解释

在 mysql 中,您可以通过选择一个值来创建一个“文字表”。这是一个例子:

MariaDB [(none)]> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

MariaDB [(none)]> SELECT 1,2;
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
+---+---+
1 row in set (0.00 sec)

MariaDB [(none)]> SELECT 1 firstcol, 2 secondcol;
+----------+-----------+
| firstcol | secondcol |
+----------+-----------+
|        1 |         2 |
+----------+-----------+
1 row in set (0.00 sec)

制作这个“文字表”的目的是检查我们注入的 SELECT 语句有多少列。例如:

MariaDB [(none)]> SELECT 1 firstcol, 2 secondcol UNION SELECT 3 thirdcol, 4 fourthcol;
+----------+-----------+
| firstcol | secondcol |
+----------+-----------+
|        1 |         2 |
|        3 |         4 |
+----------+-----------+
2 rows in set (0.07 sec)

MariaDB [(none)]> SELECT 1 firstcol, 2 secondcol UNION SELECT 3 thirdcol, 4 fourthcol, 5 fifthcol;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

如上图,当在两个列数不同的select语句上使用UNION时,会报错。因此,当 SELECT 语句不抛出错误时,您可以获得多少列。

那么,我们为什么不直接使用SELECT 1, 2 来生成一个包含 2 列的“文字表”呢?那是因为应用程序的防火墙阻止了逗号的使用。因此,我们必须绕道而行,使用 JOIN 查询 SELECT * FROM (SELECT 1)UT1 JOIN (SELECT 2)UT2 ON 1=1 制作 2 列“文字表”

MariaDB [(none)]> SELECT * FROM (SELECT 1)UT1 JOIN (SELECT 2)UT2 ON 1=1;
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
+---+---+
1 row in set (0.01 sec)

附加说明:MariaDB 是 MySQL 的“免费版本”(因为 MySQL 已出售并成为专有版本)。 MariaDB 与 MySQL 保持或多或少相同的语法和命令。

【讨论】:

  • 您的解释无可挑剔。但我希望你更好地解释的唯一一件事是子查询,在第三个查询的句法和语义级别上: {"ID": "-1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1---"},我想了解这部分:"(select 1)UT1";所以,UT1 它是一个标识符,我可以随意命名,但什么是“select 1”?它是一个价值吗?还是列名?这个查询是为了避免使用逗号而组成的,但是,如果我必须使用逗号,它会是什么样子?最后一件事,我会关闭,提前谢谢你
  • 查询 SELECT 1 将创建一个 1x1 表(1 列,1 行),列名为 1,行包含 1。如果您可以使用逗号,那么您可以将查询更改为:-1' union select 1, 2 -- -
  • @Zoythrus 编辑了我的答案,请检查它是否有助于您理解
  • 所以,如果我理解正确,“SELECT * FROM (SELECT 1)UT1 JOIN (SELECT 2)UT2 ON 1=1--”它是“-1' union select 1 的等效查询, 2 --" 不使用逗号,不是吗?但奇怪的是它只是一个没有 FROM 的 SELECT
  • 我以为逗号查询是这样的:{"ID":"-1 union SELECT * FROM table1,table2 -- -},所以错了?
猜你喜欢
  • 2011-09-13
  • 2012-09-04
  • 2013-02-24
  • 2015-06-22
  • 2011-06-17
  • 2011-02-04
  • 1970-01-01
  • 2021-09-28
  • 2019-05-14
相关资源
最近更新 更多