工具使用-SQLMAP
0x00 前言
SQLMAP 作为SQL注入界自动化检测工具,能够实现高难度漏洞检测, 脱裤等工作,大大减少安全人员的时间.
0x01 用法
拿到一个工具之前,我们可以用过帮助文档查看它一般的用法. 运行以下命令, 可以查看到详细的帮助:
1 |
|
目标选定
指定URL
1 |
|
对指定的URL进行SQL注入检测
指定GOOGLE搜索的关键字
1 |
|
对GOOGLE搜索出来的每一页结果中的链接进行SQL注入检测
指定BURP或者WebScarab导出文件
1 |
|
将BURP等安全抓包工具中导出的需要分析的请求进行SQL注入检测
指定sitemap.xml
1 |
|
读取指定sitemap.xml文件,并分析其中URL进行SQL注入检测
指定HTTP请求报文
1 |
|
这个是sqlmap最简单的, 也是最好用的一个用法, sqlmap会去读取这个HTTP请求文件, 从文件中提取出所有HTTP请求相关的参数进行填充, 这样可以为了省去很多参数的配置.
指定多个请求
1 |
|
从文件中读取多个请求进行SQL注入检测
请求相关的参数
指定请求方式
1 |
|
使用POST请求对URL进行SQL检测
指定请求的内容
1 |
|
向指定URL通过POST发送data数据,并且对相关参数进行SQL注入检测, data通常用在POST和PUT请求中
指定Cookie
1 |
|
指定Cookie对URL进行SQL注入检测, 一般接口需要登录态, Cookie中存在注入也可以进行检测
相关其他参数:
- drop-set-cookie: 忽略响应中Set-Cookie的响应头
指定User-Agent
1 |
|
将HTTP请求头中User-Agent字段设置成指定的内容
相关其他参数:
- random-agent: 随机设置浏览器agent字符串
指定Referer
1 |
|
设置请求头中Referer字段, 很多网站会为了防止CSRF对Referer进行检测, 因此这个字段很多时候需要使用
指定其他HTTP头
1 |
|
设置任意HTTP头后对URL进行SQL注入检测
相关其他参数:
- headers: 一次性设置多个头, 头之间用\n进行分隔
指定超时,重试,间隔
1 |
|
针对部分网络情况对请求进行策略调整.
- delay: 请求和请求之间间隔多少秒, 默认没有间隔,可能会被频率控制拦截
- timeout: 请求执行超时时间,单位秒,默认是30s
- retries: 当发生超时时候,是否执行重试, 默认3次
指定CSRF TOKEN
1 |
|
告诉SQLmap参数中哪一个参数是token, 这个值需要从什么地方获取
- csrf-token: token的字段名
- csrf-url: 指定URL页面获取token的值
执行指定的python代码
1 |
|
当参数之间的逻辑需要特定的方式去实现的时候,我们可以通过eval来写一段python代码来实现.
其他参数暂时不介绍了,使用不是很多.
优化
并发线程数
1 |
|
设置请求的线程数, 默认只有1, 最大不能超过10
长连接
1 |
|
使用HTTP长连接,让请求之间复用HTTP连接,减少TCP连接的消耗
不获取内容
1 |
|
SQLmap只检测响应的字节数,不去获取响应内容, 因为很多时候字节数就可以判断出来是否存在问题
打开的优化项开关
1 |
|
开关打开后,上面优化的选项才能生效. 切记.
检测
检测和风险等级
1 |
|
level: 设置检测的方方面面和测试用例, 默认是1,会尝试POST和GET, 2:Cookie也会加入检测, 3:User-Agent和Referer也会检测, 更大的值会增加用例量
risk: 设置测试用例的类型,默认是1, 会使用常见的注入用例,2:加入基于时间的盲注, 3: 增加基于OR的测试用例
内容检测标准
1 |
|
帮助SQLmap识别内容中是否注入成立.
- string: sql为True时候的内容匹配
- not-string: sql为False时候的内容匹配
- regexp: sql为True时候的正则匹配
- code: sql为True的时候响应码
相关其他参数:
- text-only: 只检测文本内容
- titles: 只检测HTML的title
注入相关
指定参数
1 |
|
默认SQLmap会检测所有相关的参数, 为了效率我们可以指定只检测某些参数,或者不检测那些参数.
这些参数除了GET,POST还可以像例子中设置user-agent等请求头.
指定后端数据库
1 |
|
如果能够知道后端数据库的类型后, 我们可以指定类型后,减少无关的测试用例.
加工脚本
1 |
|
对SQLmap的payload进行base64编码后再提交
可用的tamper脚本都位于tamper目录下, 我们也可以实现自己的tamper脚本
1 |
|
输入是原始的SQLmap的payload, 输出是处理后的值
枚举
当检测到存在SQL注入漏洞之后, SQLmap会帮助我们自动化枚举相关信息.
枚举概况
1 |
|
其中:
- a : 枚举所有的信息, 后面会介绍有多少信息
- b : 返回数据库的banner, 一般有类型,版本等信息.
枚举当前数据库和用户
1 |
|
枚举以下信息:
- current-db: 当前程序使用的db的名字
- current-user: 当前程序使用的数据库用户名
- hostname: 当前DB服务器的主机名
- is-dba: 当前程序所使用的数据库用户是不是dba
枚举数据库相关信息
1 |
|
枚举以下信息, 但是因为权限问题, 不一定能获取到信息:
- users: 数据库服务器中所有的用户
- passwords: 数据库服务器中所有用户的密码hash
- privileges: 数据库服务器中所有的用户权限分配
- dbs: 数据库服务器中所有的数据库名字
指定被枚举对象
1 |
|
指定被枚举的对象, 比如我们要枚举某一个库中所有的表, 那么就需要使用-D来指定库名
枚举数据库相关详情
1 |
|
枚举以下信息:
- tables: 枚举指定数据库中所有的表名, 需要-D
- columns: 枚举指定表中所有的列名, 需要-T
- count: 获取指定表中记录数, 需要-T
导出
其实就是我们俗称的脱裤
1 |
|
导出指定表中所有数据
1 |
|
导出所有表的所有数据
暴力枚举
很多时候, 因为权限设置, 程序所使用的数据库用户并不能通过系统相关表来获取到所有的表和列, 那么我们只能通过字典进行枚举.
1 |
|
通过表名的字典去尝试查询testDB中所有存在的表.
同样地道理common-columns来暴力猜所有的列名.
相关的字典分别位于: txt/common-tables.txt和txt/common-columns.txt中,我们可以自己维护.
文件操作
当用户的权限和数据库服务器满足特定条件才能操作:
读取数据库服务器上的文件
1 |
|
读取指定文件到SQLmap的session目录中去
上传本地文件到数据库服务器
1 |
|
把本地一个文件上传到数据库服务器中去, 注意目标路径,数据库用户一定要有写权限
执行系统命令
相关的操作也需要数据库用户的权限, 因此也不一定能执行成功
1 |
|
执行一个系统命令, 并返回结果.
我们还可以使用os-shell来获取一个交互式的shell, 直接输入命令等.
其他
输出格式
1 |
|
设置导出的格式和session等其他输出保存的目录
静默运行
正常情况, 很多地方SQLmap都会询问我们一些选项, 在自动化的过程中,这个非常麻烦.
1 |
|
使用batch的话,所有提问的地方都选择默认参数. 如果你需要个别地方指定回答, 那么你可以使用answers写上多个你自己的答案.
清除缓存
默认情况SQLmap会使用上一次检测的结果, 这样对于代码修复后的效果检测会存在很大的误报.
1 |
|
其中flush-session会清空当前URL相关的session, fresh-queries会忽略之前的查询结果,进行重新请求操作.
查看注入详情
1 |
|
设置不同详情的等级, 显示不同的内容.其中含义如下:
0:只显示python错误以及严重的信息。
1:同时显示基本信息和警告信息。(默认)
2:同时显示debug信息。
3:同时显示注入的payload。
4:同时显示HTTP请求。
5:同时显示HTTP响应头。
6:同时显示HTTP响应页面
记录所有HTTP内容
作为一个爱学习的好青年, 我们需要了解SQLmap都发送了什么内容, 服务器又返回了什么内容.
1 |
|
无人值守
作为一个成功人士,我们的时间都是宝贵的, 不可能一直定在屏幕面前, 那么我们需要在SQLmap检测到SQL注入的时候主动通知我们.
1 |
|
beep就是电脑会叫一声, 主要还是alert可以执行一个系统命令, 我们可以让它给我们发短信, 发微信.
新手模式
参数这么多,如果你记不住怎么办?
1 |
|
开启一个交互式的注入检测,你只需要跟着提示来就好了.
safe
参数:–safe-url,–safe-freq
有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。
绕过这个策略有两种方式:
- –safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
- –safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。
–technique
1 |
|
0x02 常见用法
在URL重定向的情况下指定检测参数
现在很多框架都将URL重写, 相关的参数不会以querystring的方式出现, 那么我们需要告诉sqlmap注入点在什么地方
1 |
|
只需要在指定的参数(Cookie,Header头里面都行)后面加上*或者%INJECT HERE%, 这样同时可以避免使用-p参数
适合后台快速检测的命令
1 |
|
导出相关内容
1 |
|
清除session, 重新扫描
1 |
|
SQLMAP -HH
1 |
|
0x03 tamper
常用脚本如下:
序号 | 脚本名称 | 注释 |
---|---|---|
1 | 0x2char | 将每个编码后的字符转换为等价表达 |
2 | apostrophemask | 单引号替换为Utf8字符 |
3 | apostrophenullencode | 替换双引号为%00%27 |
4 | appendnullbyte | 有效代码后添加%00 |
5 | base64encode | 使用base64编码 |
6 | between | 比较符替换为between |
7 | bluecoat | 空格替换为随机空白字符,等号替换为like |
8 | chardoubleencode | 双url编码 |
9 | charencode | 将url编码 |
10 | charunicodeencode | 使用unicode编码 |
11 | charunicodeescape | 以指定的payload反向编码未编码的字符 |
12 | commalesslimit | 改变limit语句的写法 |
13 | commalessmid | 改变mid语句的写法 |
14 | commentbeforeparentheses | 在括号前加内联注释 |
15 | concat2concatws | 替换CONCAT为CONCAT_WS |
16 | equaltolike | 等号替换为like |
17 | escapequotes | 双引号替换为\\ |
18 | greatest | 大于号替换为greatest |
19 | halfversionedmorekeywords | 在每个关键字前加注释 |
20 | htmlencode | html编码所有非字母和数字的字符 |
21 | ifnull2casewhenisnull | 改变ifnull语句的写法 |
22 | ifnull2ifisnull | 替换ifnull为if(isnull(A)) |
23 | informationschemacomment | 标示符后添加注释 |
24 | least | 替换大于号为least |
25 | lowercase | 全部替换为小写值 |
26 | modsecurityversioned | 空格替换为查询版本的注释 |
27 | modsecurityzeroversioned | 添加完整的查询版本的注释 |
28 | multiplespaces | 添加多个空格 |
29 | nonrecursivereplacement | 替换预定义的关键字 |
30 | overlongutf8 | 将所有字符转义为utf8 |
31 | overlongutf8more | 以指定的payload转换所有字符 |
32 | percentage | 每个字符前添加% |
33 | plus2concat | 将加号替换为concat函数 |
34 | plus2fnconcat | 将加号替换为ODBC函数{fn CONCAT()} |
35 | randomcase | 字符大小写随机替换 |
36 | randomcomments | /**/分割关键字 |
37 | securesphere | 添加某字符串 |
38 | sp_password | 追加sp_password字符串 |
39 | space2comment | 空格替换为/**/ |
40 | space2dash | 空格替换为–加随机字符 |
41 | space2hash | 空格替换为#加随机字符 |
42 | space2morecomment | 空格替换为/_/ |
43 | space2morehash | 空格替换为#加随机字符及换行符 |
44 | space2mssqlblank | 空格替换为其他空符号 |
45 | space2mssqlhash | 空格替换为%23%0A |
46 | space2mysqlblank | 空格替换为其他空白符号 |
47 | space2mysqldash | 空格替换为–%0A |
48 | space2plus | 空格替换为加号 |
49 | space2randomblank | 空格替换为备选字符集中的随机字符 |
50 | symboliclogical | AND和OR替换为&&和|| |
51 | unionalltounion | union all select替换为union select |
52 | unmagicquotes | 宽字符绕过GPC |
53 | uppercase | 全部替换为大写值 |
54 | varnish | 添加HTTP头 |
55 | versionedkeywords | 用注释封装每个非函数的关键字 |
56 | versionedmorekeywords | 使用注释绕过 |
57 | xforwardedfor | 添加伪造的HTTP头 |