SQLMAP学习笔记

github地址

常用参数

爆破内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
-u                                #设置目标URL
-p                                #指定测试参数

--dbs                             #爆破数据库
-D                                #指定数据库

--tables                          #爆破数据库中的表
-T                                #指定表

--columns                         #爆破表中的字段名
-C                                #指定字段名
--dump                            #列出数据
--dump-all                        #获取所有可访问数据

--current-user                    #获取当前用户名称
--current-db                      #获取当前数据库名称

爆破方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
-r                                #加载外部请求包,post用
--batch                           #默认参数进行
--data=DATA                       #通过POST发送数据字符串

--level=LEVEL                     #等级(1-5,默认为1)
--risk=RISK                       #风险(O-3,默认为1)
-v VERBOSE                        #详细级别:0-6(默认为1)

--proxy=PROXY                     #设置HTTP代理
--user-agent                      #指定HTTP User-Agent
--tamper=TAMPER                   #使用给定的脚本
--random-agent                    #随机的请求头

--threads num                     # 指定线程数
--fresh-queries                   # 清除缓存
--flush-session                   # 清空会话,重构注入 

level等级越高检测越详细,例如,level大于2会检测cookie注入,大于3会检测头注入。

level与risk的区别:level像是广度上的拓展,payload更多;risk是深度拓展,可能涉及delete语句的测试,执行之后可能会修改数据,所以叫“风险”。

shell相关

1
2
3
4
--sql-shell                       #执行SQL命令
--os-cmd                          #执行系统命令
--os-shell                        #与系统交互shell
--os-pwn                          #获取一个OOB shell,meterpreter或VNC

–os-shell

–os-shell:创建一个可以交互的shell,远程执行系统命令。通过into oufile向服务器写入两个后门文件,A文件让我们上传文件到网站路径下,通过A文件上传B文件用于命令执行,让用户可以执行系统命令,并将输出的内容返回到sqlmap端。

条件:对目标目录具有写权限,知道绝对路径,高权限数据库用户,secure_file_priv无限制

1
python sqlmap.py -u "http://127.0.0.1/sqli-labs /Less-1/?id=1" --os-shell

选择脚本语言;绝对路径【选的第二个,用户自己输入】

查看根目录,这俩文件一个是执行系统命令的,一个用来文件上传的。sqlmap退出之后,这俩文件就会被自动删除。

访问其中的php文件,可以上传文件。测试一下,上传自己的一句话木马 上传自己的一句话木马11.php,菜刀连接

连接木马

–os-cmd

–os-cmd,这个–os-shell参数相比不需要你输入路径,我们只需要看自己的权限是不是DBA权限 –is-dba。看开启xp_cmdshell没有,如果开启了,那就可以使用。

此处环境不是DBA权限,所以当我们–os-cmd参数时候,还是需要我们输入绝对路径

–sql-shell

还有个–sql-shell这个参数,这个参数其实跟前面两个参数的要求没那么高,只要数据库开启了shell能执行命令,那么我们即可使用。

使用:

1
python sqlmap.py -u www.xxxx/aboutus.php?id=1 --sql-shell

然后就进入了交互页面

–os-pwn

在数据库为MySQL、PostgreSql或者SQL Server时,可以执行该选项。并且需要当前获取的权限足够高才可以。payload类型有Meterpreter (default) 、Shell、VNC。

tamper编写

sqlmap的--tamper参数可以引入用户自定义的脚本来修改注入时的payload,由此可以使用tamper来绕过waf,替换被过滤的关键字等。这是一个基本的tamper结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python

"""  
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)  
See the file 'LICENSE' for copying permission  
"""

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

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

def tamper(payload, **kwargs): # 用于篡改Payload、以及请求头的主要函数
    return payload
  1. import可以导入sqlmap的内部库,sqlmap有许多封装好的函数和数据类型。
  2. PRIORITY是定义tamper的优先级,PRIORITY有以下几个参数:LOWEST、LOWER、LOW、NORMAL、HIGH、HIGHER、HIGHEST。如果使用者使用了多个tamper,sqlmap就会根据每个tamper定义PRIORITY的参数等级来优先使用等级较高的tamper。
  3. dependencies主要是提示用户,这个tamper支持哪些数据库。
  4. tamper函数是实现功能的函数,可以是传入要修改的payload对其进行修改、绕过,也可以是传入kwargs,这是针对http头部的修改。

将代码保存为 test.py 放入 sqlmap\tamper 路径下,然后使用的时候加上参数 --tamper=test 就可以使用了。

基于payload

例如,lowercase.py:将payload中的字母全部替换成相应的小写字母。

基于http头

例如,xforwardedfor.py:从kwargs中取出headers数组,然后修改XFF值为随机IP。

SQLMAP为什么可以脱库?

脱库,指的参数--dump系列相关参数,获取到数据库里所有的数据,具体原理是怎样的呢?来看源码: 【插播一条在网上看到的不错的流程总结图】

sqlmap.py

  1. main函数
  2. 延迟导入:__import__("lib.controller.controller"): 这行代码执行了一个动态导入。注释 (because of CI/CD checks) 暗示这是一种延迟导入的技巧,可能是为了绕过某些持续集成/持续部署(CI/CD)工具的静态代码检查问题。通过这种方式,只有在脚本被实际用作库时才会加载 lib.controller.controller 模块。

全局搜索dump找出具体实现脱库的函数 在lib.controller.action.py中发现

跟进看dumpAll函数

  1. 快捷操作,如果指定了要操作的数据库,sqlmap将直接导出这个数据库里的所有表
  2. 自动识别目标DBMS中的所有数据库,然后遍历每一个数据库中的每一张表,将其中的数据全部导出。

单张表中获取数据函数:dumpTable()

  1. 目标校验:数据库选择,数据表选择,没有指定就导出所有的表。
  2. 获取列名getColumns()
    1. 方法一:联合查询
    2. 方法二:盲注
    3. 方法三:暴力破解,遍历内置字典。当数据库非常老旧(如 MySQL < 5.0)或者类型特殊(如 MS Access),没有标准的元数据表可供查询时,就会启用此方法。
  3. 数据导出,有两种策略:快速导出,盲注导出
    1. 快速导出:当 UNION 查询、报错注入或其他可以直接回显数据的注入技术可用时,就会采用此策略。会根据后端的数据库类型选择一个预设的SQL查询模版。
    2. 盲注导出:盲注场景下,需要逐个字符地猜解数据,所以速度非常慢。先获取总行数,然后逐字猜解
  4. 存储数据,输出结果,如果用户启用了哈希破解功能 (--crack),代码会调用 attackDumpedTable() 尝试破解获取到的密码哈希值。

数据库指纹识别

用特殊字符构造payload,看页面返回信息,sqlmap中lib/parse/html.py处理返回的页面信息,配置的指纹文件路径为xml/errors.xml

xml/errors.xml是一些对应数据库的正则。SQLMAP在解析errors.xml的时候,然后根据regexp中的正则去匹配当前的页面信息然后去确定当前的数据库。

参考:

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计
本博客已稳定运行