1.target :目标
目标URL
参数:-u或者--url 格式:http(s)://targeturl[:port]/[…] 例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users
从Burp或者WebScarab代理中获取日志 参数:-l 可以直接吧Burp proxy或者WebScarab proxy中的日志直接导出来交给sqlmap来一个一个检测是否有 注入。
从文本中获取多个目标扫描 参数:-m 文件中保存url,sqlmap会一个一个检测
从文件中加载HTTP请求 参数:-r sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie, POST数据,等等)。 比如文本文件内如下:
POST/students.php HTTP/1.1 Host:www.magedu.com User-Agent:Mozilla/4.0 id=1 当请求是HTTPS的时候,需要配合--force-ssl参数来使用,或者可以在Host头后面加上:443
处理Google的搜索结果 参数:-g sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果)。 例子: python sqlmap.py -g "inurl:\".php?id=1\""
2.request:请求设置
参数:--data 此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST参数。 例子: python sqlmap.py -u "http://www.magedu.com/students.php" --data="id=1" -f -- banner --dbs --users
利用正则过滤目标网址 参数:--scope 例如: python sqlmap.py -l burp_http.log --scope="(www)?\.target\.(com|net|org)" 避免过多的错误请求被屏蔽 参数:--safe-url,--safe-freq 有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或 者注入的时候可能造成错误请求而触发这个策略,导致后续无法进行测试。 绕过这个策略有两种方式: --safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。 --safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一遍安全连接。
每次请求时候执行自定义的python代码 参数:--eval 在有些时候,需要根据某个参数的变化,而修改另一个参数,才能形成正常的请求,这时可以用--eval 参数在每次请求时根据所写python代码做完修改后请求。 例子: python sqlmap.py -u "http://www.target.com/vuln.php? id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()" 上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。
3.Optimization:优化
-o 开启所有优化开关
4.Injection:注入
测试参数 参数:-p, --skip sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头的 值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想 要测试的参数。 例如: -p "id,user-anget" 当你使用--level的值很大但是有个别参数不想测试的时候可以使用--skip参数。 例如:--skip="user-agent,referer" 在有些时候web服务器使用了伪静态,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面 加* 例如: python sqlmap.py -u "http://magedu/param1/value1*/param2/value2/" sqlmap将会测试value1的位置是否可注入。
指定数据库服务器系统 参数:--os 默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。
指定大数字来使值无效 参数:--invalid-bignum 当你想指定一个报错的数值时,可以使用这个参数,例如id=13,sqlmap默认会取负值变成id=-13来报 错,你可以指定比如id=9999999来报错。
指定逻辑运算来使值无效 参数:--invalid-logical 原因同上,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19。
注入payload 参数:--prefix, --suffix 在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。 例如,代码中是这样调用数据库的: $query="SELECT * FROM users WHERE id=(’".$_GET[’id’]."’) LIMIT 0, 1"; 这时你就需要--prefix和--suffix参数了: 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语句变成: $query="SELECT * FROM users WHERE id=(’1’) PAYLOAD AND (’abc’=’abc’) LIMIT 0, 1";
5.Detection:探测等级
探测等级 参数:--level 共有五个等级,默认为1,最大为5,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可 以根据相应的格式添加自己的payload。 这个参数不仅影响使用哪些payload,同时也会影响测试的注入点,GET和POST的数据都会测试, HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。 总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。
风险等级 参数:--risk 共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句 的SQL注入测试。 在有些时候,例如在UPDATE/DELETE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可 能造成很大的风险。 测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。
页面比较 参数:--string,--not-string,--regexp,--code 默认情况下sqlmap通过判断返回页面的不同来判断真假,但有时候这会产生误差,因为有的页面在每 次刷新的时候都会返回不同的代码,比如页面当中包含一个动态的广告或者其他内容,这会导致 sqlmap的误判。 此时用户可以提供一个字符串或者一段正则匹配,在原始页面与真条件下的页面都存在的字符串,而错 误页面中不存在的字符串(使用--string参数添加字符串,--regexp添加正则),同时用户也可以提供一 段在原始页面与真条件下的页面都不存在的字符串,而错误页面中存在的字符串(--not-string添加)。 用户也可以提供真与假条件返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的 时候为假,可以添加参数--code=200。 参数:--text-only,--titles 有些时候用户知道真条件下的返回页面与假条件下返回页面的不同位置在哪里,可以使用--textonly(HTTP响应体中不同)--titles(HTML的title标签中不同)。
6.Fingerprint:指纹
-f, --fingerprint 执行检查广泛的DBMS版本指纹
设定延迟注入的时间 参数:--time-sec 当使用时间盲注时,时刻使用--time-sec参数设定延时时间,默认是5秒。
设定UNION查询字段数 参数:--union-cols 默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当--level为5的时候他会增加测试到50个 字段数。设定--union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。
设定UNION查询使用的字符 参数:--union-char 默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而 一个随机整数是成功的,这是你可以用--union-char只定UNION查询的字符。
二阶SQL注入 参数:--second-order 有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要 你指定到哪个页面获取响应判断真假。--second-order后面跟一个判断页面的URL地址。
7.Enumeration:枚举数据
-a, --all 获取所有信息 -b, --banner 获取数据库管理系统的标识 --current-user 获取数据库管理系统当前用户 --current-db 获取数据库管理系统当前数据库 --hostname 获取数据库服务器的主机名称 --is-dba 检测DBMS当前用户是否DBA(数据库管理员) --users 枚举数据库管理系统用户 --passwords 枚举数据库管理系统用户密码哈希 --privileges 枚举数据库管理系统用户的权限 --roles 枚举数据库管理系统用户的角色 --dbs 枚举数据库管理系统数据库 --tables 枚举的DBMS数据库中的表 --columns 枚举DBMS数据库表列 --schema 枚举数据库架构 --count 检索表的项目数 --dump 转储数据库表项,即下载 --dump-all 转储数据库所有表项 --search 搜索列(S),表(S)和/或数据库名称(S) --comments 获取DBMS注释 -D DB 要进行枚举的指定数据库名 -T TBL DBMS数据库表枚举 -C COL DBMS数据库表列枚举 -X EXCLUDECOL DBMS数据库表不进行枚举 -U USER 用来进行枚举的数据库用户 --exclude-sysdbs 枚举表时排除系统数据库 --pivot-column=P.. Pivot columnname --where=DUMPWHERE Use WHEREcondition while table dumping --start=LIMITSTART 获取第一个查询输出数据位置 --stop=LIMITSTOP 获取最后查询的输出数据 --first=FIRSTCHAR 第一个查询输出字的字符获取 --last=LASTCHAR 最后查询的输出字字符获取 --sql-query=QUERY 要执行的SQL语句 --sql-shell 提示交互式SQL的shell --sql-file=SQLFILE 要执行的SQL文件
标志 参数:-b,--banner 大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量 @@version,这主要取决于是什么数据库。
当前用户 参数:-current-user 在大多数据库中可以获取到管理数据的用户。
当前数据库 参数:--current-db 返还当前连接的数据库。
当前用户是否为管理员 参数:--is-dba 判断当前的用户是否为管理员,是的话会返回True。
列数据库管理用户 参数:--users 当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。
列出并破解数据库用户的hash 参数:--passwords 当前用户有权限读取包含用户密码的表的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破 解。 python sqlmap.py -u "http://magedu/sqlmap/pgsql/students.php?id=1" --passwords - v1
列出数据库管理员权限 参数:--privileges 当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你 哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。
列出数据库管理员角色 参数:--roles 当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定 你想看哪个用户的角色。 仅适用于当前数据库是Oracle的时候。
列出数据库系统的数据库 参数:--dbs 当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。
列举数据库表 参数:--tables,--exclude-sysdbs,-D 当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。 如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。 --exclude-sysdbs参数是指可排除系统数据库。 需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。
列举数据库表中的字段 参数:--columns,-C,-T,-D 当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会 列出字段的数据类型。 如果没有使用-D参数指定数据库时,默认会使用当前数据库
8.Brute force:爆破
--common-tables 检查存在共同表 --common-columns 检查存在共同列 User-defined function injection(用户自定义函数注入): --udf-inject 注入用户自定义函数 --shared-lib=SHLIB 共享库的本地路径
9.File system access:访问文件系统
从数据库服务器中读取文件 参数:--file-read 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读 取的文件可以是文本也可以是二进制文件。 python sqlmap.py -u "http://127.0.0.1:8080/vulnerabilities/sqli/? id=1&Submit=Submit#" --cookie="PHPSESSID=isgvp2rv4uts46jbkb9bouq6ir; security=low" -p id --file-read "/etc/passwd"
把文件上传到数据库服务器中 参数:--file-write,--file-dest 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。上 传的文件可以是文本也可以是二进制文件。 python sqlmap.py -u "http://127.0.0.1:8080/vulnerabilities/sqli/? id=1&Submit=Submit#" --cookie="PHPSESSID=isgvp2rv4uts46jbkb9bouq6ir; security=low" -p id --file-write="/opt/test_code/user.txt" --filedest="/var/www/html/user.txt"
10.Operating system access:访问操作系统
获取整个表的数据 参数:--dump,-C,-T,-D,--start,--stop,--first,--last 如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取整个表的所有内容。 使用-D,-T参数指定想要获取哪个库的哪个表,不使用-D参数时,默认使用当前库。 可以获取指定库中的所有表的内容,只用-dump跟-D参数(不使用-T与-C参数)。也可以用-dump跟-C 获取指定的字段内容。 sqlmap为每个表生成了一个CSV文件。 如果你只想获取一段数据,可以使用--start和--stop参数,例如,你只想获取第一段数据可使用--stop 1,如果想获取第二段与第三段数据,使用参数 --start 1 --stop 3。 也可以用--first与--last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中第三个字符到 第五个字符的内容,使用--first 3 --last 5,只在盲注的时候使用,因为其他方式可以准确的获取注入内 容,不需要一个字符一个字符的猜解。
获取所有数据库表的内容 参数:--dump-all,--exclude-sysdbs 使用--dump-all参数获取所有数据库表的内容,可同时加上--exclude-sysdbs排除系统数据库,只获取 用户数据库的表,即业务数据。
搜索字段,表,数据库 参数:--search,-C,-T,-D --search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。 可以在以下三种情况下使用: -C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。 -T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名 -D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。
运行自定义的SQL语句 参数:--sql-query,--sql-shell sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。 如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持 多语句执行SQL语句。 $python sqlmap.py -u "http://127.0.0.1:8080/vulnerabilities/sqli/? id=1&Submit=Submit#" --sql-query "SELECT 'magedu'" -v1
运行任意操作系统命令 参数:--os-cmd,--os-shell python sqlmap.py -u "127.0.0.1:8080/vulnerabilities/sqli/?id=1&Submit=Submit#" - -cookie="PHPSESSID=isgvp2rv4uts46jbkb9bouq6ir; security=low" -p id --os-cmd id 用--os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。 当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO OUTFILE 写进可写目录,来创建一个web后门。支持的语言: 1、ASP 2、ASP.NET 3、JSP 4、PHP
爬行网站URL 参数:--crawl sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度。 例子: python sqlmap.py -u "http://127.0.0.1:8080/vulnerabilities/sqli/? id=1&Submit=Submit#" --batch --crawl=3
规定输出到CSV中的分隔符 参数:--csv-del 当dump保存为CSV格式时(--dump-format=CSV),需要一个分隔符,默认是逗号,用户也可以改为 别的。如:--csv-del=";"
定义dump数据的格式 参数:--dump-format 输出的格式可定义为:CSV,HTML,SQLITE
忽略在会话文件中存储的查询结果 参数:--fresh-queries 忽略session文件保存的查询,重新查询。
自定义输出的路径 参数:--output-dir sqlmap默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径 例如:-- output-dir=/tmp
测试WAF/IPS/IDS保护(已过时) 参数:--identify-waf sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别。
启发式判断注入 参数:--smart 有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使 用此参数
============================================================
--tamper:使用sqlmap自带的tamper(脚本),或者自己写的tamper,来混淆payload,通常用来绕过 waf和ips。
例如:
脚本名:apostrophemask.py 作用:用utf8代替引号 Example : ("1 AND '1'='1") '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'
脚本名:equaltolike.py 作用:like 代替等号 Example:
\* Input: SELECT * FROM users WHERE id=1 \* Output: SELECT * FROM users WHERE id LIKE 1
脚本名:space2dash.py 作用:绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串,一个换行符 Example:
('1 AND 9227=9227') '1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'
sqlmap中自带的脚本还有很多,就不一一赘述了