关于sqlmap当中tamper脚本编码绕过原理的一些总结(学习python没多久有些地方肯定理解有些小问题)
sqlmap中tamper脚本分析编写
置十对一些编码实现的脚本,很多sqlmap里面需要引用的无法实现,所以有一部分例如keywords就只写写了几个引用了一下,其实这里很多脚本运用是可以绕过安全狗的。本人也是刚开始学习python没多久,有一些错误的话请指正
chardoubleencode.py:对给定的payload全部字符使用双重url编码:
import string
import sys payload= sys.argv[1] urlencode= payload if payload:
urlencode=" "
i=0
while i< len(payload):
if payload[i] == '%'and payload in string.hexdigits[i+1:i+2] and payload in string.hexdigits[i+2:i+3] and (i < len(payload)-2) :
urlencode += '%%25%s' % payload[i + 1:i + 3]
i+=3
else:
urlencode += '%%25%.X' % ord(payload[i])
i+=1
print urlencode
apostrophenullencode.py:用非法双字节Unicode字符替换单引号
import string
import sys
payload= sys.argv[1]
payload=payload.replace('\'', "%00%27") if payload else payload
print payload
appendnullbyte.py:在有效载荷的结束位置加载null字节字符编码
import string
import sys
payload= sys.argv[1]
print "%s%%00" % payload if payload else payload
space2morehash.py:将空格替换为#,并添加一个随机字符串和换行符
#coding:utf-8
import requests
import random
import string
import sys
i=0
retVal=' '
payload ="SDSDS SDFcxfdf &*(tygv #djlsj d "
if payload:
for i in xrange(len(payload)):
if payload[i].isspace():
randomStr = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase)for _ in xrange(random.randint(6, 11)))
retVal += "%%23%s%%0A" % randomStr
elif payload[i] == '#' or payload[i:i + 3] == '-- ': #对于我们原本的注释语句当中后面的就不做注释符加换行符的操作了直接照加了。
retVal += payload[i:]
break
else:
retVal += payload[i] #文本照加
print retVal
bluecoat.py:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换=
def process(match):
word = match.group('word')
if word.upper() in kb.keywords:
return match.group().replace(word, "%s%%09" % word)
else:
return match.group() retVal = payload if payload:
retVal = re.sub(r"\b(?P[A-Z_]+)(?=[^\w(]|\Z)", lambda match: process(match), retVal)
retVal = re.sub(r"\s*=\s*", " LIKE ", retVal)
retVal = retVal.replace("%09 ", "%09") return retVal
附:匿名函数lambda:
1. 将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
2. 将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。
3. 将lambda函数作为参数传递给其他函数。
4. 将lambda函数作为其他函数的返回值,返回给调用者。
>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>> print reduce(lambda x, y: x + y, foo)
139
附:python当中的group,match:
group:group()在正则表达式中用于获取分段截获的字符串.
#coding:utf-8 import re content = 'Hello 123456789 Word_This is just a test 666 Test'
result = re.match('^Hello\s(\d+).*?(\d+)\sTest', content) # 注意(\d+) 有括号,+号表示匹配一次或多次 print(result)
print(result.group()) # print(result.group(0)) 同样效果
print(result.groups()) print(result.span())
print(result.group(2)) result:
C:\Python27\python.exe C:/Users/Dell/PycharmProjects/pythonstudy/test.py
<_sre.SRE_Match object at 0x00000000030B7ED0>
Hello 123456789 Word_This is just a test 666 Test
('123456789', '666')
(0, 49)
666
space2mysqldash.py:将空格替换为 -- ,并追随一个换行符
#coding:utf-8
import string
import random payload='fff dddd sds'
retVal = "" if payload:
for i in xrange(len(payload)):
if payload[i].isspace():
retVal += "--%0A"
elif payload[i] == '#' or payload[i:i + 3] == '-- ':
retVal += payload[i:]
break
else:
retVal += payload[i] print retVal
re的sub模块
re是regular expression的所写,表示正则表达式,sub是substitute的所写,表示替换; re.sub是个正则表达式方面的函数,用来实现通过正则表达式,实现比普通字符串
re.sub共有五个参数,其中三个必选参数:pattern, repl, string,两个可选参数:count, flags. pattern参数:反斜杠加数字(\N),则对应着匹配的组(matched group),比如\6,表示匹配前面pattern中的第6个group
#coding:utf-8
import string
import random
import re
inputStr = "hello crifan, nihao crifan"
replacedStr = re.sub(r"hello (\w+), nihao \1", "crifanli", inputStr)
#此句中 r 表示去掉反斜杠的转义机制
print ("replacedStr=",replacedStr) #crifanli C:\Python27\python.exe C:/Users/Dell/PycharmProjects/pythonstudy/白帽课程/test2.py
('replacedStr=', 'crifanli')
在此处我们利用re.sub把整个字符串,换成crifanli,这里的反斜杠加数字(\N),表示对应着匹配的组(matched group),即我们第一个\w。 repl参数:如果repl是字符串的话,其中的任何反斜杠转义字符,都会被处理的,例如\n:会被处理为对应的换行符;\r:会被处理为回车符;
#coding:utf-8
import string
import random
import re
inputStr = "hello crifan, nihao crifan"
replacedStr = re.sub(r"hello (\w+), (\w+) \1", "\g", inputStr)
print("replacedStr =",replacedStr) #crifan C:\Python27\python.exe C:/Users/Dell/PycharmProjects/pythonstudy/白帽课程/test2.py
('replacedStr =', 'nihao') #coding:utf-8
import string
import random
import re
inputStr = "hello crifan, nihao crifan"
replacedStr = re.sub(r"hello (\w+), (\w+) \1", "\g", inputStr)
print("replacedStr =",replacedStr) #crifan C:\Python27\python.exe C:/Users/Dell/PycharmProjects/pythonstudy/白帽课程/test2.py
('replacedStr =', 'crifan')
对应的带命名的组(named group)的版本是:
#coding:utf-8
import string
import random
import re
inputStr = "hello crifan, nihao crifan"
replacedStr = re.sub(r"hello (?P\w+), (\w+) (?P=xss)", "\g \g", inputStr)
print("replacedStr =",replacedStr) #crifan
当repl是函数的时候:
import re def pythonReSubDemo():
"""
demo Pyton re.sub
"""
inputStr = "hello 123 world 456" def _add111(matched): #match可以使我们自己定义一个参数
intStr = matched.group("number") #匹配到的是123
intValue = int(intStr)
addedValue = intValue + 111 #234
addedValueStr = str(addedValue) #转换为字符串形式
return addedValueStr replacedStr = re.sub("(?P\d+)", _add111, inputStr) #这里匹配的是number即数字,上个sqlmap的脚本我们匹配到的是word即单词
print("replacedStr=",replacedStr)#hello 234 world 567 if __name__=="__main__":
pythonReSubDemo() string参数:表示要被处理,要被替换的那个string字符串。 count:
versionedkeywords.py:内敛注释绕过
import re payload=' 1 and 1=1 union select * from admin'
keywords=['AND','UNION','SELECT','ADMIN','FROM']
def process(match):
word = match.group('word')
if word.upper() in keywords:
return match.group().replace(word, "/*!%s*/" % word)
else:
return match.group() retVal = payload if payload:
retVal = re.sub(r"(?<=\W)(?P[A-Za-z_]+)(?=[^\w(]|\Z)", lambda match: process(match), retVal)
retVal = retVal.replace(" /*!", "/*!").replace("*/ ", "*/") print retVal
space2mysqlblank.py:将空格替换为其他空格符号('%09', '%0A', '%0C', '%0D', '%0B')
#coding:utf-8
import re
import random
payload='dfsdsfsd 87686fg dsfsf\" "\\ dzfs a'
blanks = ('%09', '%0A', '%0C', '%0D', '%0B')
retVal = payload if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False for i in xrange(len(payload)):
if not firstspace: #就是TRUE的意思,可以继续进行下面的if判断
if payload[i].isspace():
firstspace = True #如果为空那么就会设置为TRUE,继续进行循环
retVal += random.choice(blanks)
continue elif payload[i] == '\'':
quote = not quote #这里是前面我们设定了quote是false,在第一次遇到\的时候就会变成TRUE,第二次完成闭合的时候就会返回为False。 elif payload[i] == '"':
doublequote = not doublequote elif payload[i] == " " and not doublequote and not quote: #当我们满足上面两个条件任意一个之后,那么此时他们都是TRUE,not true 自然就是False,所以在双引号,斜杠当中的空格是不会被随机字符替换的。
retVal += random.choice(blanks)
continue retVal += payload[i] print retVal
equaltolike.py:将>替换为GREATEST,绕过对>的过
retVal = payload if payload:
retVal = re.sub(r"\s*=\s*", " LIKE ", retVal) return retVal
charunicodeencode.py:适用字符串的unicode编码
import string payload='union select * from admin and 1=1'
retVal = payload if payload:
retVal = ""
i = 0 while i < len(payload):
if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits:
retVal += "%%u00%s" % payload[i + 1:i + 3]
i += 3
else:
retVal += '%%u%.4X' % ord(payload[i])
i += 1
print retVal
charencode.py:url编码
import string
payload='union select * from admin and 1=1'
retVal = payload if payload:
retVal = ""
i = 0 while i < len(payload):
if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits:
retVal += payload[i:i + 3]
i += 3
else:
retVal += '%%%.2X' % ord(payload[i])
i += 1 print retVal
randomcase.py:随机大小写
#coding:utf-8
import random
import re
keywords=['']
payload='union select * from admin and 1=1 '
retVal = payload if payload:
for match in re.finditer(r"[A-Za-z_]+", retVal): #把所有的符合匹配的组都找了出来
word = match.group()
print word
if word.upper() in keywords:
while True:
_ = "" for i in xrange(len(word)):
_ += word[i].upper() if randomRange(0, 1) else word[i].lower() if len(_) > 1 and _ not in (_.lower(), _.upper()):
break retVal = retVal.replace(word, _) print retVal
re.finditer与re.findall模块
re.findall()如果可以匹配返回的是一个列表,re.finditer()返回的是一个迭代器,需要对其进行遍历,才能获取数据。
import re def main():
content = '八神是我的好朋友,他的手机电话是18381665314, 他的QQ是1911966573, 他女朋友的电话是18381665315, QQ:1911966574 !'
regex = re.compile(r'\d{11}')
tels = regex.findall(content)
print(tels) if __name__ == '__main__':
main()
# ['18381665314', '18381665315']
percentage.py:asp允许每个字符前面添加一个%号
import string
payload='union select * from admin and 1=1 '
if payload:
retVal = ""
i = 0 while i < len(payload):
if payload[i] == '%' and (i < len(payload) - 2) and payload[i + 1:i + 2] in string.hexdigits and payload[i + 2:i + 3] in string.hexdigits:
retVal += payload[i:i + 3]
i += 3
elif payload[i] != ' ':
retVal += '%%%s' % payload[i]
i += 1
else:
retVal += payload[i]
i += 1 print retVal
modsecurityversioned.py:过滤空格,包含完整的查询版本注释
#coding:utf-8
import random
payload='union select * from admin and 1=1 -- skdh '
retVal = payload if payload:
postfix = ''
for comment in ('#', '--', '/*'):
if comment in payload:
postfix = payload[payload.find(comment):] #锁定到了注释符之前的位置,在这之后的都归为注释内容
print postfix
payload = payload[:payload.find(comment)] #锁定到了第一个注释符的元素位置,在前面的都归为payload
print payload
break
if ' ' in payload:
retVal = "%s /*!30%s%s*/%s" % (payload[:payload.find(' ')], '444', payload[payload.find(' ') + 1:], postfix)
#最后一个就是当我们遇到注释符号之后就拍出在版本绕过之外了,第二个就是一个随机数但是在这里我把它设为了一个固定的数字,第三个 print retVal
关于sqlmap当中tamper脚本编码绕过原理的一些总结(学习python没多久有些地方肯定理解有些小问题)的更多相关文章
- 使用sqlmap中tamper脚本绕过waf
使用sqlmap中tamper脚本绕过waf 刘海哥 · 2015/02/02 11:26 0x00 背景 sqlmap中的tamper脚本来对目标进行更高效的攻击. 由于乌云知识库少了sqlmap- ...
- sqlmap中tamper脚本绕过waf
0x00 背景 sqlmap中的tamper脚本来对目标进行更高效的攻击. 由于乌云知识库少了sqlmap-tamper 收集一下,方便学习. 根据sqlmap中的tamper脚本可以学习过绕过一些技 ...
- 【渗透实战】sqlmap_修改tamper脚本_绕过WAF_第三期
/文章作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334/ 今天google找注入点的时候发现某企业一个挺有意思的waf 常规操作绕过去后决定写一篇博客 信息收集 ...
- 使用sqlmap中的tamper脚本绕过waf
使用sqlmap中tamper脚本绕过waf 脚本名:0x2char.py 作用:用UTF-8全角对应字符替换撇号字符 作用:用等价的CONCAT(CHAR(),...)对应替换每个(MySQL)0x ...
- sqlmap tamper脚本备忘录与tamper脚本编写
查看sqlmap全部脚本 $ python sqlmap.py --list-tampers 使用方法 --tamper=TAMPER 2019.9更新后翻译 * apostrophemask.py- ...
- 【奇淫巧技】sqlmap绕过过滤的tamper脚本分类汇总
sqlmap绕过过滤的tamper脚本分类汇总
- sqlmap tamper脚本
本文来自:SQLmap tamper脚本注释, 更新了一些脚本,<<不断更新中>> 目前已经总共有50+的脚本,故对源文章进行更新... sqlmap-master ls -l ...
- (四)SQLMap之Tamper篡改脚本的类型、作用、适用场景
目录结构 一.SQLMap中tamper的简介 1.tamper的作用 2.tamper用法 二.适配不同数据库类型的测试tamper 三.SQLMap中tamper篡改脚本的功能解释 一.SQLMa ...
- sqlmap的常用tamper脚本
sqlmap下的tamper目录存放绕过WAF脚本 使用方法 --tamper 脚本名称,脚本名称 多个tamper脚本之间用空格隔开 apostrophemask.py 用utf8代替引号 equa ...
随机推荐
- rcp
rcp的命令 rcp,远程文件复制.rcp既可以在本地主机和远程主机之间进行文件复制,也可以用于在两个远程主机之间进行文件复制.除了复制文件外,rcp也可以用于目录复制,只需要加参数-r. rcp的命 ...
- Hop: Heterogeneity-aware Decentralized Training
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. ASPLOS 2019 Abstract 最近的研究表明,在机器学习的背景下,去中心化算 ...
- Vue基础(一)---- 模板语法
1.基本理解 Vue其实是一个渐进式JavaScript框架,封装好了一些方法,不再需要操作通过操作DOM,在相同的目标下能够更快的编写代码. 声明式渲染→组件系统→客户端路由→集中式状态管理→项目构 ...
- Google Analytics谷歌分析事件之非互动事件
非互动事件官方的解释如下 “非互动”一词是指可选的布尔值参数,此参数可以传递到用于发送事件命中的方法.通过此参数,您可以确定要如何为网站上包含事件衡量的网页定义跳出率.例如,假设您的首页上内嵌有一个视 ...
- Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储
一,引言 上一篇文章,我们介绍到在实际项目中系统会产生大量的日志文件,用户上传的头像等等,同时也介绍到可以使用Azure Blob Storage 来存储项目中的一些日志文件,用户头像,用户视频等等. ...
- Java反射(一)
什么是反射? 在程序的运行过程中,可以动态的创建对象. 反射的基石是什么? 字节码对象是反射的基石.字节码对象:Java类文件通过javac进行编译后生成的xxx.class文件,此文件由jvm加载至 ...
- js reduce
数组对象求和 let books = [ { id: 100, name: '红楼梦', price: 100 }, { id: 101, name: '西游记', price: 150 }, { i ...
- OpenvSwitch系列之七 meter表限速
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...
- 【Go语言入门系列】(九)写这些就是为了搞懂怎么用接口
[Go语言入门系列]前面的文章: [Go语言入门系列](六)再探函数 [Go语言入门系列](七)如何使用Go的方法? [Go语言入门系列](八)Go语言是不是面向对象语言? 1. 引入例子 如果你使用 ...
- 【API进阶之路】用API打造一条自动化内容生产流水线
摘要:搞定了内容审核之后,我又把抓取工具.内容审核API.文本摘要生成API串联在一起,从抓到审再到编,建立了一条自动化的内容生产流水线,编辑团队只需要做优质内容的推荐就可以了. 上周,运营部将官网上 ...