Braid信息安全博客 - Web安全|代码审计|安全开发|Java|php|python

【渗透测试】sqlmap基础

0x01 sqlmap简介

SQLMAP是一个开源的渗透测试工具,它主要用于自动化地侦测和实施SQL注入攻击以及渗透数据库服务器。SQLMAP配有强大的侦测引擎,适用于高级渗透测试用户,不仅可以获得不同数据库的指纹信息,还可以从数据库中提取数据,此外还能够处理潜在的文件系统以及通过数据连接执行系统命令等,所以SQLMAP是渗透测试者必备的一项工具,而这篇分享正式对sqlmap基础用法和一些深入的高级用法进行讲解。

0x02 一个案例

http://codeaudit.org/sqltest/news.php?id=1
当给sqlmap这么一个url的时候,它会做如下工作(功能):

1、识别出哪种数据库
2、判断可注入的参数
3、判断可以用那种SQL注入技术来注入
4、根据用户选择,读取哪些数据

我们打开sqlmap跑一下上面这个url,首先他识别出来是MySQL数据库如下:

识别可注入的参数,这里就是参数id如下:

判断那种SQL注入技术来进行注入,如下图,id这个注入点支持布尔型盲注、报错注入、基于时间的盲注和联合查询注入这四种类型

获取数据库用户名

python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ —current-user

获取当前的数据库

python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ —current-db

获取当前数据库中所有的表

python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ -D test —tables

获取当前数据库中某个表的表结构

python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ -D test -T admin —columns

Dump数据(脱裤)

python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ -D test -T admin -C name,pass —dump

0x03 检测端相关的参数

检测POST请求中的参数

参数:—data
此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。
例子:
python sqlmap.py -u “http://codeaudit.org/sqltest/news.php“ —data=”id=1”

检测COOKIE请求中的参数

参数:—cookie,—load-cookies,—drop-set-cookie
这个参数在以下两个方面很有用:
1、注入点是需要登陆后才可以注入的时候。
2、需要测试cookie里参数的注入时。
可以通过抓包把cookie获取到,复制出来,然后加到—cookie参数里。
例子:
python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ —cookie=”sessionid=7f658c3b91d10ae”
当设置—level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。
PS:还可以设置HTTP User-Agent头、Referer头或者额外的HTTP头并进行相应的头部注入,自行查询。

指定测试参数

参数:-p,—skip
sqlmap默认测试所有的GET和POST参数,但是你可以手动用-p参数设置想要测试的参数。例如: -p “id,user-anget”
当你使用—level的值很大但是有个别参数不想测试的时候可以使用—skip参数。
例如:—skip=”user-angent.referer”
在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加
例如:
python sqlmap.py -u “http://targeturl/param1/value1
/param2/value2/“
sqlmap将会测试value1的位置是否可注入。
指定数据库**
参数:—dbms
默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2

注入payload

参数:—prefix,—suffix
在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。
例如,代码中是这样调用数据库的:
$query = “SELECT FROM users WHERE id=(’” . $_GET[’id’] . “’) LIMIT 0, 1”;
这时你就需要—prefix和—suffix参数了:
python sqlmap.py -u “http://targeturl/sqlmap/mysql/get_str_brackets.php?id=1“ -p id —prefix “’)” —suffix “AND (’abc’=’abc”
这样执行的SQL语句变成:
$query = “SELECT
FROM users WHERE id=(’1’) AND (’abc’=’abc’) LIMIT 0, 1”;

指定数据库服务器系统

参数:—os
默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

指定sqlmap的探测技术

参数:—technique
这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。
支持的探测方式如下:

B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)

设定延迟注入的时间

参数:—time-sec
当使用继续时间的盲注时,时刻使用—time-sec参数设定延时时间,默认是5秒。

探测等级

参数:—level
共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。
这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。
总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

风险等级

参数:—risk
共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。
测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。

0x04 数据端相关的参数

当前用户

参数:-current-user
在大多数据库中可以获取到管理数据的用户。

当前数据库

参数:—current-db
返还当前连接的数据库。

当前用户是否为管理

参数:—is-dba
判断当前的用户是否为管理,是的话会返回True。

列数据库管理的用户

参数:—users
当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

列出并破解数据库用户的hash

参数:—passwords
当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
例子:
python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1 —passwords -v 1”

列出数据库管理员权限

参数:—privileges
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。

列出数据库管理员角色

参数:—roles
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。
仅适用于当前数据库是Oracle的时候。

列出数据库系统的数据库

参数:—dbs
当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。

列举数据库表

参数:—tables,—exclude-sysdbs,-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。
如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。
—exclude-sysdbs参数是指包含了所有的系统数据库。
需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

列举数据库表中的字段

参数:—columns,-C,-T,-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。
如果没有使用-D参数指定数据库时,默认会使用当前数据库。

获取表中数据个数

参数:—count
有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。

运行自定义的SQL语句

参数:—sql-query,—sql-shell
sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。
如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。
例子:
python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1 —sql-query”

0x05 文件操作相关的参数

读取文件

参数:—file-read
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。

将本地的文件写入到web服务器

参数:—file-write,—file-dest
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。
例子:
python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ —file-write=”E:\1.txt” —file-dest=”D:\winsoftware\wamp\www\sqltest\shell.php”

运行任意操作系统命令

参数:—os-cmd,—os-shell
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。
那么他创建的这两个函数可以执行系统命令。在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。
例子:
python sqlmap.py -u “http://codeaudit.org/sqltest/news.php?id=1“ —os-shell

主要参考:http://drops.wooyun.org/tips/143

本文由HackBraid整理总结,原文链接:http://www.cnbraid.com/2016/sqlmapbase.html,如需转载请联系作者。