sqlmap是一个强大的开源渗透测试工具,它可以自动检测和利用SQL注入漏洞并接管数据库服务器的过程。当把url交给sqlmap时,若有漏洞sqlmap则会返回数据库版本信息等。
- 它支持MySQL, Oracle, PostgreSQL, DB2, SQLite等众多数据库
- 它支持六种SQL注入技术(boolean-based blind, time-based blind, error-based, UNION query-based, stacked queries and out-of-band)
- 支持列举出users, password hashes, privileges, roles, databases, tables and columns
- …
下载地址和更多详细介绍可参见:http://sqlmap.org/
在linux机器上可以通过进入sqlmap目录下,打开终端使用以下命令启动:
python sqlmap.py #前提是你系统中安装了python环境
你也可以在环境变量.profile中添加sqlmap启动路径,这样便可直接使用sqlmap来启动:
# sudo vim ~/.profile 并添加如下代码,然后source ~/.profile使其生效
alias sqlmap='python /opt/sqlmap/sqlmap.py'
效果如图所示:
1.使用方法
sqlmap参数较多,可使用sqlmap -h
或者sqlmap -hh
显示sqlmap的详细帮助信息。
在此我使用DVWA来进行操作。DVWA是一个提供了暴力破解、命令注入、CSRF、SQL注入、XSS等学习的在线靶场,地址为http://43.247.91.228:81/login.php
,账号:admin
密码:password
。它提供了Low、Medium、High、Impossible四个不同的安全等级。此处我们使用最低等级Low。
1.1 GET请求的注入
-
在dvwa页面上选择SQL Injection,随便输入一个User ID然后提交,你将看URL发生变化如图所示:
-
在页面点击鼠标左键选择“检查”,选中”Network",刷新页面以获取登录请求的cookie信息,以便sqlmap发送请求使用,如图所示:
-
使用-u选项向目标url进行漏洞检查,返回注入信息和一些简单的服务器信息,如图所示:
或者也可以使用-r选项来获取信息,同样对于刚才的登录请求,拷贝request headers
存入一个文件中,再使用-r读取文件,如图所示:
-
使用
--dbs
获取所有数据库名称,如图所示:
如图所示没有得到所有数据库名称,而是报错:[CRITICAL] unable to retrieve the database names
,可以使用--level
选项增加测试等级(默认为1)或者使用--flush-session
,如图所示:
-
使用
--tables
获取数据库中的表名称,如图所示:
-
使用-D获取指定数据库表名称,-T指定要操作的数据库表名称并得到表中所有数据,如图所示:
1.2 POST请求的注入
-
在dvwa页面上选择XSS(Stored),随便输入Name和Message信息然后提交,同样复制URL信息和Form Data信息到sqlmap,如图所示:
-
使用–data指定表单注入数据,并且使用–batch在运行过程中自动选择yes和–smart启发式快速判断,以减少运行占用时间,如图所示:
余下的获取指定数据库表信息操作和前面get请求所用的参数一致。
关于sqlmap使用的更多参数选项说明可参考:https://www.freebuf.com/sectool/164608.html
2.基本防范
- 参数过滤,过滤and等参数,例如:
select address,name from `user` where id=1 and 1=2;
- 特殊字符转义,对单双引号、斜杆等特殊字符进行转义,例如:
select address,name from `user` where id=1';
- 避免SQL裸写或直接拼接SQL语句和参数,例如:
select address,name from `user` where id=${id};
- 编码时使用#{}处理参数,或使用PreparedStatement,都能达到对SQL语句预编译的效果,从而提高安全性