Sql注入测试--Sqlmap
慕课网sqlmap学习笔记:
一、SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
例如
(1)在url上添加参数请求查询:http://index.com/?id=1
以上是通过url查询id为1的数据,但如果我们在后面传参这样写:http://index.com/?id=1' or '1'='1
那么执行的查询语句就是where xx='1' or '1'='1',这样查询的就是全部的数据。
(2)或者是登录时的免密登录,在传参的时候将注释符号#传入,注释后面密码的查询和验证,这样就可以只通过用户名免密登录
用户名:' or 1=1#
这样查询语句执行的就是:where username='' or 1=1# and password='',直接注释掉密码的验证
(3)对数据表的恶意操作
传入的参数为 or 1=(drop xx from xx)等,可以对数据表进行删除操作,所以sql注入的安全性问题很重要,sql注入是在保证查询where语句恒真的情况下可以对数据表做任意操作
(4)资源枚举,其实就是通过枚举法也就是穷举法对数据库名,备份数据库名,数据表名,列名等进行猜测,然后通过服务器返回的错误提示中得到信息,便可以进行sql注入操作。
而为何一些表单提交和输入文本框中的请求可以sql注入呢,就是后端没有对用户输入的数据进行过滤验证。所以判断是否可以进行sql注入是我们即将进行sql注入攻击的第二步。
第一步是确定我们要进行sql注入的地方。
第二步尝试性地输入一个使wehre查询语句恒真的语句,通过返回的错误的提示可以知道该输入域是否对输入的字符串进行过滤
第三步可以通过猜测表名,列名等方法可以测试
二、sql注入工具--Sqlmap
Sqlmap是一款自动化sql注入的工具,其功能强大,支持多种数据库,包括mysql,sqlserver等主流的数据库,采用独特的sql注入方法来达到自动化注入扫描漏洞的目的。
1)基于布尔的盲注(Type:boolean-based blind),即可以根据返回页面判断条件真假的注入。
2)基于时间的盲注(Type:time blind),即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3)基于报错注入(Type:error-based),即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4)联合查询注入(union query),可以使用union的情况下的注入。
5)堆查询注入,可以同时执行多条语句的执行时的注入
1、sqlmap环境搭建
(1)python2.7版本下载
(2)sqlmap下载:http://sqlmap.org/,将sqlmap文件放在python2.7的文件夹下
(3)环境变量设置,添加sqlmap文件夹的环境变量
(4)打开命令窗口,输入sqlmap.py -h则安装成功
2、测试环境搭建
搭建一个包含了sql注入,xss等漏洞的测试环境以便学习sql注入知识点。
安装php环境:由于源码是php的则需要安装php的环境
(1)安装php环境:wampserver下载安装:Apache+mysql+php集成安装环境,简化该集合环境安装配置流程,减少了环境配置的繁琐
问题1:安装完成后打开时报错:
解决方案:http://blog.csdn.net/xiaoqiang_0719/article/details/52785604
下载安装:
重启电脑即可。如果还是弹出该错误,首先检查下下载的软件是32位的还是64位的,第二可以卸载wampserver重新下载安装即可。
问题2:wampserver本地环境启动后显示橙色不显示绿色
解决方案:http://www.xuewangzhan.net/wenti/10270.html
80端口号被占用,修改端口号即可
将wampserver>bin>apache>apachex.xx>httpd.conf文件以下信息的端口号换成8080
Listen 0.0.0.0:80
Listen [::0]:80
改成:
Listen 0.0.0.0:8080
Listen [::0]:8080
右键图标refresh即可。
(2)准备测试源码dvwa:https://github.com/ethicalhack3r/DVWA
a.下载dvwa解压,解压到运行代码的位置,即将解压的安装包放在wampserver下的www文件夹下
b.复制dvwa解压的路径
c.图标鼠标右键Apache>http.config,修改文件
d.添加host:计算机>c盘>windows>system>drivers>etc>hosts,文件结尾添加127.0.0.1 dvwa的域名:dvwa.localhost,即127.0.0.1 dvwa.localhost,修改时显示权限不足时,在弹出的窗
口点击是即可
e.测试是否域名添加成功:打开命令窗口,ping dvwa.localhost
f.重启wampserver
(3)修改配置文件,添加数据库账号
a.打开dvwa>config>复制config文件,将文件后缀名改为php结尾
b.打开config.inc.php,修改用户名,密码,端口号(3306)
用户名为root,密码修改为空,端口号5432改为3306
c.浏览器打开http://localhost:8080/dvwa/setup.php,进入安装界面
d.点击Create/Reset Database创建数据库,过会页面会自动跳转到登录页面:
e.数据库的登录账号和密码获取:右键dvwa图标>phpMyadmin>users表:admin/password
f.登录dvwa,默认的用户名和密码为:admin/password,进入到以下的页面
3、sqlmap使用
(1)获取系统的基本信息
登录dvwa,设置安全的等级,设置为low,网站的安全等级为low时才能进行注入测试。
点击SQL injection输入注入的信息,复制注入信息后提交的url
a.sqlmap的参数格式:
sqlmap.py -u 目标地址
sqlmap.py -u "http://localhost:8080/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="" --batch #不加入地址后面的#
查找注入点以及可注入的方式,得到数据库是mysql,以及数据库的版本,注入点的参数为id
sqlmap.py -r 保存的请求头文件:
谷歌浏览器>测试的网站右键>检查
>Networks>F5重新加载网站>选中网址信息右键>copy>copy request header
在sqlmap文件夹下新建一个文本文件重新命名,将复制的头文件的信息粘贴保存
(2)sqlmap数据库检测
通过sqlmap获取数据库的数据
a.查看数据库
sqlmap.py -u 目标地址 --cookie=“” --dbs:查看数据库名称
查找大数据库的名称为‘dvwa’
b.扫描数据表
查看数据库表名称:sqlmap.py -u 目标地址 --cookie=“” --table:查询出所有数据库的所有表
查询数据表数据:sqlmap.py -u 目标地址 --cookie=“” --dump:查询出所有数据表的所有数据
c.导出数据
sqlmap.py -u 目标地址 --cookie=“” --dump-all
e.指定数据库查询
dvma下所有数据表数据
(1)指定数据库名称查找数据表:sqlmap.py -u 目标地址 --cookie=“” -D 数据库名称 --dump
指定dvwa数据库查找到两个表:users,guestbook,查询结果:
(2)指定数据表名称查找数据表的数据:sqlmap.py -u 目标地址 --cookie=“” -D 数据库名称 --dump -T 数据表名称
指定查找dvwa数据库users数据表的数据查询结果:
(3)指定查询users表的表结构:
查询结果:
(4)破解密码
查询到了users表的数据后发现密码都是md5加密存储的
可以网上直接搜索md5解密,将加密后的字符解密后得到的admin用户的密码为:password
另外,也可以用sqlmap自带的字典破解密码:
在获取users数据表的过程中会出现问题选择,询问是否破解密码
最后破解密码显示为:
括号内的为破解后的密码
4、sqlmap 注入post
1、post注入参数介绍
2、如何使用post请求注入
sqlmap.py -u "url" --cookie="" --data=“post源码” --batch --smart
注:--batch --smart启发式判断,batch自动执行yes,smart智能判断
post源码的获取:
(1)dvwa网站>xss stored>输入参数点击提交
(2)复制提交后的url
(3)谷歌浏览器>测试的网站右键>检查>Network,复制cookie以及Form Data
选择view source复制:
(4)运行post注入测试
(5)刷新dvwa的网站查看注入的结果
3、如何快速地批量注入测试
sqlmap.py -l txt文件名 --batch --smart
text文件:请求的地址,请求的头信息以及Form Data即post源码信息
(1)谷歌浏览器>测试的网站右键>检查>Network,Request Header>view source
(2)新建text文件,第一行填写请求的网站地址及端口号,第二行开始粘贴复制的Request Header,最后粘贴复制的Form Data的view source信息,如下所示:
(3)多个请求即批量注入,复制添加以上信息放在文件的后面,用分割符区分开保存即可
5、批量检测注入漏洞
sqlmap.py -g "url匹配" --batch --smart
url匹配使用谷歌搜索语法,由于谷歌浏览器没有FQ,这个后期补充上笔记。
三、防护sql注入
那么,如何防护sql的注入呢
(1)永远不要相信用户的输入,必须对用户的输入进行校验,过滤,可以通过正则表达式,输入的字符长度限制但双引号,转义字符等,可以前后端进行结合对用户的输入验证
(2)重要的数据等不能明文显示,必须加密
(3)不要用管理员的权限登录数据库,可以在数据库的安全性文件夹-架构-新建架构,然后在数据表上添加架构的名称,查询数据表时需要在表明前面加上架构的前缀才能查询,这样有效防止对数据表名的猜测。
(4)对于系统的错误提示尽可能少,或者对其提示进行改变,隐藏不必要的系统信息。