什么是SQL注入
简单来说,SQL注入就是因为程序未能正确处理用户输入,导致用户输入的恶意代码被错误地执行,从而使攻击者能够访问或修改数据库中的信息。
举个例子
我们使用pikachu来简单复现一下sql注入并展示一下在一次sql注入中都发生了什么。
1、初始页面:
2、正常查询:我们输入用户名为lili,查询结果如下:
3、我们使用恶意语句 ' or 1=1 ; -- :
这个过程发生了什么呢,我们看一下后台处理用户请求的逻辑:
1、通过开发者模式,我们知道这里使用post请求,将name=' or 1=1 ; -- 参数发送给后端。
2、通过url信息,我们找到sqli_str.php文件并打开查看。我们找到后端查询语句为select id,email from member where username='$name'。我们再把我们输入带进来:
$name会获取我们的输入 ' or 1=1 ; --
所以后端的本次查询语句为:select id,email from member where username='' or 1=1 ; -- '
为什么 or 1 = 1有这么大威力呢
where true会返回所有行的信息,当mysql接收到where username='' or 1=1,会返回username为空和所有行的信息。
1=1会返回一个bool值,为TRUE。同时我们也可以用1、2、3等数字或者true来代替。
where ture会返回所有行的信息,where会寻找行,存在的行都为真。
这里有一点需要说明一下,如果使用where 列名 = TRUE的话,会返回这一列中含有bool值为TRUE的行。所以下面select * from verifys where name = TRUE;语句返回结果为空。
以下为验证结果验证一下:
mysql> select * from verifys;
+----+----------+------+------+
| id | apikey | name | bool |
+----+----------+------+------+
| 1 | 87654321 | lili | 1 |
| 2 | 12345678 | bob | 0 |
| 3 | 00000000 | NULL | NULL |
| 4 | 88888888 | lucy | NULL |
+----+----------+------+------+
4 rows in set (0.00 sec)
mysql> select bool from verifys where TRUE;
+------+
| bool |
+------+
| 1 |
| 0 |
| NULL |
| NULL |
+------+
4 rows in set (0.00 sec)
mysql> select bool from verifys where 1=1;
+------+
| bool |
+------+
| 1 |
| 0 |
| NULL |
| NULL |
+------+
4 rows in set (0.00 sec)
mysql> select bool from verifys where 1;
+------+
| bool |
+------+
| 1 |
| 0 |
| NULL |
| NULL |
+------+
4 rows in set (0.00 sec)
mysql> select bool from verifys where bool = TRUE;
+------+
| bool |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> select * from verifys where name = TRUE;
Empty set, 1 warning (0.00 sec)