Web安全攻防 渗透之Sqlmap工具

Web安全攻防 渗透之Sqlmap工具

1. SQLmap介绍

1-1. SQLmap介绍

SQLmap介绍:
Sqlmap是一个开源的渗透工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。他有一个强大的检测引擎,许多适合于终极渗透测试的小众特性和广泛的开关,从数据库指纹、从数据库获取数据到访问底层 文件系统和通过带外连接在操作系统上执行命令

官方网址: http://sqlmap.org/

1-2. SQLmap的特点

  • 完全支持MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多种数据库管理系统。

  • 完全支持布尔型盲注、时间型盲注、基于错误信息的注入、联合查询注入和堆查询注入。

  • 在数据库证书、IP地址、端口和数据库名等条件允许的情况下支持不通过SQL注入点而直接连接数据库。

  • 支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列。

  • 支持自动识别密码哈希格式并通过字典破解密码哈希。

  • 支持完全地下载某个数据库中的某个表,也可以只下载某个表中的某几列,甚至只下载某一列中的部分数据,这完全取决于用户的选择。

  • 支持在数据库管理系统中搜索指定的数据库名、表名或列名

1-3. SQLmap的下载

官网下载地址: http://sqlmap.org/

1-4. SQLmap注入介绍

所谓SQL注入,就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串, 最终达到欺骗服务 器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将SQL命令注入 到后台数据库引擎执行的能力,它可以 通过在web表单中输入SQL语句得到一个存在安全漏洞 的网站上的数据库,而不是按照设计者意图去执行SQL语句

2. SQLmap注入 常用的一些参数

2-1. sqlmap输出级别 -v

参数: -v

解释: Sqlmap的输出信息按从简到繁共分为7个级别依次为0、1、2、3、4、5和6。使用参数-v 来指定某个等级,如使用参数-v 6来指定输出级别为6。默认输出级别为1。

作用:

  • 0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL]

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

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

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

  • 4:同时显示HTTP请求头

  • 5:同时显示HTTP响应头

  • 6:同时显示HTTP响应体

2-2. sqlmap获取目标

2-2-1. 直连数据库

支持连接的数据库:

  • 服务型数据库-MySQL,Oracle

  • 文件型数据库-SQLite
    连接示例:

python sqlmap.py -d "mysql://用户名:密码@地址:端口/数据库名字" f --banner --dbs --users1

2-2-2. sqlmap指定目标URL [-u 或者 -url]

参数: -u 或者 --url

** 解释:** sqlmap直接对单一URL探测

URL格式:http(s)://targetur\[:port\]/# 示例:python sqlmap.py -u "http(s)://targetur\[:port\]/" --banner123

2-2-3. sqlmap 读取不同文件类型进行注入SQL [-x、-m、 -r、 -c]

参数作用
-x为便于搜索引擎收录,许多网站专门为搜索引擎生成了xml格式的站点地图
-m从多行文本格式文件读取多个目标,对多个目标进行探测
-r可以将一个HTTP请求保存在文件中
-c从配置文件sqlmap.conf中读取目标探测

2-3. sqlmap 设置请求参数

2-3-1. 介绍:

介绍:
HTTP请求有很多种方法(method),可以在不同位置(GET、POST、cookie和User-Agent等)携带不同参数。往往只有在特定位置携带了特定参数以特定方法发起的请求才是合法有效的请求。Sqlmap运行时除了需要指定目标,有时还需要指定HTTP请求的一些细节。

一般来说,Sqlmap能自动判断出是使用GET方法还是POST方法,但在某些情况下需要的可能是PUT等很少见的方法,此时就需要用参数–method来指定方法。

2-2-2. 设置post提交参数 [–data=" "]

参数: --data=" "

作用: 默认情况下,用于执行HTTP请求的HTTP方法是GET,但是可以通过提供在POST请求中发送的数据隐式的将其改为 POST。这些数据作为参数,被用于SQL注入检测

用法示例:

python sqlmap.py -u "url地址" --datta="data数据" --banner1

2-2-3. 设置cookie参数

参数作用
--cookie设置cookie值
--cookie-del删除cookie值
--load-cookies从文件中加载
--drop-set-cookiehttp响应(Set-Cookie)

使用场景: web应用程序具有基于cookie验证的过程,要测试的页面只有在登录状态下才能访问,登录状态用 cookie识别想利用cookie值上的SQL注入漏洞,想要检测是否存在cookie注入

用法示例:

python sqlmap.py -u "url地址" --cookie "cookies值"  --level2 --banner 
1

tips:

  • --level 2 : 可提高访问等级(最高)

2-2-4. 使用cookie过程

  1. 登录或浏览页面

  2. 找到cookie

  3. 在sqlmap中使用–cookie cookie值

2-2-5. 设置user-agent [--user-agent=‘指定的user-agent’]

1.默认的user-agent:

sqlmap/1.0-dev-xxxx(http://sqlmap.org)1

2.指定user-agent:

使用参数 --user-agent = '指定的user-agent'1

3.随机选择user-agent:

使用参数 --random-agent1

2-2-6. 设置代理 [–proxy]

设置sqlmap参数: --proxy

设置HTTP代理服务器位置 格式: --proxy http(s): //ip[端口]

用法示例:

python sqlmap.py -u "URL地址" --proxy "代理ip" --banner1

2-2-7. 设置延迟 [--delay 0.5]

参数: --delay 0.5

作用: sqlmap探测过程中会发送大量探测Payload到目标,如果默认情况过快的发包速度会导致目标预警。为了避免这样的情况发生,可以在探测设置sqlmap发包延迟。默认情况下,不设置延迟

2-2-8. 设置超时 [--timeout 10.5]

参数: --timeout 10.5

作用: 在考虑超时HTTP请求之前,可以指定等待的秒数。有效值是一个浮点数,比如10.5秒。默认是30秒

2-2-9. 设置超时重试次数 [--retries count]

参数: --retries count

作用: 设置对应充实次数,默认情况下重试3次

2-2-10. 这是随机参数 [--randomize 参数名称]

参数: --randomize 参数名称

作用: sqlmap可以指定要在每次请求期间随机更改其值得参数名称。长度和类型根据提供的原始值保持一致

用法参考:

pyhon sqlmap.py -u "url地址" --randomize id --banner1

2-2-11. 设置忽略401 [–ignore-401]

参数: --ignore-401

作用: 如果测试偶尔返回HTTP错误401的站点,而你想忽略它并在不提供适当凭证的情况下继续测试,可以使用–ignore- 401

2-2-12. 设置避免请求过都而屏蔽

介绍: 有时服务器检测到某个客户端错误请求过多会对其进行屏蔽,而Sqlmap的测试往往会产生大量错 误请求,为避免被屏蔽,可以时不时的产生几个正常请求以迷惑服务器。

参数作用
--safe-url隔一会就访问一下的安全URL
--safe-post访问安全URL时携带的POST数据
--safe-req从文件中载入安全HTTP请求
--safe-freq每次测试请求之后都会访问一下的安全URL

3. SQLmap性能优化

3-1. sqlmap 性能优化常用参数

3-1-1. 设置持久HTTP连接 [--keep-alive]

参数: --keep-alive

3-1-2. 设置不接受HTTP Body [--null-connection]

参数: --null-connection

作用: sqlmap中设置空连接,表示不接受HTTP当中的Body。 可以直接获得HTTP响应的大小而不用获得HTTP响应体,常用在盲注过程中

3-1-3. 设置多线程 [--thread=3]

参数: --thread=3

作用: sqlmap中设置同时发送多少个HTTP请求的多线程[最大10个,默认1个]

3-1-4. 一键优化 [-o]

参数: -o

作用: 添加此参数相当于同时添加下列三个优化参数

  • --keep-alive

  • --null-connection

  • --threads=3

3-2. sqlmap 自定义检测参数

3-2-1. 设置探测等级 [--level 1]

参数: --level 1

作用: 此参数用于指定检测级别,有1~5共5级。默认为1,表示做最少的检测,相应的,5级表示做最多的检测。

3-2-2. 设置风险等级 [--risk 2]

参数: --risk 2

作用: 此参数用于指定风险等级,有1~3共3级。默认风险等级为1,此等级在大多数情况下对测试目标无害。 风险等级2添加了基于时间的注入测试,等级3添加了OR测试。

3-3. sqlmap 指定位置注入

3-3-1. 指定注入位置 [-p]

参数: -p "需要探测的参数, ','隔开 "

作用: 默认情况下Sqlmap会测试所有GET参数和POST参数,当level大于等于2时会测试cookie参数,当level大于等于3时会测试User-Agent和Referer。实际上还可以手动指定一个以逗号分隔的、要测试的参数列表,该列表中的参数不受level限制。这就是“-p”的作用

不想测试某一参数的时候: --skip

3-3-2. 设置url注入位置

参数: *

作用: 当注入点位于URI本身内部时,会出现一些特殊情况。除非手动指向URI路径,否则sqlmap不会对URI路径执行任何自动测试。必须在命令行中添加星号(*)来指定这些注入点。

使用示例:

python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/" --banner1

4. SQLmap注入参数

4-1. sqlmap 强制设置DBMS

4-1-1. 介绍:

介绍: 默认情况下sqlmap会自动识别探测目标web应用程序的后端数据库管理系统(DBMS)。

sqlmap支持 的DBMS种类:

  • MySQL

  • Oracle

  • PostgreSQL

  • Microsoft SQL Server

  • Microsoft Access

  • Firebird

  • SQLite

  • Sybase

  • SAP MaxDB

  • DB2

4-1-2. 指定数据库进行探测 [--dbms 数据库类型]

参数: --dbms 数据库类型

作用: 可以指定数据库来进行探测

4-2. sqlmap 强制设置OS系统 [--os 系统类型]

参数: --os 系统类型

作用: 默认情况下sqlmap会自动探测目标web应用程序的后端操作系统,sqlmap完全支持的OS种类Linux、Windows

4-3. sqlmap 强制设置无效值替换

4-3-1. 强制使用大整数实现相同目标 [--invalid-bignum]

参数: --invalid-bignum

作用: 在sqlmap需要使原始参数值无效(例如id=13)时,它使用经典的否定(例如id=-13)。有了这个参数,就可以强制使用大整数值来实现相同的目标(例如id=99999999)。

使用示例:

python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --invalid-bignum --banner1

4-3-2. 强制使用布尔值来实现相同目标 [--invalid-logical]

参数: --invalid-logical

作用: 强制使用布尔操作来实现相同的目标(例如id=13 and18=19)。

4-3-3. 强制使用随机字符串来实现相同目标 [--invalid-string]

参数: --invalid-string

作用: 有了这个参数,就可以强制使用随机字符串来实现相同的目标(例如id=akewmc)。

4-4. sqlmap 自定义注入负载位置

4-4-1. 介绍:

介绍: 在某些情况下,只有当用户提供要附加到注入负载的特定后缀时,易受攻击的参数才可被利用。当用户已经知道查询语法并希望通过直接提供注入有效负载前缀和后缀来检测和利用SQL注入时,这些选项就派上用场了。

4-4-2. 参数:

设置SQL注入Payload前缀: --prefix

设置SQL注入Payload后缀: --suffix

4-4-3. 使用示例:

$query = "SELECT * FROM users WHERE id=('.$_GET['id'].') LIMIT 0, 1";python sqlmap.py -u "http://ip/sqlmap/mysql/get_str_brackets.php\?id=1" -p id --prefix "')" --suffix " AND ('abc'='abc"$query = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT0, 1";12345

4-5. sqlmap设置Tamper脚本

4-5-1. 介绍:

sqlmap本身不会混淆发送的有效负载,除了单引号之间的字符串被CHAR()类似的表示形式所取代之外。sqlmap通过Tamper脚本来绕过WAF等防御措施,可以在tamper文件夹下找到所有sqlmap自带的tamper脚本。

4-5-2. 使用示例:

python sqlmap.py -u "http://ip/sqlmap/mysql/get_int.php?id=1" --tamper "between.py,randomcase.py,space2comment.py" -v 31

4-6. sqlmap 设置DBMS认证

参数: --dbms-cred = username:password

使用示例:

python sqlmap.py -u "http://127.0.0.1/sqli/Less-3/?id=1" --dbms-cred = "root:root" --banner1

5. SQLmap 注入技术参数

5-1. sqlmap 设置具体SQL注入技术 [--technique]

参数: --technique

作用: 此参数用于指定检测注入时所用技术。默认情况下Sqlmap会使用自己支持的全部技术进行检测。此参数后跟表示检测技术的大写字母,其值为B、E、U、S、T或Q

各子母值含义如下

  • B:Boolean-based blind(布尔型注入)

  • E:Error-based(报错型注入)

  • U:Union query-based(可联合查询注入)

  • S:Stacked queries(可多语句查询注入)

  • T:Time-based blind(基于时间延迟注入)

  • Q:Inline queries(嵌套查询注入)

其它参数:

  • “--technique ES”来指定使用两种检测技术

  • “--technique BEUSTQ”与默认情况等效

5-2. sqlmap 设置盲注延迟时间 [--time-sec]

参数: --time-sec

作用: 用此参数设置基于时间延迟注入中延时时长,默认为5秒

5-3. sqlmap 设置union字段数 [–union-cols 12-16]

参数: --union-cols 12-16 (会让Sqlmap的列数检测范围变成 12到16)

作用: 在进行联合查询注入时,Sqlmap会自动检测列数,范围是1到10。当level值较高时列数检测范 围的上限会扩大到 50。

5-4. sqlmap 设置union字符 [--union-cha]

参数: --union-char

作用: 默认情况下Sqlmap进行联合查询注入时使用空字符(NULL)。但当level值较高时Sqlmap会生 成随机数用于联合查询注入。 因为有时使用空字符注入会失败而使用随机数会成功。

5-5. sqlmap 设置union查询表 [--union-from]

参数: --union-from

作用: 有些情况下在联合查询中必须指定一个有效和可访问的表名,否则联合查询会执行失败。

5-6. sqlmap 识别指纹 [ -f或者–fingerprint]

参数: -f或者–fingerprint

作用: 探测目标指纹信息

6. SQLmap检索DBMS信息

6-1. sqlmap 检索DBMS信息

6-1-1. 获取数据库banner信息 [--banner 或者 --b]

参数: --banner 或者 --b

作用: 获取数据库基本信息

6-1-2. 检索DBMS当前数据库 [--current-db]

参数: --current-db

作用: 获取当前数据库名

6-1-3. 检索DBMS当前主机名 [--hostname]

参数: --hostname

作用: 获取主机名

6-2. sqlmap 检索DBMS用户信息

6-2-1. 探测当前用DBA [--id-dba]

参数: --d-dba

作用: 探测当前用户是否是数据库管理员

6-2-2. 枚举DBMS用户密码

参数: --passwords

作用: 获取用户密码Hash值

6-2-3. 枚举DBMS用户 [--users]

参数: --users

作用: 获取DBMS所有用户

6-2-4. 枚举DBMS权限 [--provoleges]

参数: --provoleges

作用: 当前用户有读取包含了数据库管理系统中用户信息的系统表的权限时使用这一参数可以列举数据库管理系统中用户的权限。通过用户权限可以判断哪些用户是管理员。

更多参数: 若想只枚举特定用户的权限使用参数"-U"指定用户,可用"CU"来代表当前用户。

使用示例:

python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --privileges U root1

6-3 sqlmap 枚举信息

6-3-1. 列举数据库名 --dbs

参数: --dbs

作用: 列举数据名称

6-3-2. 枚举数据库表 [--tables]

参数: --tables

作用: 列举数据库表名

更多参数: -D 数据库名字 指定具体数据库

6-3-3. 枚举数据库表列 [--columns]

参数: --columns

作用: 枚举数据库列

6-3-4. 枚举数据值 [--dump]

参数: --dump

作用: 枚举数据值

6-3-5. 枚举schema信息 [--schema]

参数: --schema

作用: 用户可用此选项列举数据库管理系统的模式。模式列表包含所有数据库、表、列、触发器 和他们各自的类型。

更多参数: --exclude-sysdbs 排除系统数据库

6-3-6. 检索数据表数量 [--count]

参数: --count

作用: 获取表的条目数

6-3-7. 获取数据信息 [--start--stop]

参数: --start--stop

作用: 获取数据信息

更多参数: --start 1 --stop 3 返回当前数据表的前三条记录

6-3-8. 设置条件获取信息 [--where

]
参数: --where

作用: 设置条件获取信息

6-4. sqlmap 暴力破解数据

6-4-1. 暴力破解表名 [--common-tables]

参数: --common-tables

作用: 暴力破解表名

tips: 有些情况下用–tables不能列出数据库中表名来比如:

  • 版本小于5.0的MySQL没有information_schema表

  • 数据库用户权限过低无法读取表名

6-4-2. 暴力破解列名 [--common-columns]

参数: --common-columns

作用: 暴力破解列名

6-5. sqlmap 检索所有信息

参数: -a --all

作用: 返回所有的检索信息

7. 补充

7-1. 安全测试

python sqlmap.py -u "http://127.0.0.1/sqli/Less-8/?id=1" --technique T --dbs1

targer.txt文件中是当前网址的请求,加上发送的参数 ↓

python sqlmap.py -r target.txt -p passwd --technique E1

8. 练习环境推荐

练习靶场:https://url.qingkuang.net/4hb1eo

添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。