type
status
date
slug
summary
tags
category
icon
password
• SQLMAP
◦ SQLMAP对URL可以干嘛?
▪ 1.判断可注入的参数
▪ 2.判断可以用哪种SQL注入技术来进行注入
▪ 3.识别出是哪种数据库以及版本
▪ 4.根据用户选择,读写哪些数据
◦ 注入模式
▪ 1.基于布尔的盲注,即可以根据返回页面判断条件真假的注入
▪ 2.基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断
▪ 3.基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
▪ 4.联合查询注入,可以使用UNION的情况下的注入
▪ 5.堆查询注入,可以同时执行多条语句的执行时的注入
◦ 支持的数据库注入
▪ MySQL,Oracle,PostgreSQL
▪ Microsoft SQL Server,Microsoft Access,IBM DB2
▪ SQLite,Firebird,Sybase,SAP MaxDB
◦ SqlMap参数
▪ 1.观察数据
• -v 参数,共有七个等级,默认为1
• -v 0 只显示Python错误以及严重的信息
• -v 1 同时显示基本信息和警告信息(默认)
• -v 2 同时显示Debug信息
• -v 3 同时显示注入的payload
• -v 4 同时显示HTTP请求
• -v 5 同时显示HTTP响应头
• -v6 同时显示HTTP响应页面
• sqlmap发送的测试payload最好的等级就是3
▪ 2.获取目标的方式
• 1.直连到数据库
◦ 参数:-d
◦ 对单个数据库实例运行sqlmap
◦ sqlmap -d "mysql://admin:admin@IP:3306/db_name" -f --banner --dbs --users
• 2.目标URL
◦ 参数:-u 或--url
◦ 格式:http(s)://targeturl[:port]/[...]
◦ 例如:sqlmap -u "https://www.target.com/vuln.php?id=1" -f --banner --dbs --users
• 3.从Burp或者WebScarab代理中获取日志
◦ 参数:-l
◦ 把Burp proxy或者WebScarab Proxy中的日志直接导出来交给sqlmap
• 4.从文本中获取多个目标扫描
◦ 参数:-m
◦ URL保存在文本中,sqlmap会一个一个检测
• 5.从文件中加载HTTP请求
◦ 参数:-r
◦ 可以跳过设置一些其他参数比如cookie,post数据等...
◦ 当请求是HTTPS的时候需要配合 --force-ssl 参数来使用,或者在Host头后面加上:443
• 6.处理Google的搜索结果
◦ 参数:-g
◦ sqlmap可以测试注入Google的搜索结果中的GET参数
◦ 例如:sqlmap -g "inurl:\".php?id=1\""
• 7.从一个配置加载选项INI文件
◦ 参数:-c
◦ 加载sqlmap.conf文件里面的相关配置
▪ 3.请求方式
• http数据
◦ 参数:--data
◦ 将数据以Post方式提交,sqlmap会像检测GET参数一样检测Post的参数
◦ 例如:sqlmap -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users
• 参数拆分字符
◦ 参数:--param-del
◦ 当GET或Post的数据需要用其他字符分割测试参数的时候需要用到此参数
◦ 例如:sqlmap -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users
• HTTP Cookie头
◦ 参数:--cookie,--load-cookies,--drop-se-cookie
◦ 1.web应用需要登录的时候 2.想要在这些头参数中测试SQL注入时
◦ 如果不想接受Set-Cookie可以使用--drop-set-cookie参数来拒接
• HTTP User-Agent头
◦ 参数:--user-agent,--random-agent
◦ 可以使用--user-anget参数来修改,同时也可以使用--random-adent参数来随机的从./txt/user-agents.txt中获取
◦ 当--level参数设定为3或者3以上的时候,会尝试对User-Angnet进行注入
• HTTP Host头
◦ 参数:--host
◦ 可以手动设置HTTPHost头的值
• HTTP Referer头
◦ 参数:--referer
◦ Sqlmap可以在请求中伪造HTTP中的referer,当--level参数设定为3或3以上的时候会尝试对referer注入
• 额外的HTTP头
◦ 参数:--headers
◦ 可以通过--headers参数来增加额外的http头
• HTTP认证保护
◦ 参数:--auth-type,--auth-cred
◦ 登陆HTTP的认证保护支持的三种方式
▪ 1.Basic
▪ 2.Digest
▪ 3.NTLM
◦ sqlmap -u "http://ip/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "username:password"
• HTTP协议的证书认证
◦ 参数:--auth-type,--auth-cert
◦ 当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file
▪ key_file:是格式为PEM文件,包含着私钥
▪ cert-file:是格式为PEM的连接文件
• HTTP协议私有秘钥身份验证
◦ 参数:--auth-private
◦ 这个选项应该在web服务器需要使用适当的客户端私钥进行身份验证时提供的价值是PEM格式的key_file包含着的私钥
• HTTP(S)代理
◦ 参数:--proxy,--proxy-cred,--ignore-proxy
◦
▪ 使用--proxy代理的格式为:http://url:port
▪ 当HTTP(S)代理需要认证时可使用--proxy-cred参数:username:password
▪ --ignore-proxy拒绝使用本地局域网的HTTP(S)代理
• Tor网络匿名
◦ 参数:--tor,--tor-port,--tor-type,--check-tor
◦ 如果需要保持匿名而不是经过一个预定义的HTTP(S)代理服务器,可以配置一个Tor客户在一起Privoxy(或类似的)在机器上解释Tor安装指南,使用一个开关--tor和sqlmap将尝试自动设置Tor代理连接设置
• 设定超时时间
◦ 参数:--timeout
◦ 可以设定一个HTTP(S)请求超时多久判定为超时,10.5表示10.5s,默认为30s
• 设定重试超时
◦ 参数:--retries
◦ 当HTTP(S)超时时,可以设定重新尝试连接次数,默认为3次
• 设定随机改变的参数值
◦ 参数:--randomize
◦ 可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样
• 利用正则过滤目标网址
◦ 参数:--scope
◦ sqlmap -l burp.log--scope="(www)?\.target\.(com|net/org)"
• 避免过多的错误请求被屏蔽
◦ 参数:--safe-url,--safe-freq
◦ 有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqimap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法避免过多的错误请求被屏蔽进行
◦
▪ 1、--safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
▪ 2、--safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接
• 使用SSL/HTTPS
◦ 参数:--force-ssl
◦ 如果用户想要强迫使用SSL/HTTPS请求向目标,可以使用此参数
• 关掉URL参数值编码
◦ 参数:--skip-urlencode
◦ 根据参数位置,他的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用--skip-urlencode参数
• 每次请求时候执行自定义的python代码
◦ 参数:--eval
◦ 在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用--eval参数在每次请求时根据所写python代码做完修改后请求。
◦ sqlmap -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b"--eval="importhashlib;hash=hashlib.md5(id).hexdigest()”
▪ 4.优化
• 收集优化
◦ 参数:-o
◦ 这个参数是一个别名.隐式地设置以下选项和交换机:收集优化--keep-alive--null-connection--threads=3如果没有设置为较高的值
• 输出预测
◦ 参数:--predict-output
◦ 这是用于推理算法顺序检索的值的字符统计预测
• HTTP活动
◦ 参数:--keep-alive
◦ 指示sqlmap HTTP(s)使用持久连接。
• HTTP空连接
◦ 参数:--null-connection
◦ 可以用在盲目注入技术来区分True从False响应
• 并发HTTP(S)请求
◦ 参数:--threads
◦ 可以指定并发HTTP(S)请求的最大数量,并发请求的最大数量设置10原因是网站性能和可靠性
▪ 5.探测
• 测试参数
◦ 参数:-p,--skip
◦ 当你使用--level的值很大但是有个别参数不想测试的时候可以使用--skip参数。例如:--skip="user-angent.referer"
• URI注入点
◦ 参数:-u
◦ sqlmap -u "http://targeturl/param1/valuel*/param2/value2/*
• 指定数据库
◦ 参数:--dbms
◦ 默认情况系sqlmap会自动的探测web应用后端的数据库是什么
• 风险等级
◦ 参数:--risk
◦ 共有四个风险等级
▪ 默认是1会测试大部分的测试语句
▪ 2会增加基于事件的测试语句
▪ 3会增加OR语句的SQL注入测试
▪
• 页面比较
◦ 参数:--string,--not-string.--regexp.--code
◦ 参数:--text-only,--titles
◦ 在默认情况下的区别True查询的False(粗糙概念boolean-based盲目SQL注入漏洞)是通过比较注入请求页面内容与原不注射页面内容
▪ 6.注入技术
• 测试是否是注入
◦ 参数:--technique
◦
▪ 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(基于时间延迟注入)
• 设定延迟注入的时间
◦ 参数:--time-sec
◦ 当使用继续时间的盲注时,时刻使用--time-sec参数设定延迟时间,默认是5秒
• 设定UNION查询字段数
◦ 参数:--union-cols
◦ 默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当--level为5的时候他会增加测试到50个字段数。设定--union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。
• 设定UNION查询使用的字符
◦ 参数:--union-char
◦ 默认情况下sqimap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用--union-char只定UNION查询的字符。
• DNS泄漏攻击
◦ 参数:--dns-domain
◦ 如果用户是控制一台机器注册为DNS域服务器(例如域attacker.com他可以打开使用这个选项
• 二阶SQL注入
◦ 参数:--second-order
◦ 有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。--second-order后面跟一个判断页面的URL地址。
▪ 7.指纹
• 数据库管理系统指纹
◦ 参数:-f或--fingerprint
◦ sqlmap指纹后端数据库管理系统和继续注入通过了解SQL语法,方言和查询使用来进行数据库的攻击范围内的体系结构
▪ 8.列数据
• 标志
◦ 参数:-b,--banner
◦ 大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。
• 用户
◦ 参数:-current-user
◦ 在大多数据库中可以获取到管理数据的用户。
• 当前数据库
◦ 参数:--current-db
◦ 返还当前连接的数据库
• 当前用户是否为管理用
◦ 参数:--is-dba
◦ 判断当前的用户是否为管理,是的话会返回True
• 列数据库管理用户
◦ 参数:--users
◦ 当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户
• 列出并破解数据库用户的hash
◦ 参数:--passwords
◦ 当前用户有权限读取包含用户密码表的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解
◦ sqlmap -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v1
◦ 也可以提供-U参数来指定爆破哪个用户的hash
• 列出数据库管理员权限
◦ 参数:--privileges
◦ 当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。
• 列出数据库管理员角色
◦ 参数:--roles
◦ 当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色
◦ 仅适用于当前数据库是Oracle的时候
• 列出数据库系统的数据库
◦ 参数:--dbs
◦ 当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库
• 列举数据库表
◦ 参数:--tables,--exclude-sysdbs,-D
◦ 如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所列举数据库表
◦ --exclude-sysdbs参数是指包含了所有的系统数据库
◦ 需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称
• 列举数据库表中的字段
◦ 参数:--columns,-C,-T-D
◦ 如果没有使用-D参数指定数据库时,默认会使用当前数据库
• 列举数据库系统的架构
◦ 参数:--schema,--exclude-sysdbs
◦ 用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型
◦ 加上--exclude-sysdbs参数,将不会获取数据库自带的系统库内容
• 获取表中数据个数
◦ 参数:--count
◦ 有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数
• 获取整个表的数据
◦ 参数:--dump,-C,-T,-D,--start,--stop,--first,--last
◦ 如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容
◦ 使用-D,-T参数指定想要获取哪个库的哪个表,不适用-D参数时,默认使用当前库
◦ 可以获取指定库中的所有表的内容,只用-dump跟-D参数(不使用-T与-C参数)
• 获取所有数据库表的内容
◦ 参数:--dump-all,--exclude-sysdbs
◦ 使用--dump-all参数获取所有数据库表的内容,可同时加上--exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它
• 搜索字段,表,数据库
◦ 参数:--search,-C,-T,-D
◦ --search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中搜索字段,表,数据库的特定字段
◦
▪ -C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名
▪ -T后跟着用逗号分刮的表名,将会在所有数据库中搜索指定的表名
▪ -D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名
• 运行自定义的SQL语句
◦ 参数:--sql-query,--sql-shell
◦ 如果是SELECT查询语句,sqlmap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句
▪ 9.爆破
• 暴力破解表名
◦ 参数:--common-tables
◦ 当使用--tables无法获取到数据库的表时,可以使用此参数
• 暴力破解列名
◦ 参数:--common-columns
◦ 与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中
▪ 10.用户定义函数注入
• 用户自定义函数(UDF)
◦ 参数:--udf-inject,--shared-lib
◦ 你可以通过编译MySQL注入你自定义的函数(UDFs)或PostgreSQL在windows中共享库,DLL,或者Linux/Unix中共享对象,sqlmap将会问你一些问题,上传到服务器数据库自定义函数,然后根据你的选择执行他们,当你注入完成后,sqlmap将会移除它们
▪ 11.系统文件操作
• 从数据库服务器中读取文件
◦ 参数:--file-read
◦ 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件
• 把文件上传到数据库服务器中
◦ 参数:--file-write,--file-dest
◦ 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数,上传的文件可以是文本也可以是二进制文件
▪ 12.操作系统
• 运行任意操作系统命令
◦ 参数:--os-cmd
◦ 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数
◦ 在MySQL,PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eva()
• 写入真实的shell
◦ 参数:--os-shell
◦ 网站绝对路径
◦
▪ 1、ASP
▪ 2、ASP.NET
▪ 3、JSP
▪ 4、PHP
• Meterpreter配合使用
◦ 参数:--os-pwn,--os-smbrelay.--os-bof,--priv-esc,--msf-path,--tmp-path
◦
▪ 1、通过用户自定义的sys_bineval()函数在内存中执行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:--os-pwn
▪ 2、通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:--os-pwn
▪ 3、通过SMB攻击(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Window是Administrator),--os-smbrelay
▪ 4、通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:--os-bof
▪ 12.对Windows注册表操作
• 读取注册表值
◦ 参数:--reg-read
• 写入注册表值
◦ 参数:--reg-add
• 删除注册表值
◦ 参数:--reg-del
• 注册表辅助选项
◦ 参数:--reg-key,--reg-value,--reg-data, --reg-type
▪ 13.其他参数
• 使用参数缩写
◦ 参数:-z
◦ 有的使用参数太长复杂,可以使用缩写模式
• 成功SQL注入时警告
◦ 参数:--alert
• 设定会发的答案
◦ 参数:--answers
◦ 当希望sqlmap提出输入时,自动输入自己想要的答案可以使用此参数
• 发现SQL注入时发出的蜂鸣声
◦ 参数:--beep
◦ 发现sql注入时,发出蜂鸣声
• 启发式检测WAF/IPS/IDS保护
◦ 参数:--check-waf
◦ WAF/ISP/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试,slqmap将会使用一个不存在的参数来注入测试
• 清理sqlmap的UDF(s)和表
◦ 参数:--cleanup
◦ 清除sqlmap注入时产生的udf与表
• 禁用彩色输出
◦ 参数:--disable-coloring
◦ sqlmap默认彩色输出,可以使用此参数,禁掉彩色输出
• 使用指定的Google结果页面
◦ 参数:--gpage
◦ 默认sqlmap使用前100个URL地址作为注入测试,结合此选项,可以指定页面的URL测试
• 使用HTTP参数污染
◦ 参数:-hpp
◦ HTTP参数污染可能会绕过WAF/IPS/IDS保护机制,这个对ASP/IIS与ASP.NET/IIS平台很有效
• 测试WAF/IPS/IDS保护
◦ 参数:--identify-waf
◦ sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别
• 模仿智能手机
◦ 参数:--mobile
◦ 有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆
• 安全的删除output目录的文件
◦ 参数:--purge-output
◦ 有时需要删除结果文件,而不被恢复,可以使用此参数,原有文件将会被随机的一些文件覆盖
• 启发式判断注入
◦ 参数:--smart
◦ 有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数
• 选择测试的有效载荷/标题
◦ 参数:--test-filter
◦ 如果你想过滤测试的有效载荷和/或标题你可以使用这个选项。 例如,如果您想要测试所有的有效载荷ROW关键字,您可以使用--test-filter=ROW
• 初级用户向导参数
◦ 参数:--wizard
◦ 面向初级用户的参数,可以一步一步教你如何输入针对目标注入
- Author:KingCode
- URL:https://kingcode.dpdns.org/article/fe22deb2-787c-4702-bd1e-35ee91a5b87f
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!









