SQLmap基本使用 基本必要参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 更新 SQLmap 只需确认是否可注入,并只显示 payload 技术与后端技术 sqlmap - u "URL" 获取数据库 sqlmap - u "URL" 获取数据库所有数据表 sqlmap - u "URL" - D database 获取指定数据表的字段 sqlmap - u "URL" - D database - T table 获取指定数据表的指定字段数据 sqlmap - u "URL" - D database - T table - C field1,field2 获取指定数据表的所有字段数据(去掉 - C 参数即可) sqlmap - u "URL" - D database - T table 不指定数据表,直接获取该指定数据库的所有数据 sqlmap - u "URL" - D database
常用参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 # 使用随机选择的 HTTP User - Agent 标头值,用于绕过 WAF # POST 数据 # 也可注入json,看网站怎么发送请求, # 使用情景通常发生在,某些登录后的页面才有注入点,不加cookie就访问不到该网站 # 当然也有些网站即使没登录,但是没cookie一样访问不到 # 使用情景通常是不加的话,可能会被后端或者防火墙拦截等等 # 如果在header中已经指定User - Agent,就别加 # 指定注入参数- p par1,par2 # 跳过注入参数 # 指定注入技术,不使用此参数,默认就是全测,有 BEUSTQ # B = boolean - based # E = error- based # U = union - based # S = stacked- queries # T = time - based # Q = inline- queries # 指定 union select 的 column 列数 # 可以手动 fuzzing 出来指定 # 指定使用union 技术时,每个字段的值是多少 # 例如,假设已知cols为5 ,且union select 1 ,2 ,3 ,4 ,5 ,2 跟5 可回显数据 # 如果我想指定注入2 的位置,可以这样设置 # # 指定payload前缀 # 指定payload后缀 # 显示注入过程详细信息,数字越大越详细 # (0 ~ 6 ,默认是1 ,常用是3 ,手动可注入但SQLmap找不到时,可以设6 协助调试) # 使用情景通常发生在fuzzing时的注入- v 3 # 指定后端数据库类型 # 中间有空格要使用双引号,如:"Microsoft Access" # 自动模式,自动选取默认选项 # 跳过防火墙检测测试 # 设定SQLmap注入检测风险技术,等级1 ~ 3 ,默认1 # ps. 原本仅使用AND ,会变成OR 也使用 # 在某些注入的情景可能会误操作数据库数据,因此请谨慎使用 # 设定SQLmap注入检测层级,默认 1 ,每个层级的说明如下 # Level 1 :在 Level 1 中,SQLmap 会执行基本的测试,包括以下方面: # 检测基本的 SQL 注入点。 # 基于 UNION 运算符的简单注入测试。 # 基本的布尔型注入测试,如 AND / OR payload 测试。 # Level 2 :在 Level 2 中,SQLmap 将进行进一步的测试,包括: # 检测复杂的 SQL 注入点,如带有过滤机制的情况。 # 测试基于时间延迟的注入,以绕过某些安全检测。 # 测试多个可能的注入点。 # Level 3 :在 Level 3 中,SQLmap 将进一步扩展其测试范围,可能会涉及: # 检测 cookie 或其他 HTTP 请求参数中的注入点。 # 测试更复杂的 SQL 注入漏洞,如深度嵌套的 SQL 查询或存储过程。 # 测试更多不同类型的数据库。 # Level 4 :在 Level 4 中,SQLmap 将采用更多的高级技术和深度测试,这可能包括: # 测试对目标系统的各种服务进行深度扫描,以寻找更多的注入点。 # 测试对目标系统进行较为精细的指纹识别,以定制更有效的注入攻击。 # Level 5 :在 Level 5 中,SQLmap 将启用所有可用的测试和技术,这可能包括: # 对目标系统的所有输入点进行广泛的测试,包括 HTTP 请求中的各种参数和 cookies。 # 使用高度复杂的注入模式,如二次注入、堆叠注入等。 # 对目标系统进行更广泛和深入的分析,以确定可能存在的漏洞点。 # 让SQLmap自己爬网页上的注入点 # 有时候因为TLS/ SSL问题会导致sqlmap连不上(但是浏览器又可以正常访问),直接使用此命令即可
成功注入后会使用的参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 # 直接执行SQL 语法 # 注意,CRUD语法不一定支持,即使有堆叠注入建议还是手动操作 # 列出数据库banner、version信息- b # 列出所有数据库 # 指定数据库名称- D "DB_Name" # 列出指定数据库内的所有表(需搭配- D参数) # 指定表名称- T "Table_Name" # 列出指定表内的所有列(需搭配- T参数) # 指定要列出的列数据- C "account,password" # 指定不要列出的列数据- X "id,time" # 列出指定列的所有数据 # 如果不使用- C参数,则列出指定表的所有字段数据 # 仅列出符合where 条件的数据 # 使用场景通常发生在,你只想查找管理员或某些特定数据,不想全部注入出来 # 如果你只想获取user_id字段符合'admin' 字符串的数据 # 列出指定数据库内所有表的数据 # (只需- D "DB_Name"即可,不需要后面的 # 检测数据库是否有DBA权限,例如读文件、写文件 # 但这个结果仅供参考,不一定准确(个人实战经验) # 获取SQL 注入账号的密码哈希 # 检测当前使用的数据库 # 检测当前使用数据库的用户名 # 枚举当前注入点权限所能访问到的所有数据库用户 # 尝试读取指定路径下的文件 # 指定尝试写入对方服务器的文件(需搭配 # 如果你直接把文件放在SQLmap目录,参数不一定要绝对路径,相对路径也可以 # 指定服务器后端的绝对路径(需搭配 # 进入模拟SQL 指令互动环境 # 尝试获取远程命令执行(RCE) # 指定后端写文件路径,使用 # 指定后端系统类型,使用场景通常发生在SQLmap误判后端操作系统 # 例如要操作读写文件时,后端是windows,结果写成linux路径导致失败 # 可选值有:windows、macos、linux、unix
例外情况 当手动测试确定存在注入但SQLmap检测不到时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 # 仅根据渲染完毕的静态html页面做比较 # 检测页面某个字符串作为布尔注入前后比较值 # 让SQLmap不对payload做URL encode编码 # 让SQLmap不将字符串做转义 # 例如'abc' 不转义成0x616263 或CHAR (97 )+ CHAR (98 )+ CHAR (99 ) # 设置网页反应的延迟时间,默认是5 (这里指的是time - based注入技术时的反应检测时间) # 设置网页反应的延迟时间,默认是30 (这里指的是等待网页response的时间) # 设置连接超时的重试次数,默认是3 次 # 可能后端程序有错误导致500 http code,且sqlmap因该错误无法进行注入 # 但是手动检测发现会有time - based反应之类的,让sqlmap忽略500 http code直接注入 # 有时候即使你想开启batch,但是SQLmap会自动选择默认选项(但可能该选项不是你想要的) # 那就可以使用此参数预先设置你要的结果,例如,注入过程中SQLmap询问: # redirect is a result of a POST request. Do you want to resend original POST data to a new location? [Y/ n] Y # 如果你想选n,而不是默认的Y,则可以这样: # # 但这样太长,其实也可以用部分内容,如下(主要是内容只要在一定范围内,SQLmap能识别是哪个问题的选择即可)
资料无法获取问题 SQLmap明明已经注入出payload技术,但获取数据时却失败(或没有任何数据),有时候不一定是WAF的拦截,大概率是后端数据解析异常所导致(也有可能是误报,建议加上–flush-session重试),因此可尝试加上以下参数(实战中很常用到)
1 2 3 4 5 6 7 8 # 将输出数据转换为16 进制数据后提取 # 不要对注入的数据进行编码或者自动转换类型 # 例如注入的字符是 var= test[0 ]'-- a # 让SQLmap不要转换成 var=test%5B0%5D' # 或者让SQLmap不要对数据进行自动转型,比如把某个字符串转换成 VARCHAR 类型
资料乱码问题 当注入出来的结果为乱码时,有可能字段是blob等因素,可以转成二进制输出
1 2 3 4 5 6 # 忽略存储在会话文件中的查询结果 # 具有二进制值的结果字段(例如"摘要")
加速注入 当你非常清楚漏洞情况并且想跳过一些测试负载,你可以使用如下参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 指定SQLmap只测试哪种模板的有效负载 # 例如 # 就只会测试DECLARE 的堆叠注入 # 指定SQLmap跳过测试哪种模板的有效负载 # 例如 # 就会跳过测试DECLARE 的堆叠注入模板 python sqlmap.py ... 或者 python sqlmap.py ...
二次注入 1 2 3 4 5 6 # 当某个注入点会先存储payload,在访问其他页面才会触发执行SQL 语句时可用 # 如果不是单纯用GET 访问可触发,可能需要POST之类的复杂请求 # 就可以改用文件的方式直接给header让sqlmap解析,就像 - r 参数那样
常用绕过waf脚本 当防火墙阻挡规则有迹可循且不复杂,也可以自己编写绕过脚本
1 2 3 4 5 # 当规则可能很简单,你不想写tamper,也可以改用 # 如果目标为 xxx.php?id= 1 ,且你只想将AND 换成&& ,则可以
captcha 当注入点需要先通过captcha图形验证码时,可以使用此参数来串联图形识别模块以绕过此限制