SQLMap使用详解

前言:

今天来总结一下sqlmap注入神器的详细使用方法。


一、SQLMap介绍

1、Sqlmap简介:

Sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库。

2、Sqlmap支持的注入方式:

Sqlmap全面支持六种SQL注入技术:

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

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

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

  • 联合查询注入:在可以使用Union的情况下的注入。

  • 堆查询注入:可以同时执行多条语句时的注入。

  • 带外注入:构造SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。

3、Sqlmap输出级别:

使用 Sqlmap 对一个注入点进行测试时,可以使用 -v x 参数指定回显信息的复杂度,x范围为[0~6],共有 7 个等级,默认为 1。

  • 0:只显示python错误以及严重的信息。
  • 1:同时显示基本信息和警告信息。(默认)
  • 2:同时显示debug信息。
  • 3:同时显示注入的payload。
  • 4:同时显示HTTP请求。
  • 5:同时显示HTTP响应头。
  • 6:同时显示HTTP响应页面。

如果想看到 Sqlmap 发送的测试 payload 最好的等级就是3,例:

sqlmap.py -v 3 -u "http://www.xxx.com/a.php?id=x"

二、SQLMap安装

Sqlmap官网:http://sqlmap.org/,Sqlmap的安装需要Python环境,最新版可以运行在 Python 2.6, 2.7 和 3.x 版本的任何平台上。

下载完成后可以添加进环境变量,方便使用(不添加也可以用)

当出现这个画面时工具即可正常运行了。

三、SQLMap使用:

1、判断是否存在注入:

假设目标注入点是 http://127.0.0.1/sqli-labs/Less-1/?id=1,判断其是否存在注入的命令如下:

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1

结果显示存在注入:
当注入点后面的参数大于等于两个时,需要加双引号,如下所示。

sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1&uid=2"

运行完判断是否存在注入的语句后,爆出一大段代码,这里有三处需要选择的地方:第一处的意思为检测到数据库可能是MySQL,是否需要跳过检测其他数据库;第二处的意思是在“level1、risk1”的情况下,是否使用MySQL对应的所有Payload进行检测;第三处的意思是参数id存在漏洞,是否要继续检测其他参数,一般默认按回车键即可。

可以在语句后面加参数:--beach 会选定默认的选项执行(如上)。

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

从txt文件中加载HTTP请求,Sqlmap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie、POST数据等),txt文件中的内容为Web数据包,如下:
判断是否存在注入的命令如下,运行后的结果如图所示,-r一般在存在cookie注入时使用。

sqlmap.py -r 1.txt

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

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

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --dbs


从图中可以看到,查询出了10个数据库及所有数据库的库名。当继续注入时,--dbs缩写成-D xxx,其意思是在xxx数据库中继续查询其他数据。

4、获取数据库中的表名:

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

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security --tables


从图中可以看到 security 数据库中拥有的4个数据表。当继续注入时,--tables缩写成-T,意思是在某表中继续查询。

5、获取表中的字段名:

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

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security -T users --columns


从图中可以看到在 security 数据库中的users表中一共有3个字段。在后续的注入中,--columns缩写成-C

6、获取字段内容:

该命令是查询完字段名之后,获取该字段中具体的数据信息,如下所示。

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

这里需要下载的数据是 security 数据库里 users 表中 username和password 的值,如图所示:

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

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

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --users

可以看到,当前用户的账号是root,如图所示:

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

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

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --passwords


从图中可以看到,密码使用MySQL5加密,可在网站中自行解密(自带的解密很慢)。

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

使用该命令可以列出当前网站使用的数据库,如下所示。

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --current-db


从图中可以看到数据库是security。

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

使用该命令可以列出当前网站使用的数据库用户,如下所示。

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --current-user


从图中可以看到,用户是root。

四、SQLMap进阶:参数讲解

1、--level 5:探测等级

参数--level 5指需要执行的测试等级,一共有5个等级(1~5),不加 level 默认是1。5级包含的 Payload 最多,会自动破解出 cookie、XFF等头部注入。当然,level 5的运行速度也比较慢。

这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie 在 level 为2时就会测试,HTTP User-Agent/Referer 头在 level 为3时就会测试。总之,在不确定哪个 payload 或参数为注入点时,为了保证全面性,建议使用高的 level 值。

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

该命令用于查看当前账户是否为数据库管理员账户,如下所示:

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --is-dba

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

该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色,如图所示:

4、--referer:HTTP referer头

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

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --referer http://www.baidu.com
5、--sql-shell:运行自定义SQL语句

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

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --sql-shell

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

在当前用户有权限使用特定的函数的前提下,如果数据库为MySQL、PostgreSQL,Sqlmap会上传一个二进制库,包含用户自定义的函数sys_exec ()sys_eval (),那么创建的这两个函数就可以执行系统命令。

如果数据库是微软 SQL Server时,Sqlmap通过存储过程 xp_cmdshell 来执行任意命令,如果 xp_cmdshell 被禁用(SQL Server 2005及以上版本默认被禁用),则Sqlmap会重新启用它;如果不存在,会自动创建。

--os-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时(如PHP或ASP+Mysql),仍然可以使用 INTO OUTFILE写进可写目录,创建一个Web后门。

Sqlmap支持ASP、ASP.NET、JSP和PHP四种语言(要想执行该参数,需要有数据库管理员权限,也就是--is-dba的值要为True)。

1.执行系统命令:

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --os-cmd=ipconfig

执行后根据提示选择网站语言,然后回车,指定目标站点根目录,然后继续回车即可完整执行命令。

2.执行shell:

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --os-shell

执行后根据提示选择网站语言,然后回车,指定目标站点根目录后回车,输入命令即可执行。

执行命令后会在网站根目录上传两个文件:tmpbxbxz.php、tmpuoiuz.php(此文件为上传页面)

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

该命令用于读取执行文件,当数据库为MySQL、PostgreSQL或MicrosoftSQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --file-read "C:/11.txt"


执行完会把文件保存到本地目录下

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

该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件。

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --file-write "C:/1.txt" --file-dest "C:/windows/Temp/1.php"

执行结束即可把本地的1.txt 文件上传到目标服务器下


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2058751973@qq.com

×

喜欢就点赞,疼爱就打赏