本文随后发于个人博客站,题图来源NASA
本系列所提及的任何操作,均应在符合相关法律法规下进行
本系列只涉及理论操作
具体实践可以通过在线使用实验吧,加入公众号
玄魂工作室
的课程等方法
本教程感谢玄魂工作室的支持
背景简介
什么是数据库
我们日常访问的网站,里面存储了大量的信息。如何让这些信息在我们想要的时候显示出来,而不是什么都显示出来,这就涉及到一个叫数据库的东西了。
数据库,顾名思义,里面存储的都是各类数据。我们访问不同的网页,登陆一个网站,本质上就是对于数据库的一次操作。为了方便不同的数据库之间的操作,有一门语言诞生了,就是SQL语句。详细的SQL语句教程可以查阅网上相关内容(本人是查看学习了自强学堂的相关课程https://code.ziqiangxuetang.com/sql/sql-tutorial.html)
访问网页方法
访问网页,很多人想到的是通过各类浏览器进行访问。但从数据包的层面上讲,访问一个页面只有两种方法,GET方法和POST方法。具体差异就不详细讲了。不是计算机相关专业的就不要区分这两个的差异了。大体上,登陆页面或者查询页面一般是需要POST方法的,其他的大多数是使用GET方法。
环境搭建
今天我们的测试使用的是开源SQL注入测试靶机。由于手动注入耗时长又难以解释,本期就主要讲解sqlmap的使用方法。
sqlmap是基于python的一个脚本,所以想要运行sqlmap,python是必须要有的。kali里面集成了sqlmap,所以我们不需要考虑sqlmap运行环境问题。
本次实验用到的靶机是基于开源sql注入练习项目的。
首先安装lamp或者lnmp环境,在网站根目录下面git同步项目(git clone https://github.com/Audi-1/sqli-labs.git),修改文件夹权限使得可以web访问,修改配置文件(位于clone下来的文件夹下面的sql-connections文件夹下面的db-creds.inc)中数据库的用户名密码。浏览器中运行setup.php即可完成配置。(查看readme可获得详细解答)
配置如图所示即可。第一块马赛克是数据库用户名,第二块马赛克是用户名对应的密码。(一头雾水?查看Linux系列教程啊~)
抓包
先说抓包。大体上,抓包可以分为两大类,一类是以wireshark为代表的,监控网卡流量,但不对流量进行任何拦截,通常用来做流量审计用;另一类是以burp suite为代表的,用来抓取浏览器产生的数据包,会对每个流量包进行拦截,便于修改。(其实是两者在一定程度上是可以相互代替的,但是这两者的主要方向是由这两大差异的)我们主要讲一下burp suite(以下简称BP)的使用。kali里面的BP虽然是免费版,但也够我们使用了。
BP设置
首先,我们要在BP的proxy选项的options选项里面把监听的端口设置正确。默认是8080端口,如果你的8080端口有占用就不可以。前面的勾一定要有,不然无法监听。
下一步在浏览器中设置。kali里面使用的是Firefox浏览器,设置上大同小异。
设置
高级-网络-设置
详细的参数这里不做介绍,只需要使用最下面一个选项。前面代理地址填写本地地址,端口填写BP里面设置的就好了
这样,抓包的基础设置就好了。
注入原理
sql注入的原理很简单,就是传入的参数没有经过正确的处理,被当成sql语句执行了,从而泄露了不该泄露的内容。大致上分为基于报错的注入,基于时间的注入,布尔型注入,联合查询注入,多语句查询注入。本教程均使用最简单的基于报错的注入作为演示。其他方式的注入只需要再sqlmap后面跟上适当的参数即可。以下操作没有特殊提示不需要抓包。
注入实践
GET方法
我们先看第一关。(url现在是http://IP/sqli-labs/Less-1/)
我们已经知道这个页面是由PHP写的。PHP中,用GET方法传递参数是在后面加上?和变量名的值
(url现在变成了http://IP/sqli-labs/Less-1/?id=1)
(顺便讲一句,有校园网的各位,登陆页面的url是不是类似的构造呢?毕竟PHP的通用建站模板很多~)
这道题是基于报错的注入,我们尝试最经典的一句,看能够否引发报错
我们在参数后面加上了 'and1=2。这一段果然被当作id的参数传到后端当作sql语句处理了。
我们直接在sqlmap里面把网址放进去,
即sqlmap -u "http://IP/sqli-labs/Less-1/?id=1"
在运行了一段时间后,结果已经出来了
sqlmap已经发现这个数据库类型是MySQL,web服务器是apache,环境是PHP5.6
(为什么有些在运行的时候有暂停?那是因为当它发现是什么数据库的时候会询问你是否跳过查询其他数据库。初学者直接无脑回车就好了)
查询里面有什么数据库,在后面再加上--dbs参数
可以看到这边有五个数据库,我们要去查看challenge这个数据库里面有什么东西,可以将上面的哪个参数--dbs改为-D chanllenge --tables
可以看到这边challenge这个数据库里面有这些表。同理,查找指定表里面的内容,将--tables改为-T 表名 --column
如果表比较少的话,可以直接将参数改为--dump就可以列出所有的数据。
这就是简单的GET方法基于报错的注入
POST方法
除了GET方法外,还有POST方法,还记得吗?上文讲过,POST通常是作为登陆。我们进入第11关
这里我们在用户名和密码处都填上刚才我们的测试代码,从报错消息里面可以得知,这里也是将用户名和密码的值直接传到sql语句中引发了报错。
我们使用上述讲过的抓包方法,抓一个登陆包看一下
这里右键可以发送到repeater,在那里可以修改包里面的数据(基于cookie的手动注入需要用到这个,或者前端过滤字符了)。我们现在使用copy to file,保存在一个方便寻找的路径下。
我们进入sqlmap,输入sqlmap -r 文件
参数什么的和GET方法是一致的。
结果也是相同的,在此处不一一列举了
本期就到这里了。渗透测试常用工具系列暂时就讲到这里。这个系列差不多就结束了。等到其他两个系列也完结后,会有一篇总结的。到时候见。
Linux系列回顾(更新ing):
python系列回顾(更新ing):
我是乙酰水杨酸,随手写点硬科技
领取专属 10元无门槛券
私享最新 技术干货