一、And Or 操作符
and 与运算
or 或运算
二、MySQL注释符
单行注释
多行注释
三、SQL注入
数字型注入
我们看到例题:
当我们输入id=1的时候就会返回id=1的数据
那么我们只需要在1后拼接or 1=1%23,就可以拿到当前表单里面所有的数据,完整代码如下:
id=1 or 1=1 %23 #%23就是井号 在我们注入的时候一定要使用url编码的形式不然会有错误
输入后,就返回了当前表单的所有数据,我们再来试着研究一下原理:
数据库查询的过程:
上面的查询过程有一个username表,数据库会先把所有数据都取出来,第一步里面取出来了两个数据分别是amdin和guest接着,把我们要查询的字符和数据库里面的字符进行对比,先用admin 和 传入的 admin进行对比,结果是为真,接着是拿guest 和 admin 进行对比,结果为假,那么返回的只有 admin 这一行的数据。如果这个时候我们在第三行再加一个admin,那么数据库就会返回两行的数据。
防御方法
字符型注入
我们直接看例题:
当我们输入错误的密码时,不会正常输出:
我们这里在知道账号的情况下可以使用and来拼接,也就是当我们在账号那里输入admin' and 1=1%23
因为我们知道账户,所以拼接一个and 1=1 账号是存在的同时1=1,那么密码就算是错误的但也可以得到服务器的返回值:
username=admin' and 1=1%23&password=i
我们把输入后的语句拼接到数据库里面看看,数据库最终执行的语句是什么样子的:
因为有注释符的存在后面的语句就都被注释了,就不存在了,也就是只有前面的语句会被执行,那么当我们不知道账号的情况下可以用or来拼接,也就是:
a' or 1=1%23
服务器返回了数据库内所有的数据,因为我们上的语句用了or那么意味着,不管我输入的账号对不对,因为1=1所以服务器匹配到的数据都为真,那么就输出了所有的数据