sqlmap使用

Posted 满天星ak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlmap使用相关的知识,希望对你有一定的参考价值。

支持的五种注入

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

sqlmap 使用

sql注入检测
  GET、POST、COOKIE
    GET
      网址:http://4399.com?a=ichunqiu
      命令:sqlmap.py -u “URL”
    POST
      POST数据:a:ichunqiu
      命令:sqlmap.py -u "URL"空格–data=“POST数据”
    cookie
    命令:sqlmap.py -u "URL"空格–cookie= “Cookie数据”

sql注入基本流程

获取库名:sqlmap.py -u "URL"空格–current-db
获取库的表名:sqlmap.py -u “URL” --tables -D “数据库名”
获取库的表名的列名:sqlmap.py-u --columns -T “表名” -D “数据库名”
获取库的某表名的某列名的字段内容:原基础 --dump

sqlmap的命令

 目标
  -u 目标URL 例:sqlmap -u “www.abc.com/index.php?id=1”
  -m 后接一个txt文件,文件中是多个url,sqlmap会自动化的检测其中的所有url。例:sqlmap -m target.txt
 &emsp-r 可以将一个post请求方式的数据包(bp抓包)保存在一个txt中,sqlmap会通过post方式检测目标。例:sqlmap -r bp.txt
 枚举
  --current-db 获取数据库管理系统当前数据库
  --tables 枚举DBMS数据库中的表
  --columns 枚举DBMS数据库表列
  -D 要进行枚举的指定数据库名
  -T 要进行枚举的指定表名
  -C 要进行枚举的指定列名
  --dump 转储数据库表项,查询字段值

获得数据库相关信息

数据库类型:MIcrosoft SQL Server 、mysql、Orcle、PostqreSQL
数据库结构 Microsoft Access : 库分三种表 Microsoft SQL Server 不同库不同表 3.Mysql:获取数据库使用参数:–current-db 获取用户名使用参数:–current-user

获取数据量和用户权限

1.语句:sqlmap.py -u “URL” --count -D “当前使用的数据库名”
2.判断用户权限:增删改查、写入读取文件、执行系统命令 使用参数 --privileges 查看用户的权限 sqlmap.py -u “URL” --privileges

延时注入

使用条件:页面无变化、布尔无真假、从来不报错->延时 使用方法: sqlmap.py -u “URL” --delay 时间 延时几秒 -safe-freq

交互式

sqlmap 进行提权 sqlmap.py -u “URL” --os-cmd=命令(注意使用交互式参数要知道网站绝对路径) 绝对路径:从盘符开始的路径,例如D:\\www
命令=net user

tamper脚本利用介绍

Tamper脚本在sql目录下 语法:sqlmap.py -u “URL” --tamper=“脚本名字”

本地写入

sqlmap.py -u “URL” -file-write “本地文件的地址(路径)” --file-dest"目标文件的地址(路径)"

Options

-h, --help 查看帮助,没什么好说的
-hh 查看全部的帮助
--version 查看版本
-v 显示信息的级别,一共有六级:0:只显示python 错误和一些严重信息;1:显示基本信息(默认);2:显示debug信息;3:显示注入过程的payload;4:显示http请求包;5:显示http响应头;7:显示http相应页面。

Target

-d 直接连目标后端接数据库,而不是使用sql注入漏洞,直接通过目标的侦听端口连接,当然需要有目标数据库的账号名和密码。例:-d "mysql://user:password@192.168.75.128:3389/databasename" --dbs 查询非常快。
-u 指定一个url连接,url中必须有?xx=xx 才行(最常用的参数)例:-u "www.abc.com/index.php?id=1"
-l 后接一个log文件,可以是burp等的代理的log文件,之后sqlmap会扫描log中的所有记录。例: -l log.txt
-x 站点地图,提交给sql一个xml文件。
-m 后接一个txt文件,文件中是多个url,sqlmap会自动化的检测其中的所有url。例: -m target.txt
-r 可以将一个post请求方式的数据包保存在一个txt中,sqlmap会通过post方式检测目标。例: -r post.txt
-g 使用google引擎搜索类似的网址,并且多目标检测。例: -g "inurl:\\".php?id=1\\"" \\是转义
-c 将使用的命令写在一个文件中,让sqlmap执行文件中的命令,我们可以用--save命令将配置写入文件。

Request

--method=METHOD 指定是get方法还是post方法。例: --method=GET --method=POST
--data=DATA 指明参数是哪些。例:-u "www.abc.com/index.php?id=1" --data="name=1&pass=2"
--param-del=PARA. 指明使用的变量分割符。例: -u "www.abc.com/index.php?id=1" --data="name=1;pass=2" --param-del=";"
--cookie=COOKIE 指定测试时使用的cookie,通常在一些需要登录的站点会使用。例: -u "www.abc.com/index.php?id=1" --cookie="a=1;b=2"
--cookie-del=COO.. 和前面的 --param-del=PARA. 类似,就是指明分割cookie的字符。
--load-cookies=L.. 从包含Netscape / wget格式的cookie的文件中加载cookie。
--drop-set-cookie 默认情况下,sqlmap是开启set-cookie功能的,也就是当收到一个含有set-cookie的http包的时候,下次sql会使用新的cookie进行发包,如果使用这条命令,就会关闭这个功能。在level>=2时会检测cookie注入。
--user-agent=AGENT 指定一个user-agent的值进行测试。例: --user-agent="aaaaaaa" 默认情况下,sqlmap会使用自己的user-agent进行测试(所以很多服务器发现user-agent是sqlmap的数据包直接认为是入侵),sqlmap自己的user-agent是:sqlmap/1.0-dev-nongit-201603020a89(http://sqlmap.org)
--random-agent 使用随机user-agent进行测试。sqlmap有一个文件中储存了各种各样的user-agent,文件在sqlmap/txt/user-agent.txt 在level>=3时会检测user-agent注入。
--host=HOST 指定http包中的host头参数。例: --host="aaaaaa" 在level>=5时才会检查host头注入。\\n是换行
--referer=REFERER 指定http包中的refere字段。例: --refere="aaaaa" 在level>=3时才会检测refere注入。
-H --headers 额外的header头,每个占一行。例:--headers="host:www.a.com\\nUser-Agent:yuangh"
--headers=HEADERS 跟上边一样,再举一个例子: --headers="Accept-Language: fr\\nETag: 123" 注意所有构造http包的部分均区分大小写
--auth-type=AUTH.. 基于http身份验证的种类。例: --auth-type Basic/Digest/NTLM 一共有三种认证方式。
--auth-cred=AUTH.. 使用的认证,例: --auth-type Basic --auth-cred "user:password"
--auth-file=AUTH.. 使用.PEM文件中的认证。例:--auth-file="AU.PEM" 少见。
--ignore-code=IG.. 无视http状态码。例: --ignore-code=401
--ignore-proxy 无视本地的代理,有时候机器会有最基本的代理配置,在扫描本地网段的时候会很麻烦,使用这个参数可以忽略代理设置。
--ignore-redirects 无视http重定向,比如登录成功会跳转到其他网页,可使用这个忽略掉。
--ignore-timeouts 忽略连接超时。
--proxy=PROXY 指定一个代理。例: --proxy="127.0.0.1:8087" 使用GoAgent代理。
--proxy-cred=PRO.. 代理需要的认证。例: --proxy="name:password"
--proxy-file=PRO.. 从一个文件加载代理的认证。
--tor 使用tor匿名网络,不懂。
--tor-port=TORPORT 设置默认的tor代理端口,不懂+2--tor-type=TORTYPE 设置tor代理种类,(HTTP, SOCKS4 or SOCKS5 (默认)),不懂+3--check-tor 检查是否正确使用Tor,不懂+4--delay=DELAY 每次发包的延迟时间,单位为秒,浮点数。例:--delay 2.5 有时候频繁的发包会引起服务器注意,需要使用delay降低发包频率。
--timeout=TIMEOUT 请求超时的时间,单位为秒,浮点数,默认30s。
--retries=RETRIES 超时重连次数,默认三次。例: --retries=5
--randomize=RPARAM 参数的长度,类型与输入值保持一致的前提下,每次请求换参数的值。有时候反复的提交同一个参数会引起服务器注意。
--safe-url=SAFEURL 用法和-u类似,就是一个加载测试url的方法,但额外功能是防止有时候时间长了不通讯服务器会销毁session,开启这种功能会隔一段时间发一个包保持session。
--safe-post=SAFE.. 和上面的一样,只是使用post的方式发送数据。
--safe-req=SAFER.. 和上面的一样,只是从一个文件获得目标。
--safe-freq=SAFE.. 频繁的发送错误的请求,服务器也会销毁session或者其他惩罚方式,开启这个功能之后,发几次错的就会发一次对的。通常用于盲注。
--skip-urlencode 跳过url编码,毕竟不排除有的奇葩网站url不遵守RFC标准编码。
--csrf-token=CSR.. 保持csrf令牌的token。
--csrf-url=CSRFURL 访问url地址获取csrf的token。
--force-ssl 强制使用ssl。
--hpp 使用http参数污染,通常http传递参数会以名称-值对的形势出现,通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的,就可能造成参数篡改。
--eval=EVALCODE 执行一段指定的python代码。例: -u "www.abc.com/index.php?id=1" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

Optimization

-o 开启下面三项(--predict-output,--keep-alive, --null-connection)
--predict-output 预设的输出,可以理解为猜一个表存在不存在,根据服务器返回值来进行判断,有点类似暴力破解,但和暴力破解又不同,这个是一个范围性的暴力破解,一次一次的缩小范围。
--keep-alive 使用http(s)长链接,性能更好,避免重复建立链接的开销,但占用服务器资源,而且与--proxy不兼容。
--null-connection 只看页面返回的大小值,而不看具体内容,通常用于盲注或者布尔的判断,只看对错,不看内容。
--threads=THREADS 开启多线程,默认为1,最大10。和 --predict-output 不兼容。

Injection

-p TESTPARAMETER 知道测试的参数,使用这个的话--level 参数就会失效。例: -p "user-agent,refere"
--skip=SKIP 排除指定的参数。例: --level 5 --skip="id,user-agent"
--skip-static 跳过测试静态的参数。
--param-exclude=.. 使用正则表达式跳过测试参数。
--dbms=DBMS 指定目标数据库类型。例: --dbms="MySQL<5.0>" Oracle<11i> Microsoft SQL Server<2005>
--dbms-cred=DBMS.. 数据库的认证。利: --dbms-cred="name:password"
--os=OS 指定目标操作系统。例: --os="Linux/Windows"
--invalid-bignum 通常情况下sqlmap使用负值使参数失效,比如id=1->id=-1,开启这个之后使用大值使参数失效,如id=9999999999--invalid-logical 使用逻辑使参数失效,如id=1 and 1=2--invalid-string 使用随机字符串使参数失效。
--no-cast 获取数据时,sqlmap会将所有数据转换成字符串,并用空格代替null。
--no-escape 用于混淆和避免出错,使用单引号的字符串的时候,有时候会被拦截,sqlmap使用char()编码。例如:select “a”-> select char(97)--prefix=PREFIX 指定payload前缀,有时候我们猜到了服务端代码的闭合情况,需要使用这个来指定一下。例: -u "www.abc.com/index?id=1" -p id --prefix")" --suffix "and ('abc'='abc"
--suffix=SUFFIX 指定后缀,例子同上。
--tamper=TAMPER 使用sqlmap自带的tamper,或者自己写的tamper,来混淆payload,通常用来绕过waf和ips。

Detection

--level=LEVEL 设置测试的等级(1-5,默认为1)lv2:cookie; lv3:user-agent,refere; lv5:host 在sqlmap/xml/payloads文件内可以看见各个level发送的payload
--risk=RISK 风险(1-4,默认1)升高风险等级会增加数据被篡改的风险。risk 2:基于事件的测试;risk 3or语句的测试;risk 4:update的测试
--string=STRING 在基于布尔的注入时,有的时候返回的页面一次一个样,需要我们自己判断出标志着返回正确页面的标志,会根据页面的返回内容这个标志(字符串)判断真假,可以使用这个参数来制定看见什么字符串就是真。
--not-string=NOT.. 同理,这个参数代表看不见什么才是真。
--regexp=REGEXP 通常和上面两种连用,使用正则表达式来判断。
--code=CODE 也是在基于布尔的注入时,只不过指定的是http返回码。
--text-only 同上,只不过指定的是页面里的一段文本内容。
--titles 同上,只不过指定的是页面的标题。

Techniques

--technique=TECH 指定所使用的技术(B:布尔盲注;E:报错注入;U:联合查询注入;S:文件系统,操作系统,注册表相关注入;T:时间盲注; 默认全部使用)
--time-sec=TIMESEC 在基于时间的盲注的时候,指定判断的时间,单位秒,默认5秒。
--union-cols=UCOLS 联合查询的尝试列数,随level增加,最多支持50列。例: --union-cols 6-9
--union-char=UCHAR 联合查询默认使用的占列的是null,有些情况null可能会失效,可以手动指定其他的。例: --union-char 1
--union-from=UFROM 联合查询从之前的查询结果中选择列,和上面的类似。
--dns-domain=DNS.. 如果你控制了一台dns服务器,使用这个可以提高效率。例: --dns-domain 123.com
--second-order=S.. 在这个页面注入的结果,在另一个页面显示。例: --second-order 1.1.1.1/b.php

Fingerprint

-f, --fingerprint 指纹信息,返回DBMS,操作系统,架构,补丁等信息。

Enumeration

-a, --all 查找全部,很暴力。直接用-a
-b, --banner 查找数据库管理系统的标识。直接用-b
--current-user 当前用户,常用,直接用--current-user
--current-db 当前数据库,常用,直接用--current-db
--hostname 主机名,直接用--hostname
--is-dba
--users 查询一共都有哪些用户,常用,直接用--users
--passwords 查询用户密码的哈希,常用,直接用--passwords
--privileges 查看特权,常用。例: --privileges -U username (CU 就是当前用户)
--roles 查看一共有哪些角色(权限),直接用--roles
--dbs 目标服务器中有什么数据库,常用,直接用--dbs
--tables 目标数据库有什么表,常用,直接用--tables
--columns 目标表中有什么列,常用,直接用--colums
--schema 目标数据库数据库系统管理模式。
--count 查询结果返回一个数字,即多少个。
--dump 查询指定范围的全部数据。例: --dump -D admin -T admin -C username
--dump-all 查询全部数据。例: --dump-all --exclude-sysdbs
--search 搜索列、表和/或数据库名称。
--comments 检索数据库的备注。
-D DB 指定从某个数据库查询数据,常用。例: -D admindb
-T TBL 指定从某个表查询数据,常用。例: -T admintable
-C COL 指定从某个列查询数据,常用。例: -C username
-X EXCLUDE 指定数据库的标识符。
-U USER 一个用户,通常和其他连用。例: --privileges -U username (CU 就是当前用户)
--exclude-sysdbs 除了系统数据库。
--pivot-column=P.. 枢轴列名,不懂。
--where=DUMPWHERE 在dump表时使用where限制条件。
--start=LIMITSTART 设置一个起始,通常和--dunmp连用。
--stop=LIMITSTOP 同上,设置一个结束。
--first=FIRSTCHAR 以第一个查询输出的字符检索,不懂。
--last=LASTCHAR 以最后一个查询输出的字符检索,不懂+2--sql-query=QUERY 执行一个sql语句。
--sql-shell 创建一个sql的shell。
--sql-file=SQLFILE 执行一个给定文件中的sql语句

以上是关于sqlmap使用的主要内容,如果未能解决你的问题,请参考以下文章

整理篇(sqlmap 源码分析os-shell 原理攻防角度使用sqlmap)

如何使用 xampp 设置 sqlmap 注入?

阅读sqlmap源代码,编写burpsuite插件--sqlmapapi

阅读sqlmap源代码,编写burpsuite插件--sqlmapapi

关于拼接SQL语句sqlMap的使用方法

SQLMap 源码阅读