首先说明sql注入的基本步骤:
1.判断是否有注入(判断是否严格校验)——第一个要素
1)可控参数的改变能否影响页面显示结果
2)输入的sql语句是否能报错--能通过数据库的报错看到一些数据库的语句痕迹
3)输入的sql语句能否不报错——我们的语句可以成功闭合
2.判断是什么类型的注入
3.语句是否能够被恶意修改(如添加单引号,双引号等)——第二个要素
4.是否能够成功执行——第三个要素
5.获取我们想要的数据
数据库->表->字段->值
以单引号注入为例
环境选择:sqli-labs-less1
使用工具:HackBar(Firefox上的插件)
具体步骤:
1.使用HackBar将less1的URL放入插件中并在URL 末尾加上“?id=1"
2.将"id=1"改为"id=2",发现页面产生了变化,说明了可控参数的改变影响了页面的显示
3.通过加入新的语句使页面产生报错
这里我们可以发现当在id=1后面加入单引号“ ' "之后,页面产生了报错
4.将id=1'改为id=12',从而进一步判断注入类型
我们可以发现鼠标高亮部分其实就是我们输入的值,通过观察页面的报错提示可以发现我们的输入值其实是由两个单引号包裹的,初步判断注入类型为单引号注入。
5.在id=1' 后加上 "--+"即注释符号可将注释符号后的语句全部注释,这样我们就可以在注释符号前写入sql语句,使用order by语句判断数据库列数(order by n,当n小于等于真实列数时,页面不报错。当n大于真实列数时,页面报错)
报错情况:
不报错情况:
最后得出列数为3
6.使用联合查询语句(union select 1,2,3)
在union select 前加入 “and 0" 前部语句条件为假
可以发现联合查询出中2,3分别在页面中显示
7.使用sql语句查询数据库中所有的表名
具体语句:?id=1' and 0 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+ (其中table_name为表名;information_schema为数据库;tables用于存储information_schema数据库下所有的表名;table_schema代表数据库名,database()指具体的数据库名,group_concat函数:查询所有)
information_schema下的主要表:
schemata: 存储所有数据库名 schema_name表示数据库名
tables: 存储information_schema数据库下所有的表名(内含table_name(表名))
columns: 里面有重要的三列table_schema(数据库名)table_name(表名)column_name(字段名)
database(): 当前数据库名
8.sql语句查询字段名
具体语句:?id=1' and 0 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='emails' --+
9.sql语句获取具体用户名和邮箱
具体语句:?id=1' and 0 union select 1,group_concat(concat_ws(':',id,email_id)),3 from emails --+
其中:concat_ws("a",b,c):用a将b和c连接起来
这样我们就得到了这个数据库下用户的具体信息了!