SQLmap学习笔记

SQLmap参数学习笔记


简介

SQLmap是开源SQL注入漏洞检测/利用工具

可以检测动态页面中的GET/POST参数/cookie/User-Agent/Reeferer

数据榨取

文件系统访问

操作系统命令执行

XSS漏洞检测

五种漏洞检测技术

  • 基于布尔的盲注检测
  • 基于时间的盲注检测
    • ’ and (select * from (select(sleep(3)))a–+
  • 基于错误的检测
  • 基于UNION联合查询的检测
    • 适用于通过循环直接输出联合查询结果,否则只显示第一项结果
  • 基于堆叠查询的检测
    • ;堆叠多个查询语句
    • 适用于非SELECT的数据修改/删除的操作

Options - 设置

-h / --help >> 显示常用参数的帮助信息

-hh >> 显示所有参数的帮助信息

–version >> 显示版本号

-v >> 设置显示信息的详细级别0-6,默认为1

显示等级

  1. 仅显示python回溯,错误和严重消息
  2. 还显示信息和警告消息
  3. 还显示调试消息
  4. 还显示注入的payload
  5. 还显示HTTP请求
  6. 还显示HTTP响应的头
  7. 还显示HTTP响应的页面内容

-v代替-v 2,-vv代替-v 3,-vvv代替-v 4…


Target - 目标

-u / --url >> 指定目标URL地址

-d >> 连接数据库

  • sqlmap -d “mysql://user:passwd@1.1.1.1:3306/dvwa”

-l >> 可以对Burp/WebScarab代理的log记录进行检测

-m >> 扫描txt文件中的多个目标

-r >> 从文件中读取HTTP请求(POST注入时)

-g >> 将google搜索的结果作为URL地址进行检测

-c >> 读取配置文件作为扫描参数

  • sqlmap默认配置文件/etc/sqlmap/sqlmap.conf

  • sqlmap不会自动调用配置文件

使用-u参数时,最好将URL地址用双引号括起来

对POST请求进行注入

方法一:对Burp-Log进行检测
在这里插入图片描述

在这里插入图片描述

sqlmap -l proxy.txt

方法二:对txt文本中读取请求进行检测

在这里插入图片描述

在这里插入图片描述

sqlmap -r post.txt

方法三:使用--data参数提交POST请求

sqlmap -u "http://192.168.1.4/mutillidae/index.php?page=user-info.php" --data="username=1&password=1&login-php-submit-button=Login"

HTTPS检测

当目标站点为HTTPS时使用

sqlmap -u "1.1.1.1/index.php?id=3" --force-ssl

Request - 请求

HTTP方法

--method

​ 强制改变HTTP请求的方式

HTTP数据

--data

​ 用于提交POST请求参数(也支持GET请求)

​ --data=“username=123&password=123”

参数分割符

--param-del

​ sqlmap默认识别的URL参数分隔符为&,使用该参数可以改变这个默认值

HTTP请求头

cookie

--cookie

​ 设置请求头中的cookie信息

--cookie-del

​ 设置用于分隔cookie的分隔符,默认以;分隔

--live-cookies

​ 用于实时更新服务器返回的set-cookie值

--load-cookies

​ 提供一个包含Netscape/wget格式的cookie的特殊文件

--drop-set-cookie

​ 忽略响应中的set-cookie,默认情况下在扫描过程中发现服务器响应的set-cookie时,会提示是否更新该cookie

–level设置为2以上级别时,会对cookie注入进行检测

User-Agent

--user-agent / -A

​ 设置user-agent头

​ sqlmap默认为user-agent为sqlmap/1.5.5.1#dev (http://sqlmap.org),容易被目标服务器过滤掉

--random-agent

​ 设置一个随机的user-agent

​ kali中该字典位于/usr/share/sqlmap/txt/user-agents.txt

--mobile

​ 通过user-agent将客户端模拟为手机客户端

–level设置3或以上级别时,会对uesr-agent头注入进行检测

Host

--host

​ 设置请求头中host的值

–level=5时,会对host头进行检测

Referer

--referer

​ 伪造referer头

–level>=3时,会对referer头进行检测

额外的HTTP头

--headers / -H

​ 提供额外的请求头,每个头之间用换行符分隔

--headers="Host:1.1.1.1\nUser-Agent:aaaaaa\n"

这里的头区分大小写,如果写得不标准,sqlmap将使用默认值

HTTP协议身份认证

身份验证

--auth-type

​ 指定HTTP协议中身份验证机制的类型 - Basic - Digest - NTLM

--auth-cred

​ 设置HTTP登陆凭证(username:password)

sqlmap -u "http://192.168.1.4/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p id --auth-type=Basic --auth-cred="admin:password"

私钥认证

--auth-file

​ 读取一个客户端证书和用于身份验证的私钥(PEM格式)

忽略HTTP状态码

--ignore-code

​ 如果测试目标返回导致sqlmap运行出现问题的HTTP错误认证时,如401,可以忽略该站点并继续进行测试

HTTP(S)代理

--proxy

​ 设置一个代理 - http://url:port

--proxy-cred

​ 如果设置的代理需要身份验证,可以用该参数提交 - username:password

--proxy-file

​ 从文件中读取代理列表

--ignore-proxy

​ 忽略操作系统级别的代理服务(如局域网内测试时)

--proxy-freq

​ 在给定的代理列表中使用不同的代理进行请求

Tor匿名网络

--tor

​ 使用Tor作为代理服务器,需要先配置Tor客户端及代理软件(Privoxy等)

``–tor-port`

​ 手动设置Tor代理的端口

--tor-type

​ 手动设置Tor代理的类型 - SOCKS5(默认) - SOCKS4 - HTTP

--check-tor

​ 检测tor代理是否配置正确

HTTP连接

请求延迟

--delay

​ 每个HTTP(s)请求之间的延迟时间,单位:秒,浮点数,默认无延迟

连接超时

--timeout

​ 请求超时时间,单位:秒,默认30秒,浮点数

超时重连

--retries

​ 超时重连次数,默认3次

随机更改给定参数的值

--randomize

​ 长度/类型与原始值保持一致前提下,指定每次请求随机取值的参数名

一些应用程序可能会过滤多次参数相同的请求

过滤目标

--scope

​ 过滤日志内容,通过正则表达式筛选扫描对象

​ 使用python正则表达式指定用于过滤所需主机的正则表达式

​ sqlmap -l burp.log --scope="(www)?\.target\.(com|net|org)"

会话处理

检测和盲注会产生大量失败请求,当达到一定值时,服务器端可能会中止会话(销毁session)

--safe-url

​ 设置安全URL,即发送正常(非注入)的请求的目标URL

--safe-post

​ 将POST数据发送到给定的安全URL地址

--safe-req

​ 从文件加载并使用安全的HTTP请求

--safe-freq

​ 设置一个频率N,每发送N次注入请求后,发送一次正常请求到安全URL

此时,sqlmap将在每个预定数量的请求中访问某个安全URL,而无需对其进行任何类型的注入

URL编码

--skip-urlencode

​ 在RFC标准中,GET方法会对传输内容进行编码,但某些应用程序不遵守该标准,使用原始字符串提交数据,此时需要使用此开关

执行Python代码

--eval

​ 每次请求前执行指定的python代码

​ 每次请求更改或增加新的参数值(时间依赖/其他参数值依赖)

绕过反CSRF保护机制

--csrf-token

​ 设置包含随机标记的隐藏值的名称,当网站为此类字段使用非标准名称的情况下,可以使用该参数

--csrf-url

​ 可以从任意URL地址检索令牌值,如果目标URL最初不包含必需的令牌值,但需要从其他位置提取该令牌值时,可以使用该参数

--csrf-method

​ 在访问CSRF令牌期间使用的HTTP方法

--csrf-retries

​ 重试以进行反CSRF令牌检索,默认0次

强制使用SSL/HTTPS

--force-ssl

​ 强制使用SSL/HTTPS请求

–skip-urlencode >> 跳过payload中的URL编码

–csrf-token= >> 保存反CSRF令牌的参数

–csrf-url= >> 提取反CSRF令牌的URL地址

–csrf-method= >> 在访问CSRF令牌期间使用的HTTP方法

–csrf-retries= >> 重试以进行反CSRF令牌检索,默认0次

–force-ssl >> 强制使用SSL/HTTPS

–chunked >> 使用HTTP分块传输请求编码(POST)

–hpp >> 使用HTTP参数污染方法

–eval= >> 在请求前评估python代码

当Level>=3时才会检测user-agent头和referer头注入


Optimization - 优化

一键优化

-o

​ 直接打开所有的优化(–predict-output/–keep-alive/–null-connection)

输出预测

--predict-output

​ 根据检测方法,将返回值的一些特征与sqlmap的统计表进行比对,以缩小检测的范围

​ 统计表位置: txt/common-outputs.txt

​ 版本名/用户名/密码/privileges/role/数据库名称/表名/列名

与–threads不兼容

会话保持

--keep-alive

​ 使用http(s)长连接,避免重复建立连接的网络开销,但大量长连接会严重占用服务器资源

与–proxy不兼容

页面返回判断

空连接

--null-connection

​ 只获取相应页面的大小值,而非页面具体内容

​ 通常用于盲注判断真/假,可降低网络带宽消耗

–与text-only不兼容

​ 一些特殊的HTTP请求类型,可用于获取HTTP响应的大小而无需获取HTTP正文,通常用于盲注中判断TRUE或FALSE,启用该参数后,sqlmap会尝试两种null连接技术(Range/HEAD),如果目标支持其中一种,则可以节省带宽,提升速度

并发请求

--threads

​ 最大并发线程,默认值为1,建议不超过10

与–predict-output不兼容


Injection - 注射

指定测试参数

-p

​ 当请求中有多个参数(GET/POST/cookie…)时,可以使用-p参数指定要测试的参数,而忽略其它参数

​ 也可以绕过–level限制对cookie或user-agent头进行检测 -p “id,user-agent”

--skip

​ 排除某些参数

--skip-static

​ 排除静态参数

--param-exculue

​ 基于正则表达式排除某些参数,如路过包含字符串token或session的参数 --param-exclude=“token|session”

--param-filter

​ 按位置选择要测试的参数

URI注入点

在特殊情况下(伪静态),注入点位于URI路径中,如果不手动指出,sqlmap不会对URI路径进行检测,如果要检测URI时,需要在检测点后加上*号

sqlmap -u "http://1.1.1.1/apram/value*/param2/value2*/

任意注入点

*号也可以指向GET/POST/HTTP头中的任意注入点

sqlmap -u "http://1.1.1.1" --cokie="param1=value1*;param2=value2"

或者使用-p参数

sqlmap -u "http://test.dvwa.com/vulnerabilities/sqli/?id=1&Submit=Submit#" -p id

指纹识别

指定数据库类型

--dbms

​ 默认情况下,sqlmap会自动检测目标数据库管理系统,如果无法检测出结果或在已知目标数据库的情况下,可以使用该参数指定目标数据库

指定操作系统

--os

​ 指定操作系统

参数检测

使用大数字使值无效

--invalid-bignum

​ 默认情况下,sqlmap在测试类似id=123的参数时,会使用负数来致使参数无效,使用该参数,可以强制使用大整数值为实现相同的结果(id=99999999)

使用逻辑运算使值无效

--invalid-logical

​ 强制使用布尔运算来使参数无效(id=13 AND 1=2)

使用随机字符串使值无效

--invalid-string

​ 强制使用随机字符串来使参数无效(id=asdfhb)

关闭payload转换机制

--no-cast

​ 在检索结果时,sqlmap会将结果强制转换为字符串类型,并将NULL替换为空格

​ 老版本mysql数据库需要开启此开关

关闭编码逃逸

--no-escape

​ 默认情况下,payload中用单引号界定字符串时,sqlmap使用char()编码逃逸的方法替换字符串(当目标服务器过滤单引号时)

​ SELECT ‘foo’ --> SELECT CHAR(102)+CHAR(111)+CHAR(111)

​ 该参数关闭此功能

定制payload

--prefix

​ 自定义payload的前缀

--suffix

​ 自定义payload的后缀

​ 如:

$query = "SELECT * FROM users WHERE id=('".$_GET['id']."') LIMIT 0,1";

​ 此时注入时需要在参数前后加上(‘及’)

sqlmap -u "http://1.1.1.1/1.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"

​ 查询语句为:

$query = "SELECT * FROM users WHERE id=('1') <payload> AND ('abc'='abc') LIMIT 0,1;

篡改注入数据

--tamper

​ 利用给定的脚本进行篡改注入数据,可在一定程序上绕过应用程序的敏感字符过滤/绕过WAF规则等

​ sqlmap自带了一些脚本,位于tamper/


Detection - 侦查

侦查等级

--level

​ 共5个级别,1-5,默认为1,该参数影响使用的payload数量

风险

--risk

​ 共3个级别,默认为1,多数情况下,该值是无害的

​ sqlmap使用的payload在xml/payloads.xml中可以修改

页面比较

--string

​ 提供一个字符串,当查询结果为真时,用于在页面中匹配该字符串

--not-string

​ 提供一个字符串,当查询结果为假时,用于在页面中匹配该字符口中

--regexp

​ 通过正则表达式来代替上述功能

--code

​ 匹配响应码

--text-only

​ 仅针对页面中的文件内容进行比较

--titles

​ 仅针对标题进行比较


Techniques - 技巧

SQL注入技术

--technique

​ 默认情况下,sqlmap测试其支持的所有类型技术,使用该参数可以测试一种或几种特定的SQL注入技术

​ 参数值为:

​ B - 基于布尔的盲注

​ E - 基于错误

​ U - 基于联合查询

​ S - 堆叠查询

​ T - 基于时间的盲注

​ Q - 内联查询

时间盲注

--time-sec

​ 设置时间盲注时的延迟时间(单位秒,默认5秒)

联合查询

--union-cols

​ 默认情况下,sqlmap进行UNION查询时,会查询1-10列,当--level等级提高时,该数值会增加,最多为50列

​ 使用该参数可以指定查询的列数(–union-cols=12-16)

--union-char

​ 默认情况下,sqlmap使用null测试UNION查询,当--level级别提高时,也将使用随机数测试(某些情况下,null会失败,随机数会成功)

​ 使用该参数可以指定特定字符来进行查询(–union-char=abc)

--union-from

​ 某些UNION查询时,需要在FROM子句中强制使用有效且可访问的表名(如Access)

DNS攻击

--dns-domain

​ 当控制了某DNS服务器后,使用此功能可以提高数据榨取的速度

二阶攻击

--second-url

​ 其中一个页面中注入的payload的结果在另一个页面中显示

​ 搜索结果页面URL以获取二阶响应

--second-req

​ 从文件中加载二阶攻击的HTTP请求


Fingerprint - 指纹

-f / --fingerprint

​ 查询数据库的指纹信息


Enumeration - 枚举

检索全部

-a / --all

​ 查询所有可查询的内容(会造成大量请求)

banner

-b / --banner

​ 通过目标根据函数(如version())或环境变量(如@@version)的返回值判断目标的数据库版本信息

数据库枚举

--current-user

​ 查询数据库当前用户

--current-db

​ 查询当前数据库名称

--hostname

​ 查询当前数据库主机名

--is-dba

​ 检测当前会话用户是否为管理员帐户

--users

​ 列出所有数据库用户(会话用户具有包含数据库用户信息表的读取权限)

--passwords

​ 列出并破解数据库用户的密码

--privileges

​ 列出数据库用户权限

-U可以指定用户查询

--roles

​ 列出数据库用户角色(仅目标数据库为Oracle时可用)

--dbs

​ 枚举出所有数据库

--tables

​ 枚举出数据库中所有表

-D可以指定数据库

--exclude-sysdbs可以排除所有系统数据库

当只指定表名没有指定库名时,默认使用当前数据库

--columns

​ 枚举出所有列

-T指定表名

-D指定库名

-C指定列名

--schema

​ 枚举数据库架构如(mysql中的information_schema)

--exclude-sysdbs仅包含非系统数据库的部分架构

--count

​ 检索表中的数据数量

脱库

--dump

​ 保存数据库中的内容

-T - 指定表名

-D - 指定库名

-C - 指定列(多列以,号分隔)

--start / --stop - 保存某个范围内的条目(一般用–count先查询条目总数)

--dump-all

​ 保存所有数据库表条目

--exclude-sysdbs - 排除所有系统数据库

--search -C -T -D

​ 搜索特定库名/表名/列名

--sql-query / --sql-shell

​ 执行自定义SQL语句


Brute force - 暴力破解

--common-tables

​ 暴力破解表名

​ 当msyql版本低于5.0,(information_schema不可用)时

​ 当数据库为Access(系统表MSysObjects不可读-默认)时

​ 当会话用户没有读取权限时

​ 该字典位于txt/common-tables.txt

--common-columns

​ 暴力破解列名


UDF injection - 自定义函数注入

--duf-inject

--shared-lib

​ 编译共享库创建并上传到DB服务器,以此生成UDF实现高级注入

​ linux - shared object

​ windows - DLL


File system access - 文件系统访问

--file-read

​ 从数据库的文件系统中读取文件

--file-write

​ 从数据库的文件系统中写入文件

--file-dest

​ 要写入文件的绝对路径


Operating system access - 操作系统访问

--os-cmd

​ 执行操作系统命令

​ 当目标系统是linux,且数据库为mysql/postgresql时

​ 该命令会上传两个动态链接库(sys_exec()/sys_eval())

​ 当目标系统是windows,且数据库是mssql时

​ 该命令会启用xp_cmdshell服务(有就用/禁了就启用/删除了就建)

--os-shell

​ 获取目标操作系统shell


General - 常规参数

-s

​ 指定sqlite会话文件的保存位置

-t

​ 将HTTP流量记录保存到文本文件中

--charset

​ 强制字符编码

​ --charset=GBK

--crawl

​ 指定爬站深度,从起始位置开始计算

​ --batch --crawl=3

--batch

​ sqlmap在需要用户输入时以默认操作执行

--dbms-cred

​ 指定数据库帐户(已知目标数据库帐户的情况下)

--flush-session

​ 清空本地保存的session(再次对相同站点执行检测时重新向服务器发起检测请求,默认情况下是读取本地缓存)

--force-ssl

​ 当目标站点是HTTPS时,使用该参数

--hex

​ 以十六进制的格式dump数据,收到后解码还原

--output-dir

​ 指定缓存目录

--save

​ 将命令保存为配置文件中

--update

​ 更新sqlmap

--check-waf

​ 检测WAF/IPS/IDS

--hpp

​ 绕过WAF/IPS/IDS

​ hpp - HTTP parameter pollution

​ 对ASP/IIS和ASP.NET/IIS作用更大一些

--identify-waf

​ 彻底的WAF/IPS/IDS检查


Miscellaneous - 杂项

--mobile

​ 将user-agent修改为手机端的

--purge-output

​ 将output文件夹清空

--smart

​ 当有大量的检测目标时,只选择基于错误的检测结果

--wizard

​ 向导模式

--alert

​ 成功检测到SQL注入时发出警报

--beep

​ 找到SQL注入时发出提示音


版权声明:本文为weixin_43988774原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。