SQL注入和联合查询注入

首先我们要先知道SQL是什么?

一、SQL是什么?

SQL是一门数据库语言,它可以让你存储数据和操作数据。

常见的数据库有mysql、SQL sever、oracle、Sybase、db2。

二、SQL注入的原理:

web应用程序对用户输入数据没有进行过滤,或者过滤不严,就把SQL语句带进数据库进行查询。

三、SQL注入的检测:

利用单引号或者双引号或者\(反斜杠)来检测是否存在注入,如果爆出SQL错误,90%可能存在注入。

四、information_schema

mysql5.0以上的,Mysql自带information_schema这个数据库,5.0以下是没有的。

information_schema数据库包含三个表:schemata表、tables表、columns表。

schemata表中的schema_name中包含了我们创建的所有数据库的名字。

五、order by

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注入。

六、limit 控制输出

select * from  表名 limit 开始位置 结束位置

小插曲--->注释符:--+、#、--(空格) 、;%00(用的较少)都是注释符

七、联合查询注入流程

1、判断是否存在注入(用单引号或双引号来判断)

2、判断字段数,获取显示位。

3、获取所有数据库名。

4、获取所有表名。

5、获取所有列名。

6、获取所有数据。

相关函数:

database():返回当前网站所用数据库名

Version(): 返回当前数据库版本

User():返回当前数据库用户名

Group_concat():将查询的多行数据合并成一行进行显示,括号里面填入要查询的列名。

例如:select group_concat(属性名) from 表名;

      SQL注入和联合查询注入_第1张图片

 

可以先用select version()查看mysql的版本,如果是5.0以上就可以使用infomation_schema的数据库。

如果版本是5.0以下,就去网上搜一些常用的表名做成一个字典,然后进行爆破。

相关语句:

  • union select:联合查询,连接上一条查询,合并查询。
  • order by:对查询结果进行排序,用法是 order by+列名,在SQL注入中接数字,从而判断列数。
  • limit n,m:从表中第n条数据开始,读取m个。

八、联合查询注入

语法格式:select * from 表名 where 对属性的要求 union select +xxxx

要求:多条查询的查询列数是一致的。

如下面这个栗子,前面是查找id和name两个属性,后面需查找的也是两个属性。

SQL注入和联合查询注入_第2张图片

如果你后面输入的为1,2,3,则会报错

接下来在天书中来实践一下

一个小插曲:发现在我输入’的时候,页面都不报错。找了好多原因,最终终于解决啦!!解决方法请看作者的另一篇博客(https://blog.csdn.net/qq_45100746/article/details/106231112)

  1.  先在url中输入?id=2,得到如下页面

SQL注入和联合查询注入_第3张图片

      2.再将2后面加入一个',发现报错。说明没有过滤掉引号,这里是一个注入点。

SQL注入和联合查询注入_第4张图片

      3. 判断表中有几列,用order by+数字来检测。(为什么要检查有多少列?因为前面提的那个要求:多条查询列数一致)

        输入4时,发现不存在4列

SQL注入和联合查询注入_第5张图片

        4.那就继续向数字小的方向试,试3,结果没有报错,说明有3列。

SQL注入和联合查询注入_第6张图片 

    5. 爆显示位,输入union select 1,2,3,发现页面中没有任何变化,是因为显示位只有name、password两个,所以无法输出union后面的。

SQL注入和联合查询注入_第7张图片

所以!!一般联合注入语句都会把前面的查询语句设置为假,这样直接输出后面的。像这样,我们把前面的id=-2这就是一个为假的条件。

SQL注入和联合查询注入_第8张图片

九、联合查询注入的利用

  • 爆显示位(上面提到的)
  • 爆数据库版本和名字(用到上面所提的version()、database()函数),页面上显示的5.7.26是mysql的版本,security是网站当前所用的数据库的名字。

SQL注入和联合查询注入_第9张图片

  • 查询当前库中所有的表名,在后面输入?id=-2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

SQL注入和联合查询注入_第10张图片

  • 查表中的所有列名,url中联合注入查询为union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails' --+(以emails表为例)

SQL注入和联合查询注入_第11张图片

  • 爆出数据库中所有数据

十、联合查询注入Bypass

  • 过滤了union等关键字。如果是采用str_ireplace(),可以采用双写来进行绕过。因为str_ireplace()函数的特征是对关键字只过滤删除一次,所以双写还会留下一个关键字。如:uunionnion。
  • 过滤了or and 等关键字。------>利用&& || 绕过。
  • 过滤空格。------->用+号绕过。

 

 

你可能感兴趣的:(WEB漏洞)