首先我们要先知道SQL是什么?
SQL是一门数据库语言,它可以让你存储数据和操作数据。
常见的数据库有mysql、SQL sever、oracle、Sybase、db2。
web应用程序对用户输入数据没有进行过滤,或者过滤不严,就把SQL语句带进数据库进行查询。
利用单引号或者双引号或者\(反斜杠)来检测是否存在注入,如果爆出SQL错误,90%可能存在注入。
mysql5.0以上的,Mysql自带information_schema这个数据库,5.0以下是没有的。
information_schema数据库包含三个表:schemata表、tables表、columns表。
schemata表中的schema_name中包含了我们创建的所有数据库的名字。
order by 排序(升序)、desc(降序)、asc(升序)【一般默认升序】
order by是对查询数据进行排序的方法。
select * from 表名 order by 列名(或者数字) asc;
select * from 表名 order by 列名(或者数字) desc;
如:select * from uesr order by id;
可根据参数后面加个asc(结果升序显示)、desc(结果降序显示)来观察其顺序是否改变来判断是否含有order by注入。
select * from 表名 limit 开始位置 结束位置
小插曲--->注释符:--+、#、--(空格) 、;%00(用的较少)都是注释符
1、判断是否存在注入(用单引号或双引号来判断)
2、判断字段数,获取显示位。
3、获取所有数据库名。
4、获取所有表名。
5、获取所有列名。
6、获取所有数据。
相关函数:
database():返回当前网站所用数据库名
Version(): 返回当前数据库版本
User():返回当前数据库用户名
Group_concat():将查询的多行数据合并成一行进行显示,括号里面填入要查询的列名。
例如:select group_concat(属性名) from 表名;
可以先用select version()查看mysql的版本,如果是5.0以上就可以使用infomation_schema的数据库。
如果版本是5.0以下,就去网上搜一些常用的表名做成一个字典,然后进行爆破。
相关语句:
语法格式:select * from 表名 where 对属性的要求 union select +xxxx
要求:多条查询的查询列数是一致的。
如下面这个栗子,前面是查找id和name两个属性,后面需查找的也是两个属性。
如果你后面输入的为1,2,3,则会报错
接下来在天书中来实践一下
一个小插曲:发现在我输入’的时候,页面都不报错。找了好多原因,最终终于解决啦!!解决方法请看作者的另一篇博客(https://blog.csdn.net/qq_45100746/article/details/106231112)
2.再将2后面加入一个',发现报错。说明没有过滤掉引号,这里是一个注入点。
3. 判断表中有几列,用order by+数字来检测。(为什么要检查有多少列?因为前面提的那个要求:多条查询列数一致)
输入4时,发现不存在4列
4.那就继续向数字小的方向试,试3,结果没有报错,说明有3列。
5. 爆显示位,输入union select 1,2,3,发现页面中没有任何变化,是因为显示位只有name、password两个,所以无法输出union后面的。
所以!!一般联合注入语句都会把前面的查询语句设置为假,这样直接输出后面的。像这样,我们把前面的id=-2这就是一个为假的条件。