关于一些SQL注入命令的说明

关于一些SQL注入命令的说明,sql,sql-injection,penetration-testing,ctf,Sql,Sql Injection,Penetration Testing,Ctf,我正在与黑客箱上的CTFCapture The Flag Web Challange进行斗争,我不是渗透测试方面的专家。我请求您帮助我解释一些用于实现解决方案的命令,特别是命令本身的语法和逻辑。这里可以找到对命令的引用,因此您可以非常清楚地了解整个情况 我要求你们非常详细,即使是看起来微不足道的事情。 撇开我所了解的base64编码不谈,我需要了解这些命令及其相关参数命令的语法和逻辑: 1th: {"ID":"1"} 2nd: {"ID": "1' or 1-- -"} 3rd: {"ID"

我正在与黑客箱上的CTFCapture The Flag Web Challange进行斗争,我不是渗透测试方面的专家。我请求您帮助我解释一些用于实现解决方案的命令,特别是命令本身的语法和逻辑。这里可以找到对命令的引用,因此您可以非常清楚地了解整个情况

我要求你们非常详细,即使是看起来微不足道的事情。 撇开我所了解的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注入的基础是插入SQL代码/命令/语法。它通常在WHERE子句中完成,因为webapp通常具有搜索功能,基本上是检索用户输入并将其插入WHERE子句中

例如,假设MySQL和PHP,最简单的漏洞如下:

SELECT * FROM mytable WHERE mycolumn='$_GET[myparam]'
有效负载是您在参数ex:myparam中放入的用于执行SQL注入的内容。 使用这种查询,您可以注入有效负载1'或1=1,以测试SQL注入漏洞

第一有效载荷 第一有效载荷用于检查是否存在可注入或不可注入的注入点参数

如果您更改参数并且输出发生更改,则表示存在注入点。 否则就没有注入点 第二有效载荷 第二个负载用于检查目标应用程序是否存在SQL注入漏洞,应用程序是否会清理用户的输入

如果应用程序显示所有输出,则表示该应用程序存在SQL注入漏洞。说明:因为发送到RDBMS的查询会变成这样 注射前: 选择col1,col2。。。来自mytable的colN,其中col1='myparam'

注射后: 选择col1,col2。。。来自mytable的colN,其中col1='1'或1''

请注意,在MySQL中,-减号空格用于标记内联注释。所以实际的查询是:选择col1,col2。。。来自mytable的colN,其中col1='1'或1

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

如果查询成功且无错误,则应用程序显示输出,则表示应用程序查询选择了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语句不抛出错误时,您可以得到它的列数

那么,我们为什么不使用SELECT1,2来生成一个包含2列的“文字表”?这是因为应用程序的防火墙阻止逗号的使用。因此,我们必须采取迂回的方式,使用JOIN query SELECT*FROM SELECT 1UT1 JOIN SELECT 2UT2 ON 1=1创建两列“文字表”


附加说明:自从MySQL被出售并成为专有版本以来,MariaDB是MySQL的“免费版本”。MariaDB的语法和命令与MySQL大致相同。

黑客攻击的阶段是:侦察、扫描、获取访问权限、维护访问权限和清除跟踪。基本上,它只是获取信息,然后利用这些信息做一些事情 信息这个SQL注入学习模块似乎是用来教你如何获取关于当前系统的信息的

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

例如,假设MySQL和PHP,最简单的漏洞如下:

SELECT * FROM mytable WHERE mycolumn='$_GET[myparam]'
有效负载是您在参数ex:myparam中放入的用于执行SQL注入的内容。 使用这种查询,您可以注入有效负载1'或1=1,以测试SQL注入漏洞

第一有效载荷 第一有效载荷用于检查是否存在可注入或不可注入的注入点参数

如果您更改参数并且输出发生更改,则表示存在注入点。 否则就没有注入点 第二有效载荷 第二个负载用于检查目标应用程序是否存在SQL注入漏洞,应用程序是否会清理用户的输入

如果应用程序显示所有输出,则表示该应用程序存在SQL注入漏洞。说明:因为发送到RDBMS的查询会变成这样 注射前: 选择col1,col2。。。来自mytable的colN,其中col1='myparam'

注射后: 选择col1,col2。。。来自mytable的colN,其中col1='1'或1''

请注意,在MySQL中,-减号空格用于标记内联注释。所以实际的查询是:选择col1,col2。。。来自mytable的colN,其中col1='1'或1

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

如果查询成功且无错误,则应用程序显示输出,则表示应用程序查询选择了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语句不抛出错误时,您可以得到它的列数

那么,我们为什么不使用SELECT1,2来生成一个包含2列的“文字表”?这是因为应用程序的防火墙阻止逗号的使用。因此,我们必须采取迂回的方式,使用JOIN query SELECT*FROM SELECT 1UT1 JOIN SELECT 2UT2 ON 1=1创建两列“文字表”


附加说明:自从MySQL被出售并成为专有版本以来,MariaDB是MySQL的“免费版本”。MariaDB与MySQL的语法和命令大致相同。

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