SQl注入
1、就是后端对用户输入的数据没有进行合法的验证就放在数据库中进行相应的操作,从而导致数据的丢失、破坏、篡改的操作就是sql注入。
2、永真型注入:使用一个引号闭合sql前面的引号,然后在使用or关键字做永真式来非法获取数据。如:' or 1=1 --。当这是一个查询语句的时候,那么将会查询除这个表中的所有的数据, -- 表示注释掉后面的所有内容。
3、关于sql语法的一个注意事项:就是where 后面的条件为 name = ’Bob‘ 这里的Bob一定要加上引号,否则就会将Bob当作一个字段名来查询,也就是说不加引号为字段,加了引号才是相应的字段值。注意:当这里的字段值为数字时可以不用加引号,因为数字时不能作为字段名的,所以数字默认为字段值,如 id = 1 等价于 id =’1‘。
4、使用union关键字查询其他表 或其他数据:
使用union做一个库中的其他表的数据查询,如:select col1 col 2 ... from 表1 where 条件 union select col1 col2 ... from 表2 where 条件;
前面的语句是正常需要查询的语句,但是后面的语句是我们进行sql注入的时候所添加的语句。注意:这里使用union来做联合查询的时候,需要两张表的字段的数量是一样的,不一样则无法获取数据,当两个字段数量不一样的数据,我们可以使用数字的来补齐字段,当我们不知道有多少个字段的时候,我们可以一个一个尝试即可。
5、使用union关键字查询其他库表里的数据:
select col1 col 2 ... from 表1 where 条件 union select col1 col2 ... from 库名.表2 where 条件;使用其他库的库名.表名就可以查询其他库数据。使用union关键字的两个注意点:一是当我们不需要前面正常查询出来的数据的时候,将前面的where的条件改为永假式即可。而是我们虽然查询了其他表或其他的库中的表的数据的时候,我们的字段名依然是union前面表的字段名,但是数据已经不是了。
6、 重点,information_schema 数据库,用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。也就是这个数据库中记录了整个数据库中所有的数据的结构信息,比如说整个库中有哪些表,那些字段,那些库,information_schema库中都有记录。我们可以通过这个来获取我们想要表的表名,列名等等相关的信息。
7、手动注入方式:
①错误注入:就是故意构造错误的语句,如输入一个单引号’ 如果返回的是一个错误信息,则说明就有注入点。发明会错误说明他就能接收单引号。不是为了注入而是看看 是否存在 注入点。
②布尔注入:真或者假,使用逻辑or和and构造sql语句进行注入。
③union注入:需要猜测字段数。... union select 1,2,3.。。。from 表名 -- ‘;字段少了就补,字段多了就是用concat函数进行字段的合并。
④时间盲注:使用sleep函数,测试是否有注入点。1’ and sleep(5) --‘;这就表示休眠5秒,如果这个成功休眠5秒说明这里有注入点。
8、自动注入(sqlmap):
检查是否具有注入点:网址/id=值 。这里的id就是输入框提交数据给后台,检测这里是否具有注入点。sqlmap -u “网址/id=值” ;
如果存在注入点:使用相应参数获取数据,sqlmap “网址/id=值” --dbs
--dbs:夺取所有的数据库
--users:获取所有用户
--surrent-user:返回当前用户
-D 库名 --tables:获取指定库中的所有表
-D 库名 -T 表名 --columns:获取指定库中的指定表的所有列
-D 库名 -T 表名 --dump:将指定库中的指定表的所有数据dump下来
--dump-all : 数据库中的所有数据dump下来
注入未登录的页面:使用一登陆的cookie作为参数携带上进行注入和检测注入点。