1. sqlmap简介

sqlmap支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库的各种安全漏洞检测。
sqlmap支持五种不同的注入模式:
  • 基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
  • 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
  • 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
  • 联合查询注入,可以使用union的情况下的注入;
  • 堆查询注入,可以同时执行多条语句的执行时的注入。

2. 下载及安装

(1)linux下git直接安装
gitclone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
(2)windows下安装
windows下下载sqlmap的压缩包,解压后即可使用。但需要一些组件包的支持,需要有python2.7.x或者2.6.x环境支持。
(3)kali及PentestBox默认安装sqlmap

3. SQL使用参数详解

本文以SQLmap 1.1.8-8版本为例,对其所有参数进行详细的分析和讲解,便于在使用时进行查询。
用法: sqlmap.py [选项]

3.1 选项

3.2 目标

在这些选项中必须提供至少有一个确定目标

3.3 请求

参考文章sqlmap设置参数
这些选项可以用来指定如何连接到目标URL
  • -method=METHOD 强制使用给定的HTTP方法(例如put)

3.4 优化

这些选项可用于优化sqlmap性能

3.5 注入

这些选项可用于指定要测试的参数、提供自定义注入有效载荷和可选的篡改脚本。

3.6 检测

这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容

3.7 技巧

这些选项可用于调整具体的SQL注入测试

3.8 指纹

3.9 枚举

这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行自定义的SQL语句。

3.10 暴力

这些选项可以被用来运行暴力检查

3.11 用户自定义函数注入

这些选项可以用来创建用户自定义函数

3.12 访问文件系统

这些选项可以被用来访问后端数据库管理系统的底层文件系统

3.13 操作系统访问

这些选项可以用于访问后端数据库管理系统的底层操作系统

3.14 Windows注册表访问

这些选项可以被用来访问后端数据库管理系统Windows注册表

3.15 一般选项

这些选项可以用来设置一些一般的工作参数

3.16 其他

4.实际利用

4.1 检测和利用SQL注入

1.手工判断是否存在漏洞

对动态网页进行安全审计,通过接受动态用户提供的GET、POST、Cookie参数值、User-Agent请求头。
如果url1访问结果跟原始网页一致,而url2跟原始网页不一致,有出错信息或者显示内容不一致,则证明存在SQL注入。

2. sqlmap自动检测

技巧:在实际检测过程中,sqlmap会不停的询问,需要手工输入Y/N来进行下一步操作,可以使用参数“--batch”命令来自动答复和判断。

3. 寻找和判断实例

通过百度对“inurl:news.asp?id=site:edu.cn”、“inurl:news.php?id= site:edu.cn”、“inurl:news.aspx?id=site:edu.cn”进行搜索,搜索news.php/asp/aspx,站点为edu.cn,如图1所示。随机打开一个网页搜索结果,如图2所示,如果能够正常访问,则复制该URL地址。
notion image
图1搜索目标
notion image
图2测试网页能否正常访问
将该url使用sqlmap进行注入测试,如图3所示,测试结果可能存在SQL注入,也可能不存在SQL注入,存在则可以进行数据库名称,数据库表以及数据的操作。本例中是不存在SQL注入漏洞。
notion image
图3检测URL地址是否存在漏洞

4. 批量检测

将目标url搜集并整理为txt文件,如图4所示,所有文件都保存为tg.txt,然后使用“sqlmap.py-m tg.txt”,注意tg.txt跟sqlmap在同一个目录下。
notion image
图4批量整理目标地址

4.2 直接连接数据库

sqlmap.py -d"mysql://admin:admin@192.168.21.17:3306/testdb" -f --banner --dbs--users

4.3数据库相关操作

5.SQLMAP实用技巧

1. mysql的注释方法进行绕过WAF进行SQL注入

(1)修改C:\Python27\sqlmap\tamper\halfversionedmorekeywords.py
(2)修改C:\Python27\sqlmap\xml\queries.xml
(3)使用sqlmap进行注入测试
其它绕过waf脚本方法:
(4)tamper目录下文件具体含义:
  1. space2dash.py绕过过滤‘=’ 替换空格字符(”),(’–‘)后跟一个破折号注释,一个随机字符串和一个新行(’n’)
  1. greatest.py绕过过滤’>’ ,用GREATEST替换大于号。
  1. apostrophenullencode.py绕过过滤双引号,替换字符和双引号。
  1. halfversionedmorekeywords.py当数据库为mysql时绕过防火墙,每个关键字之前加注释,添加mysql版本评论
  1. base64encode.py对给定的payload全部字符使用Base64编码
  1. modsecurityversioned.py过滤空格,包含完整的查询版本注释
  1. sp_password.py从DBMS日志有效载荷的末尾追加sp_password’以自动模糊处理
  1. chardoubleencode.py双url编码(不处理以编码的)
  1. randomcomments.py用/**/分割sql关键字
  1. securesphere.py追加特制的字符串
  1. space2comment.py 替换空格字符串(‘‘) 使用注释‘/**/’
  1. apostrophemask.py 用UTF-8全角字符替换单引号字符
  1. appendnullbyte.py 在payload末尾添加空字符编码
  1. between.py 分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”
  1. bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=”
  1. charencode.py 对给定的payload全部字符使用URL编码(不处理已经编码的字符)
  1. charunicodeencode.py对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)
  1. concat2concatws.py用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例
  1. equaltolike.py 用“LIKE”运算符替换全部等于号“=”
  1. ifnull2ifisnull.py 用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例
  1. lowercase.py 用小写值替换每个关键字字符,绕过对IFNULL过滤
  1. modsecurityzeroversioned.py用当中带有数字零的注释包围完整的查询
  1. multiplespaces.py在SQL关键字周围添加多个空格
  1. nonrecursivereplacement.py 用representations替换预定义SQL关键字,适用于过滤器
  1. overlongutf8.py 转换给定的payload当中的所有字符
  1. percentage.py在每个字符之前添加一个百分号
  1. randomcase.py 随机转换每个关键字字符的大小写
  1. space2hash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
  1. space2morehash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
  1. space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
  1. space2mssqlhash.py 用磅注释符“#”其次是一个换行符替换空格符
  1. space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
  1. space2mysqldash.py 用破折号注释符“--”其次是一个换行符替换空格符
  1. space2plus.py 用加号“+”替换空格符
  1. space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
  1. unionalltounion.py 用“UNION SELECT”替换“UNION ALL SELECT”
  1. unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符,宽字符绕过 GPCaddslashes
  1. varnish.py 添加一个HTTP头“X-originating-IP”来绕过WAF
  1. versionedkeywords.py 用MySQL注释包围每个非函数关键字
  1. versionedmorekeywords.py 用MySQL注释包围每个关键字,注释绕过
  1. xforwardedfor.py 添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF

2. URL重写SQL注入测试

value1为测试参数,加“*”即可,sqlmap将会测试value1的位置是否可注入。

3. 列举并破解密码哈希值

当前用户有权限读取包含用户密码的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。

4. 获取表中的数据个数

5.对网站secbang.com进行漏洞爬去

6.基于布尔SQL注入预估时间

7.使用hex避免字符编码导致数据丢失

8.模拟测试手机环境站点

9.智能判断测试

10.结合burpsuite进行注入

(1)burpsuite抓包,需要设置burpsuite记录请求日志
(2)指定表单注入

11.sqlmap自动填写表单注入

自动填写表单:

12.读取linux下文件

13.延时注入

14. sqlmap 结合burpsuite进行post注入

结合burpsuite来使用sqlmap:
(1)浏览器打开目标地址http://www.antian365.com
(2)配置burp代理(127.0.0.1:8080)以拦截请求
(3)点击登录表单的submit按钮
(4)Burp会拦截到了我们的登录POST请求
(5)把这个post请求复制为txt, 我这命名为post.txt 然后把它放至sqlmap目录下
(6)运行sqlmap并使用如下命令:

15.sqlmap cookies注入

参考文章sqlmap设置参数
默认情况下SQLMAP只支持GET/POST参数的注入测试,但是当使用–level 参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。可以通过burpsuite等工具获取当前的cookie值,然后进行注入:

16.mysql提权

(1)连接mysql数据打开一个交互shell:
(2)利用sqlmap上传lib_mysqludf_sys到MySQL插件目录:

17.执行shell命令

18.延时注入

19.waf脚本绕过

参考文章

💡
本文章仅提供学习使用,有任何问题,欢迎您在底部评论区留言,一起交流~
 
 
Cookie和SessionIDS和IPS区别