简介

sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

安装

网上太多,不再赘述

支持的五种注入模式

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

支持的数据库

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

sqlmap执行流程

  • 判断可注入的参数
  • 判断可以用哪种SQL注入技术来注入
  • 识别出数据库类型
  • 根据用户的输入,选择相应数据的读取

基础使用

sqlmap中很多的命令在实际应用中我们并不会用到,没有必要花大部分的时间去记下一堆不用就会忘记的命令,该部分列举了一些常用的命令

  • 输出等级 -v

如果你想要观察sqlmap对一个可能的注入点进行了怎样的尝试判断以及读取数据的,可以使用 -v 参数,一共分为7个等级,默认为1,初学sql注入的话可以指定为-v 3 等级,这样会给出payload,方便学习

0:只显示 Pythontracebacks 信息、错误信息 [ERROR] 和关键信息 [CRITICAL];

1:同时显示普通信息 [INFO] 和警告信息 [WARNING];

2:同时显示调试信息 [DEBUG];

3:同时显示注入使用的攻击荷载;

4:同时显示 HTTP 请求;

5:同时显示 HTTP 响应头;

6:同时显示 HTTP 响应体。

  • 指定目标 -u 或 --url

使用参数 -u 或者 --url 指定一个URL作为目标,该参数后跟一个表示URL的字符串,可以是http协议也可以是https协议,也可以指定端口

举例

sqlmap.py -u ​​http://testphp.vulnweb.com/comment.php?aid=1​

  • 查看下载数据库数据:

sqlmap -u "url" --dbs //获取该url对应数据库的名称

sqlmap -u "url" --tables -D "database" //database这个数据库的表数据表sqlmap -u "url" --columns -T "tables" -D "database" //查看tables这个数据表的字段sqlmap -u "url" --dump "a,b,c" -C "columns" -T "tables" -D "database" //下载内容,后面的-CTDabc都是对下载的数据库表段的约束如果不加就是下载所有

  • 指定多个URL -m

参数 -u 一次只能指定一个URL,若有多个URL需要测试就显得很不方便,我们可以将多个URL以一行一个的格式保存在文本文件中,然后使用参数 -m ,参数 -m 后跟该文本文件路径,让SQLMap依次读取文件中的URL作为攻击目标

  • 从文件载入HTTP请求 -r

可以将一个HTTP请求保存在文件中,然后使用参数 -r 加载该文件,SQLMap会解析该文件,从该文件分析目标并进行测试

很多时候是使用BurpSuite对HTTP请求进行抓包并保存,然后使用 -r 参数读取文件进行注入,使用 -p 参数进行注入参数的指定

举个例子:

sqlmap.py -r "post.txt" -p "username" --dbs

  • 将Google搜索结果作为攻击目标 -g

SQLMap能自动获取Google搜索的前一百个结果,对其中有GET参数的URL进行注入测试,当然因为某些众所周知的原因,你需要能够先翻越伟大的长城,在sqlmap手册中 -g 参数的例子为:

python sqlmap.py -g "inurl:\".php?id=1\""

进阶用法

进阶用法比之前的基础用法要高级一丢丢

  • 列出数据库用户名和密码

--users 列出所有数据库用户,当前用户有权限读取包含所有用户的表权限时,就可以列出所有管理用户

--password 数据库密码,当前用户有权限读取包含用户密码的权限时,sqlmap会先列举出用户,然后列出hash,并且尝试破解

  • 显示网站当前信息

--current-db 网站当前数据库

--current-user 当前数据库用户

  • 指定代理

--proxy ​​http://local:8080​

指定代理进行网站注入,使用HTTP代理链接到目标URL,在防火墙会BAN的情况下使用

  • 构造随机请求头 user-agent

--random-agent 构造随机user-agent

  • 检查用户权限

--is-dbs 当前用户权限(是否为root),是的话会返回True

  • 设置延迟注入的时间

--time-sec=xxx

当使用基于时间的盲注时,可指定响应的延迟时间(默认为5秒)

  • 设置请求并发量

--threads=THREADS

最大的HTTP(S) 请求并发量(默认为1)

  • 写入文件

条件:

1,需要有网站的物理路径,可以通过phpinfo探针,或者网站报错等方式获取

2,需要有可读或可写权限

--file-read=RFILE 从后端的数据库管理系统文件系统读取文件(物理路径)

--file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件

--file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径

举例如:

sqlmap -r "c:\request.txt" -p id –dbms mysql –file-dest "e:\php\htdocs\dvwa\inc\include\1.php" –file-write "f:\webshell\1112.php"

  • 获取表中数据个数

--count xxx

有时候用户只想获取表中数据个数而不是具体的内容,那么可以使用这个参数

适用场景在HW的过程中,不允许拖数据又要知道数据量来拿分

  • HTTP请求之间添加延迟

--delay xxx

过于频繁地发送请求可能会被网站察觉或者有其他不良后果,使用参数 --delay 来指定HTTP请求之间的延迟,单位为秒,类型是浮点数,如

--delay 1.5 表示延迟1.5秒,默认是没有延迟的

  • 修改注入数据

--tamper

除了使用CHAR()编码字符串外SQLMap没有对payload进行任何混淆。

该参数用于对payload进行混淆以绕过IPS或WAF

若使用的tamper脚本位于sqlmap的安装目录的tamper/目录中,那么可以省略路径和后缀名,只写文件名

多个tamper脚本之间使用空格隔开

在tamper/目录中有很多可用的tamper脚本,我们也可以自己编写属于自己的tamper脚本,这属于sqlmap的高级用法

关于tamper的详细介绍,有:

​https://mp.weixin.qq.com/s/vEEoMacmETUA4yZODY8xMQ​

  • 执行任意操作系统命令

--os-cmd 和 --os-shell

1.sqlmap -u ​​http://url​​ --os-shell

//或者windows可以用--os-cmd 或--sql-shell

2.选择网站服务端语言

3.填写网站根目录C:/www/

暂时先写这些趴,后面有啥要补充的再更新

参考链接: