常用参数
爆破内容
|
|
爆破方式
|
|
level等级越高检测越详细,例如,level大于2会检测cookie注入,大于3会检测头注入。
level与risk的区别:level像是广度上的拓展,payload更多;risk是深度拓展,可能涉及delete语句的测试,执行之后可能会修改数据,所以叫“风险”。
shell相关
|
|
–os-shell
–os-shell:创建一个可以交互的shell,远程执行系统命令。通过into oufile
向服务器写入两个后门文件,A文件让我们上传文件到网站路径下,通过A文件上传B文件用于命令执行,让用户可以执行系统命令,并将输出的内容返回到sqlmap端。
条件:对目标目录具有写权限,知道绝对路径,高权限数据库用户,secure_file_priv无限制
|
|
选择脚本语言;绝对路径【选的第二个,用户自己输入】
查看根目录,这俩文件一个是执行系统命令的,一个用来文件上传的。sqlmap退出之后,这俩文件就会被自动删除。
访问其中的php文件,可以上传文件。测试一下,上传自己的一句话木马
上传自己的一句话木马11.php,菜刀连接
连接木马
–os-cmd
–os-cmd,这个–os-shell参数相比不需要你输入路径,我们只需要看自己的权限是不是DBA权限 –is-dba。看开启xp_cmdshell没有,如果开启了,那就可以使用。
此处环境不是DBA权限,所以当我们–os-cmd参数时候,还是需要我们输入绝对路径
–sql-shell
还有个–sql-shell这个参数,这个参数其实跟前面两个参数的要求没那么高,只要数据库开启了shell能执行命令,那么我们即可使用。
使用:
|
|
然后就进入了交互页面
–os-pwn
在数据库为MySQL、PostgreSql或者SQL Server时,可以执行该选项。并且需要当前获取的权限足够高才可以。payload类型有Meterpreter (default) 、Shell、VNC。
tamper编写
sqlmap的--tamper
参数可以引入用户自定义的脚本来修改注入时的payload,由此可以使用tamper来绕过waf,替换被过滤的关键字等。这是一个基本的tamper结构:
|
|
- import可以导入sqlmap的内部库,sqlmap有许多封装好的函数和数据类型。
- PRIORITY是定义tamper的优先级,PRIORITY有以下几个参数:LOWEST、LOWER、LOW、NORMAL、HIGH、HIGHER、HIGHEST。如果使用者使用了多个tamper,sqlmap就会根据每个tamper定义PRIORITY的参数等级来优先使用等级较高的tamper。
- dependencies主要是提示用户,这个tamper支持哪些数据库。
- 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
- main函数
- 延迟导入:
__import__("lib.controller.controller")
: 这行代码执行了一个动态导入。注释(because of CI/CD checks)
暗示这是一种延迟导入的技巧,可能是为了绕过某些持续集成/持续部署(CI/CD)工具的静态代码检查问题。通过这种方式,只有在脚本被实际用作库时才会加载lib.controller.controller
模块。
全局搜索dump
找出具体实现脱库的函数
在lib.controller.action.py
中发现
跟进看dumpAll
函数
- 快捷操作,如果指定了要操作的数据库,sqlmap将直接导出这个数据库里的所有表
- 自动识别目标DBMS中的所有数据库,然后遍历每一个数据库中的每一张表,将其中的数据全部导出。
单张表中获取数据函数:dumpTable()
- 目标校验:数据库选择,数据表选择,没有指定就导出所有的表。
- 获取列名
getColumns()
- 方法一:联合查询
- 方法二:盲注
- 方法三:暴力破解,遍历内置字典。当数据库非常老旧(如 MySQL < 5.0)或者类型特殊(如 MS Access),没有标准的元数据表可供查询时,就会启用此方法。
- 数据导出,有两种策略:快速导出,盲注导出
- 快速导出:当 UNION 查询、报错注入或其他可以直接回显数据的注入技术可用时,就会采用此策略。会根据后端的数据库类型选择一个预设的SQL查询模版。
- 盲注导出:盲注场景下,需要逐个字符地猜解数据,所以速度非常慢。先获取总行数,然后逐字猜解
- 存储数据,输出结果,如果用户启用了哈希破解功能 (
--crack
),代码会调用attackDumpedTable()
尝试破解获取到的密码哈希值。
数据库指纹识别
用特殊字符构造payload,看页面返回信息,sqlmap中lib/parse/html.py
处理返回的页面信息,配置的指纹文件路径为xml/errors.xml
。
xml/errors.xml
是一些对应数据库的正则。SQLMAP在解析errors.xml
的时候,然后根据regexp中的正则去匹配当前的页面信息然后去确定当前的数据库。
参考: