一、介绍
Sqlmap 是一款使用 Python 语言开发的开源工具。它有着极其强大的特性:跨平台;支持多种数据库(涵盖了所有主流数据库);可以检测并利用 sql 漏洞,可以手动或自动化地进行SQL 注入,甚至可以访问底层文件系统。
特点:
Sqlmap支持采用五种独特的 SQL 注入技术,分别是:
基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
联合查询注入,可以使用 union 的情况下的注入。
堆查询注入,可以同时执行多条语句的执行时的注入。
sqlmap 支持多种数据库:
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access,IBM DB2, SQLite, Firebird, Sybase 和 SAP MaxDB等。
二、使用教程
目标选择-Target
Sqlmap支持多种导入目标的方式:
-d
直接连接到数据库,目前仅支持MySQL和Access数据库。MySQL数据库连接需要安装 pip install pymysql模块。可以测试远程数据库是否可以外链或者配合其他参数一起使用。
-u
常用选项:指定URL,不带其他参数一般用于GET型参数注入,会自动检测当前GET请求里的全部参数是否存在注入。
-m
从文本文件中读取目标,进行批量扫描。
-r
从文件中加载HTTP请求,一般用于非GET型注入。如果不指定参数,默认检测GET和POST参数。
请求选项-Request
这些选项可以用来指定如何连接到目标 URL。
--data
通过POST方式发送数据,一般用于检测POST注入。
--cookie
指定Cookie数据。可用于COOKIE注入或者是需要cookie才能访问的。
--user-agent
指定HTTP的user-agent头信息,有些站点比如具有手机浏览器标识才能访问的,这时就可以指定。
sqlmap.py -u "127.0.0.1/index.php" --data="id=1" --user-agent="Android / Firefox 29: Mozilla/5.0 (Android; Mobile; rv:29.0) Gecko/29.0 Firefox/29.0"
--random-agent
使用随机选定的 HTTP User-Agent 头,使用随机的浏览器头有可能能绕过某些限制。
--proxy
使用代理连接目标 URL,可用于IP限制或者是配合Burp一起使用。
以上是常用的指定发送请求选项,还有其他如指定HOST、指定header、指定referer等,如果参数太多,推荐使用-r选项,从文本中加载HTTP请求数据。
注入选项-Injection
这些选项可以用来指定对哪些参数测试,提供一般的注入方式和可选可修改的脚本注入。
-p
指定要测试的参数,这样就不用检测全部参数了,节约时间。
sqlmap.py -u "127.0.0.1/index.php?id=1" --data="name=root&age=3" -p "id"
--skip
跳过指定的参数,如果参数过多,能明确排除某些参数。
sqlmap.py -u "127.0.0.1/index.php?id=1" --data="name=root&age=3" -skip="id,name"
--dbms
强制指定后端的 DBMS,指定数据库后,可节约时间排除其他数据库测试语句。
sqlmap.py -u "127.0.0.1/index.php" --data="id=1" --dbms="mysql"
--prefix
注入有效载荷前缀字符,可用于闭合SQL语句。
sqlmap.py -u "127.0.0.1/index.php" --data="id=1" --prefix=")'" -p "id"
--suffix
注入有效负载后缀字符串,可用于闭合SQL语句。
--tamper
使用给定的脚本修改注入的数据,Sqlmap内置了几十个插件。插件的使用后期再介绍使用。
序号 | 脚本名称 | 注释 |
---|---|---|
1 | 0x2char | 将每个编码后的字符转换为等价表达 |
2 | apostrophemask | 单引号替换为Utf8字符 |
3 | apostrophenullencode | 替换双引号为%00%27 |
4 | appendnullbyte | 有效代码后添加%00 |
5 | base64encode | 使用base64编码 |
6 | between | 比较符替换为between |
7 | bluecoat | 空格替换为随机空白字符,等号替换为like |
8 | chardoubleencode | 双url编码 |
9 | charencode | 将url编码 |
10 | charunicodeencode | 使用unicode编码 |
11 | charunicodeescape | 以指定的payload反向编码未编码的字符 |
12 | commalesslimit | 改变limit语句的写法 |
13 | commalessmid | 改变mid语句的写法 |
14 | commentbeforeparentheses | 在括号前加内联注释 |
15 | concat2concatws | 替换CONCAT为CONCAT_WS |
16 | equaltolike | 等号替换为like |
17 | escapequotes | 双引号替换为\\\\ |
18 | greatest | 大于号替换为greatest |
19 | halfversionedmorekeywords | 在每个关键字前加注释 |
20 | htmlencode | html编码所有非字母和数字的字符 |
21 | ifnull2casewhenisnull | 改变ifnull语句的写法 |
22 | ifnull2ifisnull | 替换ifnull为if(isnull(A)) |
23 | informationschemacomment | 标示符后添加注释 |
24 | least | 替换大于号为least |
25 | lowercase | 全部替换为小写值 |
26 | modsecurityversioned | 空格替换为查询版本的注释 |
27 | modsecurityzeroversioned | 添加完整的查询版本的注释 |
28 | multiplespaces | 添加多个空格 |
29 | nonrecursivereplacement | 替换预定义的关键字 |
30 | overlongutf8 | 将所有字符转义为utf8 |
31 | overlongutf8more | 以指定的payload转换所有字符 |
32 | percentage | 每个字符前添加% |
33 | plus2concat | 将加号替换为concat函数 |
34 | plus2fnconcat | 将加号替换为ODBC函数{fn CONCAT()} |
35 | randomcase | 字符大小写随机替换 |
36 | randomcomments | /**/分割关键字 |
37 | securesphere | 添加某字符串 |
38 | sp_password | 追加sp_password字符串 |
39 | space2comment | 空格替换为/**/ |
40 | space2dash | 空格替换为–加随机字符 |
41 | space2hash | 空格替换为#加随机字符 |
42 | space2morecomment | 空格替换为/**_**/ |
43 | space2morehash | 空格替换为#加随机字符及换行符 |
44 | space2mssqlblank | 空格替换为其他空符号 |
45 | space2mssqlhash | 空格替换为%23%0A |
46 | space2mysqlblank | 空格替换为其他空白符号 |
47 | space2mysqldash | 空格替换为–%0A |
48 | space2plus | 空格替换为加号 |
49 | space2randomblank | 空格替换为备选字符集中的随机字符 |
50 | symboliclogical | AND和OR替换为&&和|| |
51 | unionalltounion | union all select替换为union select |
52 | unmagicquotes | 宽字符绕过GPC |
53 | uppercase | 全部替换为大写值 |
54 | varnish | 添加HTTP头 |
55 | versionedkeywords | 用注释封装每个非函数的关键字 |
56 | versionedmorekeywords | 使用注释绕过 |
57 | xforwardedfor | 添加伪造的HTTP头 |
探测选项-Detection
这些选项可用于自定义检测阶段
--level
测试等级(1-5, default 1)。
枚举-Enumeration
这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行自定义的 SQL 语句。
-b
获取 DBMS 标识。
--current-user
获取 DBMS 当前用户
--current-db
获取 DBMS 当前数据库
--hostname
获取 DBMS 当前主机名
--is-dba
检测当前用户是否是 DBA
--users
枚举 DBMS 用户
--passwords
枚举 DBMS 用户密码 hash
--dbs
枚举 DBMS 数据库
--tables
枚举 DBMS 数据库中的表
--columns
枚举 DBMS 数据库表的列
--count
检索表的项目数。如果只想获取表中的数据个数而不是具体的内容可以使用这个参数。
--dump
转储 DBMS 数据库表
--dump-all
转储 DBMS 所有数据库表
-D
指定要枚举的 DBMS 数据库名
-T
指定要枚举的 DBMS 表
-C
指定要枚举的 DBMS 列
--sql-query=QUERY
要执行的 SQL 语句
--sql-shell
交互式 SQL shell
访问文件系统
这些选项可以被用来访问后端数据库管理系统的底层文件系统
--file-read=RFILE
从后端的 DBMS 文件系统读取文件
--file-write=WFILE
编辑后端 DBMS 文件系统中的文件
--file-dest=DFILE
后端 DBMS 写入文件的绝对路径
操作系统访问
--os-cmd=OSCMD
执行操作系统命令
--os-shell
提示使用交互式操作系统 shell
其他详情命令可参考此思维导图: