sqlmap是在sql注入中非常常用的一款工具,由于其开源性,适合从个人到企业,从学习到实战,各领域各阶段的应用,我们还可以将它改造成我们自己独有的渗透利器。这款工具中,大大小小191个参数,在这篇文章中,我将一一介绍,其实很多参数我也没有使用过,所以有一些是自己的经验,还有一些是网上搜集的资料和sqlmap文档的记载。
参数简介
以下是使用-hh参数看见的全部的sqlmap参数,我们分阶段进行讲解。
sqlmap.py -hh
___
__H__
___ ___[,]_____ ___ ___ {1.2.3.41#dev}
|_ -| . ['] | .'| . |
|___|_ [']_|_|_|__,| _|
|_|V |_| http://sqlmap.org
Usage: sqlmap.py [options]
Options:
-h, --help Show basic help message and exit
-hh Show advanced help message and exit
--version Show program's version number and exit
-v VERBOSE Verbosity level: 0-6 (default 1)
Target:
At least one of these options has to be provided to define the
target(s)
-d DIRECT Connection string for direct database connection
-u URL, --url=URL Target URL (e.g. "http://www.site.com/vuln.php?id=1")
-l LOGFILE Parse target(s) from Burp or WebScarab proxy log file
-x SITEMAPURL Parse target(s) from remote sitemap(.xml) file
-m BULKFILE Scan multiple targets given in a textual file
-r REQUESTFILE Load HTTP request from a file
-g GOOGLEDORK Process Google dork results as target URLs
-c CONFIGFILE Load options from a configuration INI file
。。。。。。。。。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
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 3:or语句的测试;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语句
Brute force
-
--common-tables检查有没有记录表信息的公共表,比如mysql>=5.0会有一个information_schema库,储存了整个数据库的基本信息。有这个会方便很多。 -
--common-columns有没有记录公共列的表,比如Access就没有列信息。这两种方法都会使用暴力破解。
User-defined function injection
-
--udf-inject编译共享库创建并上传至DB Server,生成UDF实现高级注入,不懂。 -
--shared-lib=SHLIB同上,不懂。
File system access
-
--file-read=RFILE读取目标站点的一个文件。例:--file-read="/etc/password" -
--file-write=WFILE写入到目标站点的一个文件,通常和--sql-query连用。例:--sql-query="select "一句话木马" --file-write="shell.php" -
--file-dest=DFILE同上,只是使用绝对路径写入。
Operating system access
-
--os-cmd=OSCMD执行一句系统命令。例:--os-shell="ipconfig -all" -
--os-shell创建一个对方操作系统的shell,远程执行系统命令。直接用即可--os-shell -
--os-pwn同上,获取一个OOB shell,meterpreter或VNC。 -
--os-smbrelay同上,一键获取一个OOB shell,meterpreter或VNC。 -
--os-bof利用缓冲区溢出。 -
--priv-esc自动提权,数据库进程用户权限提升。 -
--msf-path=MSFPATHMetasploit Framework本地的安装路径。 -
--tmp-path=TMPPATH远程临时文件目录的绝对路径。
Windows registry access
-
--reg-read读一个Windows注册表。 -
--reg-add添加一个注册表。 -
--reg-del删一个注册表。 -
--reg-key=REGKEY和之前连用,注册表key值。 -
--reg-value=REGVAL和之前连用,注册表值。 -
--reg-data=REGDATA和之前连用,注册表数据。 -
--reg-type=REGTYPE和之前连用,注册表类别。
General
-
-s SESSIONFILE从一个文件加载保存的session。 -
-t TRAFFICFILE记录流文件的保存位置。 -
--batch批处理,在检测过程中会问用户一些问题,使用这个参数统统使用默认值。 -
--binary-fields=..指定二进制结果的字段。 -
--check-internet在评估目标之前检查互联网连接,新功能。 -
--crawl=CRAWLDEPTH从起始位置爬取的深度。例:--crawl=3 -
--crawl-exclude=..除了哪些页面之外全部爬取。例:--crawl-exclude="abc.com/logout.php" -
--csv-del=CSVDEL指定在CSV输出中使用的分隔字符。 -
--charset=CHARSET强制字符串编码。例:--charset=GBK -
--dump-format=DU..转储数据的格式 ,有(CSV (默认), HTML,SQLITE)三种。 -
--encoding=ENCOD..用于数据检索的字符编码。例:--encoding=GBK -
--eta显示每个输出的预计到达时间 。 -
--flush-session清空会话信息。 -
--forms在目标URL上解析和测试表单。 -
--fresh-queriessqlmap每次查询都会讲查询结果储存在.sqlmap文件夹中,下次再有相同测查询会调用上次的查询结果,使用这个参数可以忽略文件中有的记载结果,重新查询。 -
--har=HARFILE将所有http流量记录在一个har文件中。 -
--hexdump非ascii字符时,将其编码为16进制,收到后解码还原。 -
--output-dir=OUT..输出结果至文件。例:--output-dir=/tmp -
--parse-errors解析并显示报错信息。 -
--save=SAVECONFIG将使用的命令保存到配置ini文件 -
--scope=SCOPE和-l类似,只是这个可以过滤信息,使用正则表达式过滤网址。 -
--test-filter=TE..根据有效负载和/或标题,不懂。 -
--test-skip=TEST..根据有效负载和/或标题跳过测试,不懂+2。 -
--update更新sqlmap。
Miscellaneous
-
-z MNEMONICS参数助记符,比较傻的一个功能。例:-z "bat,randoma,ign,tec=BEU"其实就是只要你写的字母可以唯一匹配其他参数,就可以生效。 -
--alert=ALERT在找到SQL注入时运行主机OS命令。 -
--answers=ANSWERS设置问题答案,在刚刚的--batch可以跳过很多问题,但只是选择默认值,可以使用者个参数对特定问题设定特定答案。例:--answer "extending=N" -
--beep在问题和/或当SQL注入被发现时发出嘟嘟声。。。。。。。。。 -
--cleanup从SqLMAP特定的UDF和表中找数据库,类似暴力破解。 -
--dependencies检查缺少的Sql映射依赖项。 -
--disable-coloring禁用控制台输出着色。 -
--gpage=GOOGLEPAGE在指定页使用google结果,不懂。 -
--identify-waf识别目标的防火墙。 -
--mobilecosplay 手机。 -
--offline在脱机模式下工作。 -
--purge-output情况输出文件夹。 -
--skip-waf跳过WAF/IPS/IDS保护的启发式检测。 -
--smart有大量检测目标时候,只选择基于错误的检测。 -
--sqlmap-shell创建一个交互的sqlmap_shell,不懂。 -
--tmp-dir=TMPDIR更改存储临时文件的本地目录。 -
--web-root=WEBROOT设置Web服务器文档根目录。例:--web-root="/var/www" -
--wizard新手教程。