SQLmap使用入门

  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.png


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请求的注入

  1. 在dvwa页面上选择SQL Injection,随便输入一个User ID然后提交,你将看URL发生变化如图所示:
    2.png

  2. 在页面点击鼠标左键选择“检查”,选中”Network",刷新页面以获取登录请求的cookie信息,以便sqlmap发送请求使用,如图所示:
    3.png

  3. 使用-u选项向目标url进行漏洞检查,返回注入信息和一些简单的服务器信息,如图所示:
    4.png
    5.png
    或者也可以使用-r选项来获取信息,同样对于刚才的登录请求,拷贝request headers存入一个文件中,再使用-r读取文件,如图所示:
    6.png
    7.png

  4. 使用--dbs获取所有数据库名称,如图所示:
    8.png
    9.png
      如图所示没有得到所有数据库名称,而是报错:[CRITICAL] unable to retrieve the database names,可以使用--level选项增加测试等级(默认为1)或者使用--flush-session,如图所示:
    10.png
    11.png

  5. 使用--tables获取数据库中的表名称,如图所示:
    12.png
    13.png

  6. 使用-D获取指定数据库表名称,-T指定要操作的数据库表名称并得到表中所有数据,如图所示:
    14.png
    15.png
    16.png

1.2 POST请求的注入

  1. 在dvwa页面上选择XSS(Stored),随便输入Name和Message信息然后提交,同样复制URL信息和Form Data信息到sqlmap,如图所示:
    17.png

  2. 使用–data指定表单注入数据,并且使用–batch在运行过程中自动选择yes和–smart启发式快速判断,以减少运行占用时间,如图所示:
    18.png

余下的获取指定数据库表信息操作和前面get请求所用的参数一致。

关于sqlmap使用的更多参数选项说明可参考:https://www.freebuf.com/sectool/164608.html


2.基本防范

  1. 参数过滤,过滤and等参数,例如:select address,name from `user` where id=1 and 1=2;
  2. 特殊字符转义,对单双引号、斜杆等特殊字符进行转义,例如:select address,name from `user` where id=1';
  3. 避免SQL裸写或直接拼接SQL语句和参数,例如:select address,name from `user` where id=${id};
  4. 编码时使用#{}处理参数,或使用PreparedStatement,都能达到对SQL语句预编译的效果,从而提高安全性

References:

原创文章 38 获赞 13 访问量 4030

猜你喜欢

转载自blog.csdn.net/qq_36287943/article/details/104758265
今日推荐